[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]

program Prism3D;
{Author: Krisjanis Gale, 10/06/94}
{MY FIRST WORKING 3D OBJECT!}
uses
    Gfx2,
    Crt;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
type
    vector=record
             x,y,z:integer;
           end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
var
   deltaPRISM:array[0..11,0..1] of vector;
   ValCos:array[0..359] of real;
   ValSin:array[0..359] of real;
   k,sc:integer;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
const
     Zscale=256;  {total z-coord depth}
     deltaZ=256;  {by how much to move points "back" in z-plane}
     {A simple 8-sided prism}
     prism:array[0..11,0..1] of vector=
       ((( x:0;  y:0;  z:1 ),( x:1;  y:0;  z:0 )),
        (( x:0;  y:0;  z:1 ),( x:0;  y:1;  z:0 )),
        (( x:0;  y:0;  z:1 ),( x:-1; y:0;  z:0 )),
        (( x:0;  y:0;  z:1 ),( x:0;  y:-1; z:0 )),
        (( x:0;  y:0;  z:-1),( x:1;  y:0;  z:0 )),
        (( x:0;  y:0;  z:-1),( x:0;  y:1;  z:0 )),
        (( x:0;  y:0;  z:-1),( x:-1; y:0;  z:0 )),
        (( x:0;  y:0;  z:-1),( x:0;  y:-1; z:0 )),
        (( x:1;  y:0;  z:0 ),( x:0;  y:1;  z:0 )),
        (( x:0;  y:1;  z:0 ),( x:-1; y:0;  z:0 )),
        (( x:-1; y:0;  z:0 ),( x:0;  y:-1; z:0 )),
        (( x:0;  y:-1; z:0 ),( x:1;  y:0;  z:0 )));
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
procedure Get2D(x,y,z:integer;var sX:integer;var sY:byte);
begin
     sX:=trunc(((x*Zscale)/z)+160);
     sY:=trunc(((y*Zscale)/z)+100)
end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
function GetCos(i:integer):real;
var
   c:real;
begin
     if i<0 then
        i:=-(abs(i) mod 360)+360;
     c:=ValCos[i mod 360];
     GetCos:=c
end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
function GetSin(i:integer):real;
var
   s:real;
begin
     if i<0 then
        i:=-(abs(i) mod 360)+360;
     s:=ValSin[abs(i) mod 360];
     GetSin:=s
end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
procedure Rot3D(var X,Y,Z:integer;rotX,rotY,rotZ:integer);
  {Trigonometrically rotate an (x,y,z) coordinate by}
  {degrees of rotation on the three axes; K.Gale, 9/21/94}
var
   cosX,sinX,cosY,sinY,cosZ,sinZ:real;
   tX,tY,tZ:integer;
begin
     cosX:=GetCos(rotX);
     sinX:=GetSin(rotX);
     cosY:=GetCos(rotY);
     sinY:=GetSin(rotY);
     cosZ:=GetCos(rotZ);
     sinZ:=GetSin(rotZ);
     tX:=X; tY:=Y; tZ:=Z;
     tX:=trunc(X*cosY-Z*sinY);   {yaw}
     tZ:=trunc(X*sinY+Z*cosY);
     X:=trunc(tX*cosZ+Y*sinZ);   {pitch}
     tY:=trunc(Y*cosZ-tX*sinZ);
     Z:=trunc(tZ*cosX-tY*sinX);  {roll}
     Y:=trunc(tZ*sinX+tY*cosX)
end;

procedure DefinePrism(rotX,rotY,rotZ:integer;scale:byte);
var
   x,y,z:integer;
   i1:0..11;
   i2:0..1;
begin
     for i1:=0 to 11 do
     for i2:=0 to 1 do
     begin
          x:=(prism[i1,i2].x)*scale;
          y:=(prism[i1,i2].y)*scale;
          z:=(prism[i1,i2].z)*scale;
          Rot3D(x,y,z,rotX,rotY,rotZ);
          deltaPRISM[i1,i2].x:=x;
          deltaPRISM[i1,i2].y:=y;
          deltaPRISM[i1,i2].z:=z+deltaZ
     end
end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
procedure DrawPrism(col:byte;where:word);
var
   i:0..11;
   x,y,z,sX1,sX2:integer;
   sY1,sY2:byte;
begin
     for i:=0 to 11 do
     begin
          x:=deltaPRISM[i,0].x;
          y:=deltaPRISM[i,0].y;
          z:=deltaPRISM[i,0].z;
          Get2D(x,y,z,sX1,sY1);
          x:=deltaPRISM[i,1].x;
          y:=deltaPRISM[i,1].y;
          z:=deltaPRISM[i,1].z;
          Get2D(x,y,z,sX2,sY2);
          line(sX1,sY1,sX2,sY2,col,where)
     end
end;
{<þÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄþ>}
begin

     for k:=0 to 359 do
     begin
          ValCos[k]:=cos(Deg2Rad(k));
          ValSin[k]:=sin(Deg2Rad(k))
     end;

     SetMCGA;
     DefinePrism(0,0,0,64);
     for k:=0 to 90 do
     begin
          DrawPrism(0,vga);
          DefinePrism(k div 6,k div 6,k*4,86);
          DrawPrism(15,vga)
     end;
     for k:=15 to 90 do
     begin
          DrawPrism(0,vga);
          DefinePrism(k,k,k,86);
          DrawPrism(15,vga)
     end;
     for k:=90 downto 0 do
     begin
          DrawPrism(0,vga);
          DefinePrism(k*4,k*2,k*8,86);
          DrawPrism(15,vga)
     end;
     while not keypressed do;
     SetText
end.

[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]