8.3.4. Описание программ.

Программа 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) должен быть направлен в полупространство, где находится центр проекции. В противном случае будет получено зеркальное отражение поверхности.

 

8.3.5. Примеры.

Следующие рисунки получены с помощью прог­рамм, описанных в этом параграфе.

Пример 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


Рис.8.22. Изображение поверхности Каталана.

 

Пример 2. На рис.8.23 показаны более сложные поверхности:

а) область определения функции не является прямоугольной (как и в предыдущем примере);

б) неодносвязная область задания функции.


Рис.8.23. Примеры изображений более сложных поверхностей.

 

8.3.6. Служебные программы.

Программа 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], где A1 = (X1,Y1), A2 = (X2,Y2).

Программа 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).