Программа TRSURF(X,Y,Z,N0,XV,YV,NODES,NET0,ISCR,SCRN,IDIM1,IDIM2,NET,IBOUND) управляет работой нескольких подпрограмм, с помощью которых находит последовательно треугольник за треугольником в области определения в том порядке, в каком соответствующие им элементы поверхности должны изображаться, проецирует эти элементы, рисует их с учетом текущего состояния экрана, изменяет экран. Если в процессе проведения вычислений число отрезков на одной экранной линии превысит заданную величину IDIM2, то выдается диагностическое сообщение об ошибке. Программа имеет следующие параметры:
- X,Y,Z
- массивы координат точек;
- N0
- количество точек;
- XV,YV
- координаты центра проекции;
- NODES
- массив указателей (длины (N0+1));
- NET0
- массив описателей сетки (длины 6 ´N0);
- ISCR,SCRN
- массивы описателей экрана (размером соответственно IDIM1 и (IDIM1,IDIM2,2));
- IDIM1
- количество экранных линий;
- IDIM2
- максимальное число отрезков на экранной линии;
- NET
- рабочий массив (длины 6 ´N0);
- IBOUND
- массив описателей условно видимых отрезков размером (2, N0).
Обращению к программе TRSURF должно предшествовать обращение к программе PREP, выполняющей ряд подготовительных операций.
Программа PREP(X,Y,Z,N0,XV,YV,ZV,XPL,YPL,ZPL,VX,VY,VZ,ISCR,IDIM1,RLYTOX) формирует матрицу однородных координат, с помощью которой будет выполняться проецирование, и устанавливает пределы изменения функции f(х, у) на картинной плоскости. Ее параметры:
- X,Y,Z
- массивы координат точек;
- N0
- количество точек;
- XV,YV,ZV
- координаты центра проекции;
- XPL,YPL,ZPL
- координаты точки на картинной плоскости;
- VX,VY,VZ
- координаты вектора, перпендикулярного картинной плоскости;
- ISCR
- рабочий массив характеристик экранных линий (длины IDIM1);
- IDIM1
- количество экранных линий;
- RLYTOX
- коэффициент, определяющий форму математической области значений функции на картинной плоскости; он равен отношению (XMAX-XMIN) / (YMAX-YMIN), где XMIN, XMAX, YMIN, YMAX - пределы изменения функции, устанавливаемые в области рисования.
Замечание. Проекция точки зрения (XV,YV,0) на плоскость XY должна находиться вне области определения. Вектор (VX,VY,VZ) должен быть направлен в полупространство, где находится центр проекции. В противном случае будет получено зеркальное отражение поверхности.
Следующие рисунки получены с помощью программ, описанных в этом параграфе.
Пример 1. На рис.8.22 показана простая поверхность (поверхность Каталана), которая формируется и изображается с помощью следующей программы:
DIMENSION X(21),Y(21),Z(21),NET0(90),NET(126) DIMENSION SCRN(200,2,2),ISCR(200),NODES(22),IB(2,21) DATA R,N,K,ID1,ID2/2.,21,18,200,2/ DTH=2.*3.14159/K C граница области DO 1 I=1,K IB(1,I)=I+1 IB(2,I)=0 X(I)=R*COS(DTH*(I-1)) Y(I)=R*SIN(DTH*(I-1)) 1 Z(I)=0. IB(1,K)=1 C внутренние точки DO 2 I=1,3 X(I+K)=I-2 Y(I+K)=0. Z(I+K)=3. IB(1,I+K)=0 2 IB(2,I+K)=0 C XV,YV,ZV - точка зрения XV=8. YV=5. ZV=-1. C XPL,YPL,ZPL - точка плоскости проекции XPL=0. YPL=0. ZPL=0. C VX,VY,VZ - вектор, перпендикулярный плоскости проекции VX=XV VY=YV VZ=ZV CALL PAGE(17.,26.,'8.22',4,1) CALL LIMITS(-2.1,2.1,-2.1,2.1) CALL REGION(3.,1.,11.,11.,' ',1,0) IDOM=1 CALL TRINGL(X,Y,N,IB,IDOM,NODES,NET,NT1) CALL TRGRID(X,Y,N,NET,IB,NODES,NET0,NT1) CALL REGION(3.,13.,11.,8.,' ',1,0) CALL PREP(X,Y,Z,N,XV,YV,ZV,XPL,YPL,ZPL,VX,VY,VZ,ISCR,ID1,RLTOX) CALL TRSURF(X,Y,Z,N,XV,YV,NODES,NET0,ISCR,SCRN,ID1,ID2,NET,IB) CALL ENDPG(0) END
Пример 2. На рис.8.23 показаны более сложные поверхности:
а) область определения функции не является прямоугольной (как и в предыдущем примере);
б) неодносвязная область задания функции.
Программа TRG(L,IR,K,KL,KR,NET,NODES,IBOUND,NB,X,Y,XV,YV,IND) позволяет определить, закрывается ли чем-нибудь треугольник, в основании которого лежит граничный отрезок [L,IR]. Параметр IND = 1, если треугольник полностью видим, в противном случае IND = 0.
Программа NEXTRG(IBOUND,X,Y,NET,NODES,NB,XV,YV) позволяет найти следующий треугольник, подлежащий рисованию и изменить сетку после его отщепления.
Программа PROJCT(XP,YP,ZP,XPJ,YPJ) позволяет спроецировать точку (XP,YP,ZP). Здесь (XPJ,YPJ) - координаты проекции.
Программа MATEVL(XV,YV,ZV,XPL,YPL,ZPL,VX,VY,VZ) вычисляет матрицу, с помощью которой осуществляется проецирование (эта матрица несколько модифицируется в программе PREP).
Программа SEE(L,IR,IBOUND,X,Y,NB,IND,IDRWN,XV,YV) определяет, закрывается ли отрезок [L,IR] одним из условно видимых граничных отрезков, информация о которых хранится в массиве IBOUND. Кроме того, определяется, рисовался ли этот отрезок. Параметр IND = 1, если отрезок [L,IR] видим полностью, и IND = 0, если закрывается хотя бы частично. Параметр IDRWN = 1, если отрезок [L,IR] нарисован, в противном случае IDRWN = 0.
Программа SEE1(I1,I2,I3,I4,X,Y,XV,YV,IND) определяет, закрывается ли отрезок [I1,I2] отрезком [I3,I4], если смотреть из точки (XV,YV). Параметр IND = 1, если [I1,I2] полностью видим, и IND = 0, если [I1,I2] закрывается хотя бы частично.
Программа ILIMTN(L,IR,IBOUND,NB) позволяет исключить отрезок [L,IR] из списка условно видимых отрезков границы.
Программа LCROSS(X1,Y1,X2,Y2,X3,Y3,X4,Y4,C,D) вычисляет координаты точки пересечения двух отрезков [A1,A2] и [A3,A4] и заносит их в параметры C и D.
Программа SEGANG(X1,Y1,X2,Y2,A,STEP,IND) позволяет вычислить для отрезка [A1,A2] его угловой коэффициент A. Если отрезок почти вертикальный, то в параметр A заносится координата его пересечения с экранной линией (по выбранному критерию вертикальности такая линия будет единственной). В этом случае IND = 1.
Программа SCREN1(ISCR,SCRN,IDIM1,IDIM2,Y,N,IND) позволяет определить, закрыта ли экраном точка с координатой Y, находящаяся на N-й экранной линии. Параметр IND = 1, если точка видима, в противном случае IND = 0.
Программа SCREN2(ISCR,SCRN,IDIM1,IDIM2,X,Y,NL,STEP,XBEG,A1,B1,A2,B2,IND) определяет положение точки (X,Y) относительно экрана.
- A1
- угловой коэффициент граничного отрезка, отделяющего точку (X,Y) снизу. (XBEG,B1) - точка этого отрезка;
- A2
- аналогично для верхнего отрезка. (XBEG,B2) - точка верхнего отрезка.
Для точки 1 IND = 1 для точки 2, 4 IND = 2 для точки 3 IND = -2 для точки 5 IND = 3
Программа TRDRAW(ISCR,SCRN,IDIM1,IDIM2,X,Y,Z) позволяет нарисовать элемент поверхности, соответствующий треугольнику с вершинами в точках L,IR,K, и модифицировать экран.
Программа PICTUR(ISCR,SCRN,IDIM1,IDIM2,X1,Y1,X2,Y2)
позволяет начертить отрезок [A1,A2], где
Программа SCRMOD(ISCR,SCRN,IDIM1,IDIM2,XL,YL,XIR,YIR,XK,YK) изменяет текущее состояние экрана, добавляя к нему треугольник с координатами вершин (XL,YL),(XIR,YIR),(XK,YK).
Программа PNORDR(X,Y,NET,L,IB,IE) упорядочивает соседей L-й точки на участке от IB до IE так, чтобы при перечислении их в NET обход осуществлялся против часовой стрелки.
Функция COSIN1(X1,Y1,X2,Y2) вычисляет скалярное произведение двух векторов.
Функция COSIN2(X1,Y1,X2,Y2) вычисляет SIGN(COS j) ´COS2 j, где j - угол между векторами (X1,Y1) и (X2,Y2).