Тема: 3D куб!
Показать сообщение отдельно
Старый 27.12.2005, 23:06   #3
jimon
 
Сообщений: n/a
вообще я писал для нашего информатика 3д куб... мы 'алго' изучаем
ето паскаль по хохольски (как ето - лутче неспрашивать)

program example_3d;

var vx,vy,vz,d:real;
  run:boolean;
  key:integer;
  key_press:integer;
  speed:real;

procedure b3d(var nx,ny:integer;x3d,y3d,z3d,vx,vy,vz,distance:real);
  var ty,tz,tx,ox:real;
  begin


  ty := ((y3d * Cos(vx)) - (z3d * Sin(vx)));
  tz := ((y3d * Sin(vx)) + (z3d * Cos(vx)));

  tx := ((x3d * Cos(vy)) - (tz * Sin(vy)));
  tz := ((x3d * Sin(vy)) + (tz * Cos(vy)));

  ox := tx;

  tx := ((tx * Cos(vz)) - (ty * Sin(vz)));
  ty := ((ox * Sin(vz)) + (ty * Cos(vz)));

  nx := Trunc(512 * (tx) / (distance - (tz)) + 320);
  ny := Trunc(240 - (512 * ty) / (distance - (tz)));

end;

procedure line3d(zl1x,zl1y,zl1z,zl2x,zl2y,zl2z,vx,vy,vz,d:real);
  var nx,ny,nx2,ny2:integer;
  begin

  b3d(nx,ny,zl1x,zl1y,zl1z,vx,vy,vz,d);
  b3d(nx2,ny2,zl2x,zl2y,zl2z,vx,vy,vz,d);
  line(nx-50,ny-50,nx2-50,ny2-50);

end;

procedure cube(var vx,vy,vz,d:real);
begin

  line3d(0,0,0,1,0,0,vx,vy,vz,d);
  line3d(0,0,0,0,1,0,vx,vy,vz,d);
  line3d(0,0,0,0,0,1,vx,vy,vz,d);

  line3d(1,0,0,1,1,0,vx,vy,vz,d);
  line3d(1,0,0,1,0,1,vx,vy,vz,d);

  line3d(0,0,1,1,0,1,vx,vy,vz,d);
  line3d(0,0,1,0,1,1,vx,vy,vz,d);

  line3d(0,1,1,1,1,1,vx,vy,vz,d);
  line3d(1,1,0,1,1,1,vx,vy,vz,d);

  line3d(0,1,0,1,1,0,vx,vy,vz,d);
  line3d(0,1,0,0,1,1,vx,vy,vz,d);

  line3d(1,0,1,1,1,1,vx,vy,vz,d);

end;

Function ReadKey: integer; 
Var 
  i,j,k : integer; 
Begin 
  j:=0;
  k:=0; 
  if isevent=true then
   begin
    Event( i, j, k);
   end;
  ReadKey := j;
end; 


begin

  d:=10;
  
  speed:=0.04;

  vx:=0.2;
  vy:=0.5;
  vz:=0;

  run:=true;

  key_press:=1;
  key:=999;

  while run=true do
  begin

  if key=39 then 
   begin
     vy:=vy+speed;
     key_press:=1;
   end;

  if key=37 then
   begin
     vy:=vy-speed;
     key_press:=1;
   end;
  
  if key=40 then
   begin
     vx:=vx-speed;
     key_press:=1;
   end;
   
  if key=38 then
   begin
     vx:=vx+speed;
     key_press:=1;
   end;

  if key<>0 then
   begin
     clear;
     cube(vx,vy,vz,d);
     if key_press=0 then run:=false;
   end;

  key_press:=0;
  key:=ReadKey;
 
  end;
end.
 
Ответить с цитированием