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(COSj)´ COS2j, где j - угол между векторами (X1, Y1) и (X2, Y2).