home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / demodisc / tyrant / vector / forgator.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-03-13  |  5.8 KB  |  148 lines

  1. {
  2.                                     Hello !
  3.  
  4.  NOR vagyok a XEED Crew-ból. Már sok DiskMag-ban és újságban láttam vektor-
  5.  rutint, de ezek általában csak azoknak nyújtanak némi segítséget, akik lônek
  6.  valamennyit az Assembler-hez ! A kezdôknek, akik szeretnének valamilyen kis
  7.  Demo-féleséget összehozni ez nem sokat segít. Az igaz, hogy sokkal gyorsabb
  8.  az ASM rutin, de egy kezdô számára ez kínaiul van.
  9.  Ezért közlök itt egy Turbo Pascal-ban íródott pontforgató rutint.
  10.  A forrás kommentezve van, talán mindenkinek érthetô a lesz.
  11.  A prg 640x480 16 színû grafikus üzemmódban mûködik, nincs optimizálva, de
  12.  ha csak pár pontból áll a forgatott alakzat, akkor a sebessége elég tûrhetô.
  13.  A prg pontból vetítést alkalmaz, ez azért jó, mert sokkal COOL-abban néz ki
  14.  az alakzat, mint axonometrikus vetítés esetén. (Ha valaki mégis axonmetrikus
  15.  vetítést akar, akkor törölje ki a p.v. leképzést és vegye ki a kommentbôl az
  16.  ax. leképzést !)
  17.  A forgatott test azért villog, mert közvetlenül a videomemóriába ír a prg, ha
  18.  ez ki akarjátok kerülni, akkor egy háttéképernyôre rajzoljatok, majd azt má-
  19.  soljátok be a videomemóriába.
  20.  Pár tipp a forráshoz:
  21.   - Ha ax XNo,YNo,ZNo változók a prg során nem változnak (általában igaz)
  22.     akkor a forgatómátrixot elég egyszer kiszámolni a kezdô fokszámokkal
  23.     (ilyenkor az XFok=XNo,YFok=YNo,ZFok=ZNo -vel), majd ezután az elforgatott
  24.     pontokat tartalmazó tömb tartalmát mindíg el kell menteni, majd ezzel kell
  25.     szorozni a PM kiszámításakor !
  26.   - Az ErnyoTav és Eltolas értékének megváltoztatása segítségével könnyen
  27.     változtathatjuk a kocka méretét. A két változó ne legyen egyenlô, mert
  28.     akkor rondán néz ki az alakzat !
  29.  
  30.  ìme a várva várt rutin :
  31. }
  32. Program Pontforgato_rutin;
  33.  Uses Crt,Graph;
  34.   Const
  35.     XFok:Integer=0;          { X irányú elforgatás változója }
  36.     YFok:Integer=90;         { Y irányú elforgatás változója }
  37.     ZFok:Integer=0;          { Z irányú elforgatás változója }
  38.     XNo:Integer=-2;          { X növekmény "" }
  39.     YNo:Integer=2;           { Y növekmény "" }
  40.     ZNo:Integer=-2;          { Z növekmény "" }
  41.     XK:Word=319;             { X irányú középpont a képernyôn }
  42.     YK:Word=239;             { Y irányú középpont a képernyôn }
  43.     ErnyoTav:Word=400;       { Pontból vetítés ernyôtávolsága }
  44.     Eltolas:Word=300;        { Pontból vetítés eltolása }
  45.  
  46.     KockaPontok=8;
  47.     Kocka:Array[1..KockaPontok,1..3] Of Integer=
  48.           ((-80,-80,+80),(+80,-80,+80),(-80,+80,+80),(+80,+80,+80),
  49.            (-80,-80,-80),(+80,-80,-80),(-80,+80,-80),(+80,+80,-80));
  50.     KockaVonalak=12;
  51.     KockaVonal:Array[1..KockaVonalak,1..2] Of Byte=
  52.                ((1,2),(2,4),(4,3),(3,1),(1,5),(5,6),
  53.                 (6,2),(3,7),(7,8),(8,4),(5,7),(6,8));
  54.     { A kocka pontjainak és vonalainak adatai }
  55.   Var
  56.     SinT,CosT:Array[0..359] Of Real;               { Sinus,Cosinus táblázat }
  57.     Kocka2:Array[1..KockaPontok,1..3] Of Integer;  { Kirajzolandó pontok }
  58.  
  59. Procedure Inicializalas;
  60.  Var
  61.    I:Word;
  62.    Gd,Gm:Integer;
  63.  
  64. Begin
  65.   Gd:=9;Gm:=2;
  66.   InitGraph(Gd,Gm,'C:\TP\BGI');  { 640x480 16 színü gr.mód bekapcsolása }
  67.   For I:=0 to 359 do Begin        { Sinus,Cosinus táblázat kitöltése }
  68.                        SinT[I]:=Sin(I*Pi/180);
  69.                        CosT[I]:=Cos(I*Pi/180);
  70.                      End;
  71. End;
  72.  
  73. Procedure Forgatas;
  74.  Var
  75.    PM:Array[1..3] Of Real;
  76.    FM:Array[1..3,1..3] Of Real;
  77.    I:Word;
  78.  
  79. Begin
  80.   { A forgatómátrix kitöltése az XFok,YFok,ZFok-tól függôen }
  81.   For I:=1 to KockaPontok do
  82.   Begin
  83.     FM[1,1]:=CosT[YFok]*CosT[ZFok];
  84.     FM[2,1]:=-CosT[YFok]*SinT[ZFok];
  85.     FM[3,1]:=SinT[YFok];
  86.     FM[1,2]:=CosT[XFok]*SinT[ZFok]+SinT[XFok]*SinT[YFok]*CosT[ZFok];
  87.     FM[2,2]:=CosT[XFok]*CosT[ZFok]-SinT[XFok]*SinT[YFok]*SinT[ZFok];
  88.     FM[3,2]:=-SinT[XFok]*CosT[YFok];
  89.     FM[1,3]:=SinT[XFok]*SinT[ZFok]-CosT[XFok]*SinT[YFok]*CosT[ZFok];
  90.     FM[2,3]:=SinT[XFok]*CosT[ZFok]+CosT[XFok]*SinT[YFok]*SinT[ZFok];
  91.     FM[3,3]:=CosT[XFok]*CosT[YFok];
  92.   End;
  93.   { Az XFok,YFok,ZFok növelése és a túl- és alulcsordulás kezelése }
  94.   Inc(XFok,XNo);
  95.   If XFok>=360 Then XFok:=XFok-360
  96.    Else If XFok<0 Then XFok:=XFok+360;
  97.   Inc(YFok,XNo);
  98.   If YFok>=360 Then YFok:=YFok-360
  99.    Else If YFok<0 Then YFok:=YFok+360;
  100.   Inc(ZFok,XNo);
  101.   If ZFok>=360 Then ZFok:=ZFok-360
  102.    Else If ZFok<0 Then ZFok:=ZFok+360;
  103.   For I:=1 to KockaPontok do
  104.   Begin
  105.     { A PM vektorba az elforgatott X,Y,Z koordináták kiszámolása }
  106.     PM[1]:=FM[1,1]*Kocka[I,1]+FM[2,1]*Kocka[I,2]+FM[3,1]*Kocka[I,3];
  107.     PM[2]:=FM[1,2]*Kocka[I,1]+FM[2,2]*Kocka[I,2]+FM[3,2]*Kocka[I,3];
  108.     PM[3]:=FM[1,3]*Kocka[I,1]+FM[2,3]*Kocka[I,2]+FM[3,3]*Kocka[I,3];
  109.     { Axonometrikus vetítés esetén a tényleges koordináták kiszámolása }
  110.   { Kocka2[I,1]:=XK+Round(PM[1]);
  111.     Kocka2[I,2]:=YK+Round(PM[2]);
  112.     Kocka2[I,3]:=Round(PM[3]); }
  113.     { Pontból vetítés esetén a tényleges koordináták kiszámolása }
  114.     Kocka2[I,1]:=XK+Round((PM[1]*ErnyoTav)/(PM[3]+Eltolas));
  115.     Kocka2[I,2]:=YK+Round((PM[2]*ErnyoTav)/(PM[3]+Eltolas));
  116.     Kocka2[I,3]:=Round(PM[3]);
  117.   End;
  118. End;
  119.  
  120. Procedure Rajzolas(Szin:Byte);
  121.  Var
  122.    I:Word;
  123.  
  124. Begin
  125.   SetColor(Szin);                 { Vonalszín beállítása }
  126.   For I:=1 to KockaVonalak do     { A kocka oldalvonalainak kirajzolása }
  127.    Line(Kocka2[KockaVonal[I,1],1],Kocka2[KockaVonal[I,1],2],
  128.          Kocka2[KockaVonal[I,2],1],Kocka2[KockaVonal[I,2],2]);
  129. End;
  130.  
  131. Begin
  132.   Inicializalas;
  133.   Repeat
  134.     Forgatas;
  135.     Rajzolas(15);
  136.     Delay(10);
  137.     Rajzolas(0);
  138.   Until KeyPressed;
  139.   ReadKey;
  140.   CloseGraph;
  141. End.
  142. {
  143.  Hát ez volna a cikk vége, remélem tudja valaki használni ezt a forrást.
  144.  U.i. Aki ennél jóval gyorsabbat akar az használjon olyan rutint, ami egész
  145.  számokkal dolgozik és az se árt ha ASM-ban van írva ! (Én is ezt csinálom !)
  146.  
  147.                                                             NOR OF XεεD
  148. }