Показать сообщение отдельно
Старый 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    // Тип данных для хранения точки или подобной бурды
    
xyzreal;
end;
        
Var    
andx1dy1dx2dy2real;
        
p: array [0..pointsof point// Тут хранятся все точки
        
e: array [0..vortex0..3of integer// А тут все грани
        
iwihixiyiinteger;
        
tempanglepoint;

Procedure RotZ;
var    
t,arreal;
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,arreal;
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,arreal;
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
    
yesinteger;
begin
    
for i:=0 to vortex do
    
begin
    dx1
:=p[e[i,1]].x-p[e[i,0]].xdy1:=p[e[i,1]].y-p[e[i,0]].y;
    
dx2:=p[e[i,2]].x-p[e[i,1]].xdy2:=p[e[i,2]].y-p[e[i,1]].y;
    if (
dx1*dy2-dx2*dy1<0then
        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:=30p[0].y:=30p[0].z:=30;            // Сама фигура (в оригинале - куб)
    
p[1].x:=30p[1].y:=-30p[1].z:=30;
    
p[2].x:=-30p[2].y:=-30p[2].z:=30;
    
p[3].x:=-30p[3].y:=30p[3].z:=30;
    
p[4].x:=30p[4].y:=30p[4].z:=-30;
    
p[5].x:=30p[5].y:=-30p[5].z:=-30;
    
p[6].x:=-30p[6].y:=-30p[6].z:=-30;
    
p[7].x:=-30p[7].y:=30p[7].z:=-30;

    
p[8].x:=20p[8].y:=20p[8].z:=30;                // Дырка
    
p[9].x:=20p[9].y:=-20p[9].z:=30;
    
p[10].x:=-20p[10].y:=-20p[10].z:=30;
    
p[11].x:=-20p[11].y:=20p[11].z:=30;
    
    
e[0,0]:=0e[0,1]:=1e[0,2]:=2e[0,3]:=3;            // ВАЖНО: Все точки в грани нужно описывать по ходу часовой стрелки!
    
e[1,0]:=1e[1,1]:=5e[1,2]:=6e[1,3]:=2;
    
e[2,0]:=5e[2,1]:=4e[2,2]:=7e[2,3]:=6;
    
e[3,0]:=4e[3,1]:=0e[3,2]:=3e[3,3]:=7;
    
e[4,0]:=4e[4,1]:=5e[4,2]:=1e[4,3]:=0;
    
e[5,0]:=3e[5,1]:=2e[5,2]:=6e[5,3]:=7;
    
    
e[6,0]:=8e[6,1]:=9e[6,2]:=10e[6,3]:=11;        // Описание дырки
    
    
wi:=GetWidthhi:=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].xtemp.y:=p[i].ytemp.z:=p[i].z;
            
an:=angle.x;
            
RotX;
            
an:=angle.y;
            
RotY;
            
an:=angle.z;
            
RotZ;
            
p[i].x:=temp.xp[i].y:=temp.yp[i].z:=temp.z;
        
end;
        
SetColor(0,0,0); FillRect(0,0,wi,hi); SetColor(0,255,0);
        
ShowRepaint;
    
until FALSE;
End
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
IDOL 1234 (23.08.2010)