Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Список телефонов, совместимых с floating-point МидлетПаскаля
Хороший тест, это вот такой трехмерный кубик.
В идеале на экране должен вращаться кубик.
Если floating point вычисления глючат, то будет рисоваться
какая-то какофония из линий.
Program Project_3D_cube_2;
Uses gfx;
Const vortex = 6; // Количество граней -1 points = 11; // Количество точек -1
Type point = record // Тип данных для хранения точки или подобной бурды x, y, z: real; end; Var an, dx1, dy1, dx2, dy2: real; p: array [0..points] of point; // Тут хранятся все точки e: array [0..vortex, 0..3] of integer; // А тут все грани i, wi, hi, xi, yi: integer; temp, angle: point;
Procedure RotZ; var t,ar: real; begin t:=sqrt(temp.x*temp.x+temp.y*temp.y); ar:=atan2(temp.y,temp.x)+an; temp.x:=t*cos(ar); temp.y:=t*sin(ar); end;
Procedure RotY; var t,ar: real; begin t:=sqrt(temp.x*temp.x+temp.z*temp.z); ar:=atan2(temp.z,temp.x)+an; temp.x:=t*cos(ar); temp.z:=t*sin(ar); end;
Procedure RotX; var t,ar: real; begin t:=sqrt(temp.x*temp.x+temp.y*temp.y); ar:=atan2(temp.y,temp.x)+an; temp.x:=t*cos(ar); temp.y:=t*sin(ar); end;
Procedure Show; var yes: integer; begin for i:=0 to vortex do begin dx1:=p[e[i,1]].x-p[e[i,0]].x; dy1:=p[e[i,1]].y-p[e[i,0]].y; dx2:=p[e[i,2]].x-p[e[i,1]].x; dy2:=p[e[i,2]].y-p[e[i,1]].y; if (dx1*dy2-dx2*dy1<0) then begin DrawLine(trunc(p[e[i,0]].x+wi/2), trunc(p[e[i,0]].y+hi/2), trunc(p[e[i,1]].x+wi/2), trunc(p[e[i,1]].y+hi/2)); DrawLine(trunc(p[e[i,1]].x+wi/2), trunc(p[e[i,1]].y+hi/2), trunc(p[e[i,2]].x+wi/2), trunc(p[e[i,2]].y+hi/2)); DrawLine(trunc(p[e[i,2]].x+wi/2), trunc(p[e[i,2]].y+hi/2), trunc(p[e[i,3]].x+wi/2), trunc(p[e[i,3]].y+hi/2)); DrawLine(trunc(p[e[i,3]].x+wi/2), trunc(p[e[i,3]].y+hi/2), trunc(p[e[i,0]].x+wi/2), trunc(p[e[i,0]].y+hi/2)); end; end; end;
Begin an:=0.017; p[0].x:=30; p[0].y:=30; p[0].z:=30; // Сама фигура (в оригинале - куб) p[1].x:=30; p[1].y:=-30; p[1].z:=30; p[2].x:=-30; p[2].y:=-30; p[2].z:=30; p[3].x:=-30; p[3].y:=30; p[3].z:=30; p[4].x:=30; p[4].y:=30; p[4].z:=-30; p[5].x:=30; p[5].y:=-30; p[5].z:=-30; p[6].x:=-30; p[6].y:=-30; p[6].z:=-30; p[7].x:=-30; p[7].y:=30; p[7].z:=-30;
p[8].x:=20; p[8].y:=20; p[8].z:=30; // Дырка p[9].x:=20; p[9].y:=-20; p[9].z:=30; p[10].x:=-20; p[10].y:=-20; p[10].z:=30; p[11].x:=-20; p[11].y:=20; p[11].z:=30; e[0,0]:=0; e[0,1]:=1; e[0,2]:=2; e[0,3]:=3; // ВАЖНО: Все точки в грани нужно описывать по ходу часовой стрелки! e[1,0]:=1; e[1,1]:=5; e[1,2]:=6; e[1,3]:=2; e[2,0]:=5; e[2,1]:=4; e[2,2]:=7; e[2,3]:=6; e[3,0]:=4; e[3,1]:=0; e[3,2]:=3; e[3,3]:=7; e[4,0]:=4; e[4,1]:=5; e[4,2]:=1; e[4,3]:=0; e[5,0]:=3; e[5,1]:=2; e[5,2]:=6; e[5,3]:=7; e[6,0]:=8; e[6,1]:=9; e[6,2]:=10; e[6,3]:=11; // Описание дырки wi:=GetWidth; hi:=GetHeight; angle.x:=1*0.017; angle.y:=2*0.017; angle.z:=1*0.017; repeat for i:=0 to points do begin temp.x:=p[i].x; temp.y:=p[i].y; temp.z:=p[i].z; an:=angle.x; RotX; an:=angle.y; RotY; an:=angle.z; RotZ; p[i].x:=temp.x; p[i].y:=temp.y; p[i].z:=temp.z; end; SetColor(0,0,0); FillRect(0,0,wi,hi); SetColor(0,255,0); Show; Repaint; until FALSE; End.
|