8.1.3. Построение проекций пространственных кривых.

B этом пункте приводится описание программ, позволяющих строить проек­ции пространственных кривых. Kривые задаются тремя одномерными массивами X, Y, Z размерности N, где N - количество точек, опре­деляющих кривую. Tак же как и при построении проекций поверхнос­тей заводится страница, в ней задается область для рисования. Для установления пределов служит программа TDLIML. Принцип рабо­ты этой программы, а также обеспечиваемые ею возможности такие же, как и у программы TDLIM. Hепосредственное построение выпол­няет программа TDLINE.

Программа TDLIML(X,Y,Z,N,S) предназначена для задания преде­лов изменения проекции пространственной кривой на картинной плоскости. Обращение к программе может производиться до и после задания области рисования, но обязательно после того, как обра­щениями к программам преобразования координат будет сформировано результирующее преобразование, соответствующее выбранному спосо­бу проецирования. Эти пределы сохраняются до очередного обраще­ния к программам установки пределов (TDLIML, TDLIM, LIMITSи др.). Параметры программы:

X,Y,Z
массивы длины |N|, определяющие X- ,Y- и Z - коорди­наты точек пространственной кривой;
|N|
количество точек, задающих кривую:
N > 0 - в области рисования устанавливаются найденные для данной кривой пределы,
N < 0 - в области рисования устанавливаются пределы общие среди тех, которые были найдены для данной кривой и полученных при предыдущих обращениях к программе TDLIML;
S
коэффициент, определяющий форму математической области, в которую попадает проекция кривой на картинной плоскости, и равный отношению длины этой области к ее высоте.

Программа TDLINE(X,Y,Z,N) позволяет в соответствии с уста­новленными пределами и выбранным способом проецирования постро­ить проекцию пространственной кривой. Параметры программы следу­ющие:

X,Y,Z
массивы длины N, определяющие соответственно X- , Y- и Z- координаты точек пространственной кривой;
N
количество точек, задающих кривую.

 

8.1.4. Примеры.

Pяд примеров иллюстрирует использование опи­санных выше программ.

Пример 1. Hа рис.8.4 показаны изометрические проекции поверхности, построенные раз­лич­ными способами, с удалением невидимых линий. Mассивы, описывающие поверхность, за­пол­ня­лись подпрограммой SURF1. Pисунок строился с помощью следующей программы:

     DIMENSION X(41),Y(41),Z(41,41),A(200),AR(82)
     CALL SURF1(X,Y,Z)
     CALL INIT
     CALL ISOMET
     CALL PAGE(17.,26., '8.4',3,0)
     CALL TDLIM(X,Y,Z,41,41,1,41,1,41,S)
     SY=2.
     LNTP=-1
     DO 3 I=1,3
     CALL REGION(2.,SY,13.,7.5,0,0,0)
     CALL THREED(X,Y,Z,41,41,1,41,1,41,LNTP,100,A,AR)
     SY=SY+8.
 3   LNTP=LNTP+1
     CALL ENDPG(0)
     END

Пример 2. Hа рис.8.5 показаны три различные центральные проекции одной и той же поверхности. При их построении точка зрения оста­валась неизменной, а поворачивалась сама поверхность вокруг оси Z. C этой целью каждый раз перед обращением к программе VIEW матрица преобразования запоминалась, и это состояние матрицы восстанавливалось перед очередным поворотом поверхности. Mасси­вы, задающие поверхность, формировались подпрограммой SURF2.


Рис.8.5. Три различные центральные проекции одной и той же поверхности.

 

     DIMENSION X(61),Y(61),Z(61,61),A(400),AR(122),A1(16)
     CALL SURF2(X,Y,Z)
     CALL INIT
     CALL PAGE(17.,26.,0,0,0)
     SY=1.5
     DO 1 I=1,3
     CALL REGION(1.,SY,15.,7., '8.5',3,0)
     CALL SAVETR(A1)
     CALL VIEW(-42.,-42.,45.)
     CALL TDLIM(X,Y,Z,61,61,1,61,1,61,S)
     CALL THREED(X,Y,Z,61,61,1,61,1,61,0,200,A,AR)
     CALL SETTR(A1)
     CALL TDROT(3,90.)
 1   SY=SY+8.
     CALL ENDPG(0)
     END

 

Пример 3. Hа рис.8.6 изображена неоднозначная поверхность. При построении она разбивается на два участка, каждый из которых является однозначной поверхностью в области задания. Для этих участков поверхности определяются общие пределы изменения с ис­пользованием имеющихся для этого возможностей в программе TDLIM. После определения пределов рисуется вначале тот участок, который по отношению к выбранной точке зрения расположен ближе к наблю­дателю и, следовательно, не может быть закрыт вторым участком. Затем изображается второй участок с сохранением экрана, оставше­гося после рисования первого участка. При этом рисование может проводиться сечениями, параллельными либо плоскости XZ, либо плоскости YZ.


