Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АКГ контроша

.doc
Скачиваний:
37
Добавлен:
11.05.2015
Размер:
148.48 Кб
Скачать

Министерство образования республики Беларусь

Учреждение образования

«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»

Институт информационных технологий

Специальность «Программное обеспечение информационных технологий»

КОНТРОЛЬНАЯ РАБОТА

По курсу «Алгоритмы компьютерной графики»

Вариант № 5

Студент-заочник 2 курса

Группы №181022

ФИО Дубровская Галина Николаевна

Адрес: г.Гомель, ул. Рабочая,4 к.301

Тел: +37544745-28-81

Минск, 2013

ЗАДАНИЕ 1

«Анимация и морфинг»

Задание:

№ варианта

Многоуголь-ник1

Многоуголь-ник 2

Способ перемещения

Способ изменения

Перегородка

Схема связи

5

3

5*

1

-

-

5

Примечание: запись 5* означает, что фигура имеет форму 5-конечной звезды.

Нужно разработать программу, обеспечивающую создание на экране семейства фигур заданной формы.

Программа должна предусматривать два режима отображения графической информации:

  • отображение на экране всего множества заданных фигур;

  • отображение одной текущей фигуры.

Переход от первого режима ко второму может быть осуществлен за счет того, что каждая фигура прорисовывается на экране дважды:

  • первый раз фигура прорисовывается заданным цветом;

  • второй раз та же фигура прорисовывается с использованием цвета фона.

Для нормального восприятия фигуры следующая прорисовка объекта в обоих режимах должна выполняться с задержкой.

Фигуры-многоугольники отображаются по узловым точкам с использованием функции отображения отрезка прямой линии по его двум конечным точкам.

Узловые точки исходной фигуры выбираются произвольно с учетом отображения заданной формы и нормального восприятия многоугольника на экране. Для получения узловых точек каждой очередной фигуры необходимо рассчитать очередной набор узловых точек в соответствии с заданной анимацией и морфингом фигуры.

При создании эффекта анимации используются два основных способа перемещения формируемых фигур.

1-ый способ перемещения.

При этом способе необходимо обеспечить метаморфозу многоугольника из начальной формы в заданную конечную форму. На приведенном рисунке (рис.1-1) этот способ иллюстрируется для случая перехода исходного квадрата в конечный треугольник.

В общем случае при этом способе необходимо выполнить следующие действия.

  1. Одним из способов устанавливается связь между опорными точками исходной фигуры и ее конечной формы.

  2. Для каждой исходной опорной точки определяется шаг движения исходной опорной точки к конечной по соответствующей линии-траектории, соединяющей рассматриваемые точки. Этот шаг рассчитывается посредством деления длины линии-траектории на число заданных шагов (это число во всех вариантах равно 30). Линия-траектория на экране не отображается.

  3. Формируются новые координаты опорной точки, используя полученный для этой точки шаг перемещения.

  4. Строится новый многоугольник с использованием полученного набора узловых точек.

