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

    {
    You can do a basic horizontal starfeild where all you need is an array of
    x,y locations, a routine to draw the stars in the next position, a routine
    to remove the old stars, and a routine to update the position array.  Or one
    routine to do all that. That gets boring once you write one.  So you want one
    you can fly into. Now you need x,y and a z coord.  To get the virtual x,y
    screen coords for each point, take their 3d-x coord and divide by the 3d-z
    coord, and do the same for the y.  This will give you a real number, and
    reals are slow so here's an example of just that math using only integers.
    }
      X  : Integer; {3d x coord  -maxint to maxint, left to right}
      Y  : Integer;    {y            "         "    top to bottom}
      Z  : Integer;    {z   -1..-1023 where '-' is into screen}
      xx : integer; {2d x coord}
      yy : integer;    {y}

    xx:=vidwidth div 2  + longint(x)*1024 div z;
    yy:=vidheight div 2 + longint(y)*1024 div z;
    {
    That'll give you just plain depth scaling for one star.  For many stars,
    just keep an array like this for each of those:
    }
      X  : array [1..maxstars] of integer;
    {
    You'd basically follow this pattern:
    }
     for t:=1 to maxstars do
       begin
         {if star is visible, clear it}
         if getpixel(xx[t],yy[t])=starcolor then
           putpixel(xx[t],yy[t],backgroundcolor);
         {update star position}
         whatever math you want.  Maybe just:
         inc(z[t]);
         if z<=0 then
           begin
             x:=random(2048)-1024;
             y:=random(2048)-1024;
             z:=-1024;
           end;
         {translate 3d to 2d}
         xx[tt]:= {etc from above}
         {draw new points}
         if getpixel(xx[t],yy[t])=backgroundcolor then
           putpixel(xx[t],yy[t],starcolor);
       end;
    {
    of course this won't compile, but I assume you like to code and so I'm
    only giving you a general idea.  Then you can put another variable in, a
    for example, which is not an array but just a constant which indicated
    the "angle" of rotation around the z axis. (spinning)  it's easy to
    implement that into the equation without any 3d math stuff.
    }
    xx[tt]:=longint(x[t])*1024 div z[t] * sintable[a mod 360]
            div (sin table precision constant, usually 256);

    yy[tt]:=longint(y[t])*1024 div z[t] * costable[a mod 360]
            div 256;

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