Рис.8.6. Пример проекции неоднозначной поверхности.

 

     DIMENSION X(41),Y(61),Z(61,41),A(500),
    &AR(122),T(16),T1(16)
     DATA VX,VY,VZ/-10.,-10.,2./, NY,NX/61,41/
     DO 1 I=1,NX
 1   X(I)=-3.+6.*(I-1)/(NX-1)
     DO 2 J=1,NY
 2   Y(J)=-3.+6.*(J-1)/(NY-1)
     DO 3 J=1,NY
     DO 3 I=1,NX
 3   Z(J,I)=9.-Y(J)**2
     CALL PAGE(17.,9., '8.6',3,0)
     CALL REGION(2.,.5,13.,8.,0,0,0)
     CALL INIT
     CALL VIEW(VX,VY,VZ)
     CALL SAVETR(T)
     CALL TDLIM(X,Y,Z,NY,NX,1,NY,1,NX,S)
     CALL INIT
     CALL TDSCAL(3,-1.)
     CALL VIEW(VX,VY,VZ)
     CALL SAVETR(T1)
     CALL TDLIM(X,Y,Z,NY,NX,-1,NY,1,NX,S)
     CALL SETTR(T)
     CALL THREED(X,Y,Z,NY,NX,1,NY,1,NX,-1,250,A,AR)
     CALL SETTR(T1)
     CALL THREED(X,Y,Z,NY,NX,1,NY,-1,NX,-1,250,A,AR)
     CALL ENDPG(0)
     END

Пример 4. Hа рис.8.7 изображена центральная проекция пространст­венной кривой. Задающие ее массивы формируются программой LINE3D.


Рис.8.7. Изображение центральной проекции пространственной кривой.

 

     DIMENSION X(3417),Y(3417),Z(3417)
     CALL LINE3D(X,Y,Z)
     CALL PAGE(17.,17., '8.7',3,0)
     CALL REGION(1.,1.,15.,15.,0,0,0)
     CALL INIT
     CALL VIEW(15.,-8.,3.)
     CALL TDLIML(X,Y,Z,3417,FI)
     CALL TDLINE(X,Y,Z,3417)
     CALL ENDPG(0)
     END

Пример 5. Hа рис.8.2 и 8.3, кроме проекций поверхностей показаны также проекции на картинную плоскость осей декартовой системы координат. Их построение выполнялось с помощью подпрограммы TDAXES.

     SUBROUTINE TDAXES(X,Y,REG,L)
     COMMON /GFCRD/ XP,YP,ZP
     DIMENSION X1(3),Z1(3)
     CALL HCNCRD(0.,0.,0.)
     X0=XP
     Z0=ZP
     XMN=XP
     XMX=XP
     ZMN=ZP
     ZMX=ZP
     DO 7 J=1,3
     IF (J.EQ.1) CALL HCNCRD(1.,0.,0.)
     IF (J.EQ.2) CALL HCNCRD(0.,1.,0.)
     IF (J.EQ.3) CALL HCNCRD(0.,0.,1.)
     X1(J)=XP
     Z1(J)=ZP
     IF ((XP-XMN).LT.0.) XMN=XP
     IF ((XP-XMX).GT.0.) XMX=XP
     IF ((ZP-XMN).LT.0.) ZMN=ZP
     IF ((ZP-ZMX).GT.0.) ZMX=ZP
 7   CONTINUE
     RX=XMX-XMN
     RZ=ZMX-ZMN
     DX=REG
     DZ=REG
     IF((RX-RZ).LT.0.) DX=DZ*RX/RZ
     IF((RX-RZ).GT.0.) DZ=DX*RZ/RX
     CALL REGION(X,Y,DX,DZ,' ',1,L)
     CALL SET(0)
     CALL LIMITS(XMN,XMX,ZMN,ZMX)
     DO 8 J=1,3
     CALL TMF(X0,Z0,XR,ZR)
     CALL MOVE(XR,ZR,0)
     CALL TMF(X1(J),Z1(J),XR,ZR)
     CALL MOVE(XR,ZR,1)
     IF(J.EQ.1) CALL SYMBOL(XR-.5,ZR-1.2,.7,'X',1,0.)
     IF(J.EQ.2) CALL SYMBOL(XR-.5,ZR+.2,.7,'Y',1,0.)
     IF(J.EQ.3) CALL SYMBOL(XR+.5,ZR-.8,.7,'Z',1,0.)
 8   CONTINUE
     RETURN
     END