Связь начальных и конечных узловых точек может задаваться:

  • в соответствии с последовательности их расположения в контуре фигуры; в свою очередь в этом случае возможны два варианта:

  • узловые точки начальной и конечной фигур берутся в одинаковом направлении, т.е. в направлении по ходу часовой стрелки (схема 1) или в направлении против часовой стрелки (схема 2);

  • узловые точки начальной и конечной фигур берутся с использованием разного направления их обхода в контуре фигуры, например, в исходной фигуре они берутся в порядке направления хода часовой, а в конечной – в направлении против часовой стрелки (схема 3), или наоборот (схема 4);

  • связь конечных и начальных узловых точек выбираться случайным образом (используется функция «random» (схема 5).

Рис.1-1

На приведенном рисунке (Рис.1-1) используется связь начальных точек с конечными по схеме 2.

При рассматриваемом способе метаморфозы возможно использование вертикальной перегородки. Перегородка располагается между исходной и конечной фигурами (примерно посередине) и на экране не отображается. Она используется только для расчета очередного набора узловых точек. За первую половину заданного количества шагов (15 шагов) узловая точка перемещается от своего начального положения до точки пересечения соответствующей ей линии-траектории с линией-перегородкой. За вторую половину заданного количества шагов узловая точка перемещается от своего положения на линии-перегородки до конечной узловой точки.

При этом возможны следующие варианты соединения текущих узловых точек:

  • порядок соединение узловых точек в каждом наборе сохраняется на всей траектории перемещения (от начального узловой точки до линии- перегородки и далее до конечного положения) и определяется по одной из выше описанные схемы 1-5 (вариант «П1»;

  • порядок соединение узловых точек в каждом наборе до линии-перегородки соответствует порядку расположения соответствующих узловых точек в исходном многоугольнике, а после перегородки соединение узловых точек в каждом очередном наборе соответствует порядку расположения соответствующих узловых точек в конечном многоугольнике (вариант «П2»).

Если количество опорных точек в исходной и конечной фигуре не совпадают, то в набор с меньшим количеством опорных точек вводится дополнительные точки. Например, на рис.1-1 представлен случай, при котором в набор узловых точек конечной фигуры пришлось ввести дополнительную точку, удвоив количество точек в вершине А конечного треугольника. Дополнительно вводимые точки не обязательно должны располагаются в вершинах многоугольника. Их можно брать и на ребрах (например, на середине ребра). Выбор местоположения дополнительно вводимых точек осуществляется студентом.

2-ый способ перемещения.

При этом способе необходимо обеспечить хаотическое движение изменяющегося многоугольника.

Хаотическое движение многоугольника может быть получено за счет изменения положения его центра на вектор направления V с параметрами (vx,vy), где:

  • vx – проекция вектора V на координатную ось X, которая рассчитывается согласно выражению:

vx =rx;

  • vy – проекция вектора V на координатную ось Y, которая рассчитывается согласно выражению:

vy =sy;

  • r и s – коэффициенты, задаваемые функцией random; они могут принимать значения в диапазоне от -2 до +2.

Значение для x и y задаются студентом, но при условии обеспечения эффекта движения без скачков.

Изменение фигуры может происходить посредством:

  • уменьшением масштаба (рис.1-2 b) на каждом шаге на величину 1/30 ее текущего размера (динамический режим ДР1);

  • перемещением узловой точки к ближайшей соседней узловой точке (рис.1-2 a) по ребру на 1/30 часть текущей длины ребра (динамический режим ДР2).

Рис.

Перечень вариантов приведен в виде таблицы

Рис.1-2

Код программы:

Program zad1_5

Uses crt, graph;

Const

M1: array[1..3,1..2] of real=((20,2),

(250,20),

(250,180),

(20,180));

M2: array[1..5,1..2] of real=((500,300),

(600,400),

(400,400);

D:integer=1;

var

X,xc1,xc2,xc3,cx4, cx5,xc4,yc1,yc2,yc3,yc4,yc5:real;

Check:Boolean;

gd, gm: integer;

DXY:array[1..5,1..2] of real

M,MM: array[1..5,1..2] of integer;

Y, Q, P: array[1..5] of real;

Procedure Dr(x1,x2,x3,x4,x5,y1,y2,y3,y4,y5);

Begin

LineTo(round(x2),round(y2));

LineTo(round(x3),round(y3));

LineTo(round(x4),round(y4));

LineTo(round(x5),round(y5));

LineTo(round(x1),round(y1));

End;

Procedure filling;

Var

I,J,K: integer;

Begin

MoveTo(round(M1[1,1]), round(M1[1,2]));

xc1:=M1[1,1];

xc2:=M1[2,1];

xc3:=M1[3,1];

xc4:=M1[4,1];

xc5:=M1[5,1];

yc1:=M1[1,2];

yc2:=M1[2,2];

yc3:=M1[3,2];

yc4:=M1[4,2];

yc5:=M1[5,2];

Dr(xc1,xc2,xc3,xc4,xc5,yc1,yc2,yc3,yc4,yc5);

Readkey;

For I:=1 to 15 do

Begin

Delay(20000);

If not chek then

Begin

Setcolor<white>;

Dr(xc1,xc2,xc3,xc4,xc5,yc1,yc2,yc3,yc4,yc5);

Setcolor(magenta);

End;

xc1:=xc1+dxy[1,1];

xc2:=xc2+dxy[2,1];

xc3:=xc3+dxy[3,1];

xc4:=xc4+dxy[4,1];

xc5:=xc5+dxy[5,1];

yc1:=(M2[M[1],2]-M1[1,2])/(M2[M[1],1]-M1[1,1])*(xc1-M1[1,1])+M1[1,2];

yc2:=(M2[M[2],2]-M1[2,2])/(M2[M[2],1]-M1[2,1])*(xc2-M1[2,1])+M1[2,2];

yc3:=(M2[M[3],2]-M1[3,2])/(M2[M[3],1]-M1[3,1])*(xc3-M1[3,1])+M1[3,2];

yc4:=(M2[M[4],2]-M1[4,2])/(M2[M[4],1]-M1[4,1])*(xc4-M1[4,1])+M1[4,2];

yc5:=(M2[M[5],2]-M1[5,2])/(M2[M[5],1]-M1[5,1])*(xc5-M1[5,1])+M1[5,2];

MoveTo(round(xc1) round(yc1));

Dr(xc1,xc2,xc3,xc4,xc5,yc1,yc2,yc3,yc4,yc5);

End;

MoveTo(round(x), round(yc1));

Dr(X, x, x, x, x, yc1, yc2, yc3, yc4, yc5 );

DXY[1,1]:=(M2[1,1]-X)/15;

DXY[2,1]:=(M2[2,1]-X)/15;

DXY[3,1]:=(M2[3,1]-X)/15;

DXY[4,1]:=(M2[4,1]-X)/15;

DXY[5,1]:=(M2[D,1]-X)/15;

P[1]:=X;

P[2]:=x;

P[3]:=x;

P[4]:=x;

P[5]:=x;

For i:=1 to 15 do

Begin

If not check then

Begin

Setcolor(While);

Dr(X, x, x, x, x, yc1, yc2, yc3, yc4, yc5 );

Setcolor(magenta);

End;

P[1]:=P[1]+dxy[1,1];

P[2]:=P[2]+dxy[2,1];

P[3]:=P[3]+dxy[3,1];

P[4]:=P[4]+dxy[4,1];

P[5]:=P[5]+dxy[5,1];

Q[1]:=(M2[1,2]-M1[MM[1],2])/(M2[1,1]-M1[MM[1],1])*(P[1]-M1[MM[1],1])+M1[MM[1],2];

Q[2]:=(M2[2,2]-M1[MM[2],2])/(M2[2,1]-M1[MM[2],1])*(P[2]-M1[MM[2],1])+M1[MM[2],2];

Q[3]:=(M2[3,2]-M1[MM[3],2])/(M2[3,1]-M1[MM[3],1])*(P[3]-M1[MM[3],1])+M1[MM[3],2];

Q[4]:=(M2[4,2]-M1[MM[4],2])/(M2[4,1]-M1[MM[4],1])*(P[4]-M1[MM[4],1])+M1[MM[4],2];

Q[5]:=(M2[D,2]-M1[MM[5],2])/(M2[D,1]-M1[MM[5],1])*(P[5]-M1[MM[5],1])+M1[MM[5],2];

Delay(20000);

{Readkey;}

If not check then cleardevice;

MoveTo(round(P[1]), round(Q[1]));

Dr(P[1], P[2], P[3], P[4], P[5], Q[1], Q[2], Q[3], Q[4], Q[5]);

End;

MoveTo(round(M2[1,1]), round(M2[1,2]));

Dr(M2[1,1], M2[2,1], M2[3,1], M2[4,1], M2[5,1], M2[1,2], M2[2,2], M2[3,2], M2[4,2],M2[5,2];

End;

Procedure corr;

Var

I, B, J, K: integer;

Bb: Boolean;

Begin

Randomize;

For I:=1 to 5 do

Begin

MM[I]:=0;

M[i]:=0;

End;

For I:=1 to 5 do

Begin

While true do

Begin

bb:=false;

B:=random(5)+1;

For J:=1 to 5 do

If M[J]=B then

Begin

bb:=true;

break;

end;

if not bb then

begin

M[I]:=B;

MM[B]:=I;

Break;

End;

End;

End;

For I:=1 to 5 do

If V[I]=5 then

M[I]:=D;

X:=(M1[5,1]+M2[5,1])/2;

y[1]:=(M2[M[1],2]-M1[1,2])/(M2[M[1],1]-M1[1,1])*(xc1-M1[1,1])+M1[1,1];

y[2]:=(M2[M[2],2]-M1[2,2])/(M2[M[2],1]-M1[2,1])*(xc2-M1[2,1])+M1[2,1];

y[3]:=(M2[M[3],2]-M1[3,2])/(M2[M[3],1]-M1[3,1])*(xc3-M1[3,1])+M1[3,1];

y[4]:=(M2[M[4],2]-M1[4,2])/(M2[M[4],1]-M1[4,1])*(xc4-M1[4,1])+M1[4,1];

y[5]:=(M2[M[5],2]-M1[5,2])/(M2[M[5],1]-M1[5,1])*(xc5-M1[5,1])+M1[5,1];

for i:=1 to 5

begin

DXY[I,1]:=(X-M1[I,1])/15;

DXY[I,2]:=(Y[I]-M1[I,2])/15;

End;

End;

Procedure preparation;

Var i:integer;

c:char;

begin

writeln(‘Points correspondence:’);

for i:=1 to 5 do

writeln(MM[i], ‘-‘, M[i]);

writeln(‘Do you want to show all current figures (slave)(y/n)?’);

readln(c);

if(c=’y’) or (c=’Y’) then check:=true else checj:=false;

end;

begin

corr;

preparation;

gd:=detect;

gm:=0;

initgraph(GD,gm,’’);

SetBkColor(While);

SetColor(Magenta);

Filling;

ReadKey;

Closegraph;

End.

ЗАДАНИЕ 2

«Отсечение прямоугольным окном».

Задание:

Необходимо написать программу, выполняющую заданное внешнее отсечения окном. Программа должна быть основана на алгоритме отсечения прямоугольным окном Сазерленда-Коуэна. Работу составленной программы необходимо продемонстрировать на примере отсечения перемещающейся фигуры, полученной в результате выполнения задания № 1, окном заданной формы.

Реализация отсечения многоугольниками заданных форм требует в некоторых случаях выполнения нескольких отсечений (внутренних и внешних) для отдельных окон, на которые нужно разбить заданную форму многоугольника. Например, внутреннее отсечение окном, имеющим форму «а», приведенную на рис.2-1, можно выполнить, реализовав внутреннее отсечение для окна в форме горизонтального прямоугольника, и внутреннее отсечение для окна в форме вертикального прямоугольника. Сумму видимых частей, полученных для этих двух отсечений, и будет результатом отсечения окном заданной формы.

Вид отсечения

Вид окна

Внешнее

5

Примечание. В графе «Вид окна» используются обозначения форм окна.

Код программы:

program pr2_5;

uses

crt,graph;

type

windowtr=array[1..4,1..3] of real;

const

prism : array[1..8,1..3] of real = ((300,170,0),

(300,170,100),

(500,170,100),

(500,170,0),

(300,320,0),

(300,320,100),

(500,320,100),

(500,320,0));

edge : array [1..12,1..2] of byte = ((1,2),

(1,4),

(1,5),

(2,3),

(2,6),

(3,4),

(3,7),

(4,8),

(5,8),

(5,6),

(6,7),

(7,8));

sk1 : array [1..6,1..4] of byte = ((1,2,6,4),

(1,5,10,3),

(4,7,11,5),

(6,8,12,7),

(2,3,9,8),

(9,10,11,12));

skeleton : array [1..6,1..4] of byte =((1,4,3,2),

(1,2,6,5),

(6,2,3,7),

(7,3,4,8),

(8,4,1,5),

(6,7,8,5));

TransMatr : array[1..5,1..5] of real =((1,0,0,0,0),

(0,1,0,0,0),

(0,0,1,0,0),

(0,0,0,1,0));

(0,0,0,0,1));

piece : array [1..2,1..3] of real = ((250,120,0),(500,300,120));

var

gd,gm:integer; f:text;

seeedge:array[1..6] of boolean;

Matr2D:array[1..8,1..2] of real;

chk:byte;

Piece2D:array[1..2,1..2] of real;

procedure ConvTo2D;

var

i:byte;

begin

for i:=1 to 8 do

begin

Matr2D[i,1]:=prism[i,1]+prism[i,3]*sqrt(0.5);

Matr2D[i,2]:=prism[i,2]+prism[i,3]*sqrt(0.5);

end;

for i:=1 to 2 do

begin

Piece2D[i,1]:=piece[i,1]+piece[i,3]*sqrt(0.5);

Piece2D[i,2]:=piece[i,2]+piece[i,3]*sqrt(0.5);

end

end;

function scmul3D(x1,y1,z1,x2,y2,z2:real):real;

var tmp:real;

begin

tmp:=x1*x2+y1*y2+z1*z2;

scmul3D:=tmp

end;

procedure check;

var

c:boolean;

cnt:byte;

ax,bx,cx,ay,by,cy:real;

begin

for cnt:=1 to 6 do

begin

ax:=Matr2D[skeleton[cnt,1],1];

ay:=Matr2D[skeleton[cnt,1],2];

bx:=Matr2D[skeleton[cnt,2],1];

by:=Matr2D[skeleton[cnt,2],2];

cx:=Matr2D[skeleton[cnt,3],1];

cy:=Matr2D[skeleton[cnt,3],2];

seeedge[cnt]:=((ax*by+ay*cx+bx*cy-by*cx-ay*bx-cy*ax)>0)

end

end;

procedure retsc(r:byte; var e1,e2:byte);

var

i,j:byte;

begin

e1:=0;

e2:=0;

for i:=1 to 6 do

for j:=1 to 4 do

if r=sk1[i,j] then

if e1<>0 then e2:=i else e1:=i;

end;

{procedure cirus2D(x1,y1,z1,x2,y2,z2:real)}

procedure cirus3D(x1,y1,z1,x2,y2,z2:real);

var

i,j,k,l:byte;

dx,dy,dz,wx,wy,wz,nx,ny,nz:real;

opt:array[1..3,1..2] of real;

tin,tout,t:real;

dsc,wsc:real;

tc:array[1..6] of real;

wc:windowtr;

x1t,x2t,y1t,y2t,z1t,z2t:real;

begin

k:=6;

tin:=0;

tout:=1;

dx:=x2-x1;

dy:=y2-y1;

dz:=z2-z1;

for i:=1 to 6 do

begin

for j:=1 to 4 do

for l:=1 to 3 do

wc[j,l]:=prism[skeleton[i,j],l];

nx:=(wc[2,2]-wc[1,2])*(wc[3,3]-wc[1,3])-(wc[3,2]-wc[1,2])*(wc[2,3]-wc[1,3]);

ny:=-(wc[2,1]-wc[1,1])*(wc[3,3]-wc[1,3])-(wc[3,1]-wc[1,1])*(wc[2,3]-wc[1,3]);

nz:=(wc[2,1]-wc[1,1])*(wc[3,2]-wc[1,2])-(wc[3,1]-wc[1,1])*(wc[2,2]-wc[1,2]);

{if (not seeedge[i]) then

begin

nx:=-nx; ny:=-ny; nz:=-nz;

end;}

wx:=x1-wc[1,1];

wy:=y1-wc[1,2];

wz:=z1-wc[1,3];

dsc:=scmul3D(dx,dy,dz,nx,ny,nz);

wsc:=scmul3D(wx,wy,wz,nx,ny,nz);if (dsc<>0) then t:=-wsc/dsc else t:=0;

tc[i]:=t;

write(f,t:5:3,';');

{ if dsc=0 then

begin

if wsc<0 then begin Line(round(Piece2D[1,1]),round(Piece2D[1,2]),round(Piece2D[2,1]),round(Piece2D[2,2]));

exit

end

end

else

begin

t:=-wsc/dsc;

tc[i]:=t;

if dsc<0 then

begin

if t>1 then

begin Line(round(Piece2D[1,1]),round(Piece2D[1,2]),round(Piece2D[2,1]),round(Piece2D[2,2]));

exit;

end;

if tin<t then tin:=t;

end

else

begin

if t<0 then

begin Line(round(Piece2D[1,1]),round(Piece2D[1,2]),round(Piece2D[2,1]),round(Piece2D[2,2]));

exit;

end;

if tout>t then tout:=t;

end;

end; }

x1t:=x1+(x2-x1)*tc[i];

y1t:=y1+(y2-y1)*tc[i];

z1t:=z1+(z2-z1)*tc[i];

for k:=1 to 3 do

begin

opt[k,1]:=wc[1,k];

opt[k,2]:=wc[1,k];

for l:=2 to 4 do

begin

if wc[l,k]>opt[k,2] then opt[k,2]:=wc[l,k];

if wc[l,k]<opt[k,1] then opt[k,1]:=wc[l,k];

end;

end;

if ((x1t<=opt[1,2]) and (x1t>=opt[1,1]) and (y1t<=opt[2,2])

and (y1t>=opt[2,1]) and (z1t<=opt[3,2]) and (z1t>=opt[3,1])) then

tc[i]:=tc[i] else tc[i]:=0;

end;

tin:=1; tout:=0;

for k:=1 to 6 do

begin

{ write(f,tc[k]:5:3,';');}

if ((tc[k]<>0) and (tc[k]<tin)) then if (tc[k]>0) then tin:=tc[k];

if ((tc[k]<>0) and (tc[k]>tout)) then if (tc[k]>0) then tout:=tc[k];

{ write(f,tc[k]:5:3,';')}

{tin:=0.27777;tout:=0.62531;}

end;

if (((tin=1) and (tout=0)) or (abs(tin-tout)<=0.001)) then Line(round(Piece2D[1,1]),round(Piece2D[1,2]),round(Piece2D[2,1]),round(Piece2D[2,2]));

writeln(f,tin:5:3,';',tout:5:3);

if tin<tout then

begin

x1t:=x1+(x2-x1)*tin;

y1t:=y1+(y2-y1)*tin;

z1t:=z1+(z2-z1)*tin;

x2t:=x1+(x2-x1)*tout;

y2t:=y1+(y2-y1)*tout;

z2t:=z1+(z2-z1)*tout;

Piece2D[1,1]:=x1t+z1t*sqrt(0.5);

Piece2D[1,2]:=y1t+z1t*sqrt(0.5);

Piece2D[2,1]:=x2t+z2t*sqrt(0.5);

Piece2D[2,2]:=y2t+z2t*sqrt(0.5);

if (tin<>0) then Line(round(x1+z1*sqrt(0.5)),round(y1+z1*sqrt(0.5)),round(Piece2D[1,1]),round(Piece2D[1,2]));

if (tout<>1) then Line(round(Piece2D[2,1]),round(Piece2D[2,2]),round(x2+z2*sqrt(0.5)),round(y2+z2*sqrt(0.5)));

end

end;

procedure DrawPrism(an:integer);

var

i,j,e1,e2: byte;

begin

for i:=1 to 12 do

begin

retsc(i,e1,e2);

case chk of

1: Line(round(Matr2D[edge[i,1],1]),round(Matr2D[edge[i,1],2]),round(Matr2D[edge[i,2],1]),round(Matr2D[edge[i,2],2]));

2:

begin

if ((seeedge[e1]) or (seeedge[e2])) then

SetLineStyle(SolidLn,0,NormWidth)

else SetLineStyle(DashedLn,0,NormWidth); Line(round(Matr2D[edge[i,1],1]),round(Matr2D[edge[i,1],2]),round(Matr2D[edge[i,2],1]),round(Matr2D[edge[i,2],2]));

end;

3:

if ((seeedge[e1]) or (seeedge[e2])) then Line(round(Matr2D[edge[i,1],1]),round(Matr2D[edge[i,1],2]),round(Matr2D[edge[i,2],1]),round(Matr2D[edge[i,2],2]));

end;

end;

end;

procedure Turn;

var

phi,an:integer;

rvec:real;

i:byte;

zt,xt:real;

begin

an:=0;

for phi:=1 to 360 do

begin

for i:=1 to 8 do

if ((i<>1) and (i<>5)) then begin

zt:=prism[i,3];

xt:=prism[i,1];

prism[i,3]:=(zt-prism[1,3])*cos(pi*1/180)-(xt-prism[1,1])*sin(pi*1/180)+prism[1,3];

prism[i,1]:=(zt-prism[1,3])*sin(pi*1/180)+(xt-prism[1,1])*cos(pi*1/180)+prism[1,1];

end; ConvTo2D;

check;

Setcolor(Magenta);

DrawPrism(an);

Cirus3D(piece[1,1],piece[1,2],piece[1,3],piece[2,1],piece[2,2],piece[2,3]);

Delay(5000);

{Readkey; }

Setcolor(White); DrawPrism(an);

Cirus3D(piece[1,1],piece[1,2],piece[1,3],piece[2,1],piece[2,2],piece[2,3]);

for i:=1 to 3 do

if (i<>1) then begin

zt:=piece[i,2];

xt:=piece[i,3];

piece[i,2]:=(zt-piece[1,2])*cos(pi*1/180)-(xt-piece[1,3])*sin(pi*1/180)+piece[1,2];

piece[i,3]:=(zt-piece[1,2])*sin(pi*1/180)+(xt-piece[1,3])*cos(pi*1/180)+piece[1,3];

end;

end

end;

begin

assign(f,'file.txt');

rewrite(f);

writeln('Choose the kind of the model:');

writeln('1-wire frame model;');

writeln('2-dashed unvisible lines;');

writeln('3-opaque model.');

readln(chk);

gd:=detect;

gm:=0;

initgraph(GD,gm,'');

ConvTo2D;

check;

SetBkColor(White);

SetColor(Magenta);

DrawPrism(0); Cirus3D(piece[1,1],piece[1,2],piece[1,3],piece[2,1],piece[2,2],piece[2,3]);

ReadKey;

Setcolor(White); DrawPrism(0);

Turn;

Setcolor(Magenta); DrawPrism(0);

ReadKey; close(f);

closegraph;

end.