rom4n
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Программа рисует вращающийся тетраэдр (по оси ОУ), и закрашивает невидимые грани. Вроде бы все нормально, но вот не задача. Грани закрашиваются раньше, чем нужно, а в чем проблема никак понять не могу. Код: program zadanie3; uses crt,graph; type {Задаем тип, который будет хронить координаты точки в трехмерном пространстве} v3 = record x,y,z :real; x2,y2 :integer; end; var gm,gd : integer; const numb : array [1..4] of string = ('one','two','three','four'); const col : array [1..4] of word = (red,green,blue,yellow); const top : array [1..4] of v3 = ((x:100;y:200;z:100), (x:100;y:0;z:200), (x:200;y:0;z:0), (x:0;y:0;z:0)); const edge : array [1..4,1..3] of integer = { ((1,2,3),(2,4,1),(3,4,1),(4,3,2));} ((1,2,3),(1,3,4),(1,4,2),(2,3,4)); procedure d2; var i :integer; a,b : real; {углы построения проекции} begin a:=45*pi/180;{вращение вокруг Y (45гр)} b:=135.36*pi/180;{вращение вокруг Х (35.36гр)} {находим координаты всех точек} for i:=1 to 4 do begin with top[i] do begin x2:=320+round(x*cos(a)+z*sin(a)); y2:=200+round(x*sin(a)*sin(b)+y*cos(b)-z*cos(a)*sin(b)); end; end; end;{d2} {function VisibleEdge(i:integer): boolean; VAR dx1, dy1, dx2, dy2,x1,y1,x2,y2,x3,y3,out: integer; begin x1:= top[edge[i,1]].x2; y1:= top[edge[i,1]].y2; x2:= top[edge[i,2]].x2; y2:= top[edge[i,2]].y2; x3:= top[edge[i,3]].x2; y3:= top[edge[i,3]].y2; dx1:=X2-X1; dy1:=Y2-Y1; dx2:=X3-X2; dy2:=Y3-Y2; VisibleEdge:=((dx1*dy2-dx2*dy1)>0); END;} function VisibleEdge(i:integer): boolean; {Определение видимости i-й грани} VAR v,m,d: array[1..3] of real; scalar: real; BEGIN {Расчет значений 2-х векторов, лежащих в плоскости грани} v[1]:=top[edge[i,2]].x-top[edge[i,1]].x; m[1]:=top[edge[i,3]].x-top[edge[i,1]].x; v[2]:=top[edge[i,2]].y-top[edge[i,1]].y; m[2]:=top[edge[i,3]].y-top[edge[i,1]].y; v[3]:=top[edge[i,2]].z-top[edge[i,1]].z; m[3]:=top[edge[i,3]].z-top[edge[i,1]].z; {Вычисление вектора нормали грани} d[1]:=v[2]*m[3]-m[2]*v[3]; d[2]:=v[3]*m[1]-m[3]*v[1]; d[3]:=v[1]*m[2]-m[1]*v[2]; {Определение видимости грани} scalar:=d[1]-d[2]-d[3]; If scalar>0 Then VisibleEdge:=true Else VisibleEdge:=false; END; procedure t2; var i,j:integer; begin for i:=1 to 4 do begin with top[i] do begin outtextxy(x2-5,y2+5,numb[i]); end; end; end; procedure draw; var i,j : integer; pol: array [1..3] of pointtype; begin d2;{вычисляем координаты на плоскости} t2; For i:=1 To 4 Do Begin If VisibleEdge(i) Then Begin {Если грань видима, то выводим ее на экран} For j:=1 To 3 Do Begin pol[j].x:=top[edge[i,j]].x2; pol[j].y:=top[edge[i,j]].y2; End; SetFillStyle(1,col[i]); {Устанавливаем цвет и стиль закраски} FillPoly(3,pol); End; End; end;{draw} procedure TurnOY(Corner: real); {Поворот OY} var n:integer; x,z:real; begin for n:=1 To 4 do begin x:=Top[n].x; z:=Top[n].z; Top[n].x:=x*cos(Corner)+z*sin(Corner); Top[n].z:=-x*sin(Corner)+z*cos(Corner); end; end; begin gd := detect; InitGraph(gd, gm, ''); {Инициализация графического режима} If GraphResult <> grOk Then Halt(1); ClearDevice; repeat Draw; delay(8000); ClearDevice; TurnOY(pi/150); until keypressed; {выход по нажатию любой клавиши} CloseGraph; end. | [/more] | Всего записей: 4 | Зарегистр. 23-03-2008 | Отправлено: 10:48 31-03-2009 | Исправлено: rom4n, 11:03 31-03-2009 |
|