Показать сообщение отдельно
Старый 27.07.2009, 19:03   #5
odd
Мастер
 
Аватар для odd
 
Регистрация: 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. 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
IDOL 1234 (23.08.2010)