home *** CD-ROM | disk | FTP | other *** search
- {
- Hello !
-
- NOR vagyok a XEED Crew-ból. Már sok DiskMag-ban és újságban láttam vektor-
- rutint, de ezek általában csak azoknak nyújtanak némi segítséget, akik lônek
- valamennyit az Assembler-hez ! A kezdôknek, akik szeretnének valamilyen kis
- Demo-féleséget összehozni ez nem sokat segít. Az igaz, hogy sokkal gyorsabb
- az ASM rutin, de egy kezdô számára ez kínaiul van.
- Ezért közlök itt egy Turbo Pascal-ban íródott pontforgató rutint.
- A forrás kommentezve van, talán mindenkinek érthetô a lesz.
- A prg 640x480 16 színû grafikus üzemmódban mûködik, nincs optimizálva, de
- ha csak pár pontból áll a forgatott alakzat, akkor a sebessége elég tûrhetô.
- A prg pontból vetítést alkalmaz, ez azért jó, mert sokkal COOL-abban néz ki
- az alakzat, mint axonometrikus vetítés esetén. (Ha valaki mégis axonmetrikus
- vetítést akar, akkor törölje ki a p.v. leképzést és vegye ki a kommentbôl az
- ax. leképzést !)
- A forgatott test azért villog, mert közvetlenül a videomemóriába ír a prg, ha
- ez ki akarjátok kerülni, akkor egy háttéképernyôre rajzoljatok, majd azt má-
- soljátok be a videomemóriába.
- Pár tipp a forráshoz:
- - Ha ax XNo,YNo,ZNo változók a prg során nem változnak (általában igaz)
- akkor a forgatómátrixot elég egyszer kiszámolni a kezdô fokszámokkal
- (ilyenkor az XFok=XNo,YFok=YNo,ZFok=ZNo -vel), majd ezután az elforgatott
- pontokat tartalmazó tömb tartalmát mindíg el kell menteni, majd ezzel kell
- szorozni a PM kiszámításakor !
- - Az ErnyoTav és Eltolas értékének megváltoztatása segítségével könnyen
- változtathatjuk a kocka méretét. A két változó ne legyen egyenlô, mert
- akkor rondán néz ki az alakzat !
-
- ìme a várva várt rutin :
- }
- Program Pontforgato_rutin;
- Uses Crt,Graph;
- Const
- XFok:Integer=0; { X irányú elforgatás változója }
- YFok:Integer=90; { Y irányú elforgatás változója }
- ZFok:Integer=0; { Z irányú elforgatás változója }
- XNo:Integer=-2; { X növekmény "" }
- YNo:Integer=2; { Y növekmény "" }
- ZNo:Integer=-2; { Z növekmény "" }
- XK:Word=319; { X irányú középpont a képernyôn }
- YK:Word=239; { Y irányú középpont a képernyôn }
- ErnyoTav:Word=400; { Pontból vetítés ernyôtávolsága }
- Eltolas:Word=300; { Pontból vetítés eltolása }
-
- KockaPontok=8;
- Kocka:Array[1..KockaPontok,1..3] Of Integer=
- ((-80,-80,+80),(+80,-80,+80),(-80,+80,+80),(+80,+80,+80),
- (-80,-80,-80),(+80,-80,-80),(-80,+80,-80),(+80,+80,-80));
- KockaVonalak=12;
- KockaVonal:Array[1..KockaVonalak,1..2] Of Byte=
- ((1,2),(2,4),(4,3),(3,1),(1,5),(5,6),
- (6,2),(3,7),(7,8),(8,4),(5,7),(6,8));
- { A kocka pontjainak és vonalainak adatai }
- Var
- SinT,CosT:Array[0..359] Of Real; { Sinus,Cosinus táblázat }
- Kocka2:Array[1..KockaPontok,1..3] Of Integer; { Kirajzolandó pontok }
-
- Procedure Inicializalas;
- Var
- I:Word;
- Gd,Gm:Integer;
-
- Begin
- Gd:=9;Gm:=2;
- InitGraph(Gd,Gm,'C:\TP\BGI'); { 640x480 16 színü gr.mód bekapcsolása }
- For I:=0 to 359 do Begin { Sinus,Cosinus táblázat kitöltése }
- SinT[I]:=Sin(I*Pi/180);
- CosT[I]:=Cos(I*Pi/180);
- End;
- End;
-
- Procedure Forgatas;
- Var
- PM:Array[1..3] Of Real;
- FM:Array[1..3,1..3] Of Real;
- I:Word;
-
- Begin
- { A forgatómátrix kitöltése az XFok,YFok,ZFok-tól függôen }
- For I:=1 to KockaPontok do
- Begin
- FM[1,1]:=CosT[YFok]*CosT[ZFok];
- FM[2,1]:=-CosT[YFok]*SinT[ZFok];
- FM[3,1]:=SinT[YFok];
- FM[1,2]:=CosT[XFok]*SinT[ZFok]+SinT[XFok]*SinT[YFok]*CosT[ZFok];
- FM[2,2]:=CosT[XFok]*CosT[ZFok]-SinT[XFok]*SinT[YFok]*SinT[ZFok];
- FM[3,2]:=-SinT[XFok]*CosT[YFok];
- FM[1,3]:=SinT[XFok]*SinT[ZFok]-CosT[XFok]*SinT[YFok]*CosT[ZFok];
- FM[2,3]:=SinT[XFok]*CosT[ZFok]+CosT[XFok]*SinT[YFok]*SinT[ZFok];
- FM[3,3]:=CosT[XFok]*CosT[YFok];
- End;
- { Az XFok,YFok,ZFok növelése és a túl- és alulcsordulás kezelése }
- Inc(XFok,XNo);
- If XFok>=360 Then XFok:=XFok-360
- Else If XFok<0 Then XFok:=XFok+360;
- Inc(YFok,XNo);
- If YFok>=360 Then YFok:=YFok-360
- Else If YFok<0 Then YFok:=YFok+360;
- Inc(ZFok,XNo);
- If ZFok>=360 Then ZFok:=ZFok-360
- Else If ZFok<0 Then ZFok:=ZFok+360;
- For I:=1 to KockaPontok do
- Begin
- { A PM vektorba az elforgatott X,Y,Z koordináták kiszámolása }
- PM[1]:=FM[1,1]*Kocka[I,1]+FM[2,1]*Kocka[I,2]+FM[3,1]*Kocka[I,3];
- PM[2]:=FM[1,2]*Kocka[I,1]+FM[2,2]*Kocka[I,2]+FM[3,2]*Kocka[I,3];
- PM[3]:=FM[1,3]*Kocka[I,1]+FM[2,3]*Kocka[I,2]+FM[3,3]*Kocka[I,3];
- { Axonometrikus vetítés esetén a tényleges koordináták kiszámolása }
- { Kocka2[I,1]:=XK+Round(PM[1]);
- Kocka2[I,2]:=YK+Round(PM[2]);
- Kocka2[I,3]:=Round(PM[3]); }
- { Pontból vetítés esetén a tényleges koordináták kiszámolása }
- Kocka2[I,1]:=XK+Round((PM[1]*ErnyoTav)/(PM[3]+Eltolas));
- Kocka2[I,2]:=YK+Round((PM[2]*ErnyoTav)/(PM[3]+Eltolas));
- Kocka2[I,3]:=Round(PM[3]);
- End;
- End;
-
- Procedure Rajzolas(Szin:Byte);
- Var
- I:Word;
-
- Begin
- SetColor(Szin); { Vonalszín beállítása }
- For I:=1 to KockaVonalak do { A kocka oldalvonalainak kirajzolása }
- Line(Kocka2[KockaVonal[I,1],1],Kocka2[KockaVonal[I,1],2],
- Kocka2[KockaVonal[I,2],1],Kocka2[KockaVonal[I,2],2]);
- End;
-
- Begin
- Inicializalas;
- Repeat
- Forgatas;
- Rajzolas(15);
- Delay(10);
- Rajzolas(0);
- Until KeyPressed;
- ReadKey;
- CloseGraph;
- End.
- {
- Hát ez volna a cikk vége, remélem tudja valaki használni ezt a forrást.
- U.i. Aki ennél jóval gyorsabbat akar az használjon olyan rutint, ami egész
- számokkal dolgozik és az se árt ha ASM-ban van írva ! (Én is ezt csinálom !)
-
- NOR OF XεεD
- }