Mozgások
Ez a program síkbeli és térbeli
mozgásokat szimulál. A program fmMozgas főformjának stílusa: fsMDIForm, a sík
fmSik form és a tér fmTer stílusa: fsMDIChild. Azaz ez egy MDI alkalmazás,
melyben menük találhatók.
A főmenü amivel az egyes
formok hívhatók:
A
Sík form menüje, mellyel kiválaszthatjuk a mozgatni kívánt alakzatot, illetve
visszaléphetünk a főformra:
A
Tér form menüje, mellyel kiválaszthatjuk a kockát, mint mozgó testet, illetve
visszaléphetünk a főformra:
A Sík form futási képe, miközben egy
Hatszöget mozgat. A nyomógombok segítségével külön-külön az x és y irányba
történő lépés nagyságát (a mozgás sebességét), illetve az alakzat méretét
változtathatjuk. Mozgás közben az alakzat középpontja a képernyőn marad.
A Tér form futási képe, miközben rajta a kocka
rögzített középponttal forog. Nyomógombokkal az egyes irányok körüli forgás
sebességét változtathatjuk (szögváltozást két megjelenés között). A térbeliség
létrehozását a kocka oldallapjainak megvilágítottságának változásával oldjuk
meg. A fényforrás mögöttünk van, minél jobban elfordul a kocka lapja, annál
sötétebb zöld színű lesz:
A főmodul listája:
unit UMozgas;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Menus, USik, UTer;
type
TfmMozgasok = class(TForm)
MainMenu1: TMainMenu;
Sikbeli1: TMenuItem;
Sikbeli2: TMenuItem;
Trbeli2: TMenuItem;
N1: TMenuItem;
Kilps1: TMenuItem;
procedure Kilps1Click(Sender: TObject);
procedure Sikbeli2Click(Sender: TObject);
procedure Trbeli2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmMozgasok: TfmMozgasok;
implementation
{$R *.DFM}
procedure TfmMozgasok.Kilps1Click(Sender: TObject);
begin
Close;
end;
procedure TfmMozgasok.Sikbeli2Click(Sender: TObject);
Var fmSik:TfmSik;
begin
fmSik:= TfmSik.Create(Self);
fmSik.Show;
end;
procedure TfmMozgasok.Trbeli2Click(Sender: TObject);
Var fmTer: TfmTer;
begin
fmTer:= TfmTer.Create(Self);
fmTer.Show;
end;
end.
A síkbeli mozgások modulja:
unit USik;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls;
type
TfmSik = class(TForm)
MainMenu1: TMainMenu;
Sik1: TMenuItem;
miKor: TMenuItem;
miHaromszog: TMenuItem;
miNegyzet: TMenuItem;
miHatszog: TMenuItem;
N1: TMenuItem;
miKilepes: TMenuItem;
pnGomb: TPanel;
btX: TButton;
Timer1: TTimer;
btY: TButton;
btR: TButton;
procedure miKilepesClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure miKorClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btXClick(Sender: TObject);
procedure btYClick(Sender: TObject);
procedure btRClick(Sender: TObject);
procedure miHaromszogClick(Sender: TObject);
procedure miNegyzetClick(Sender: TObject);
procedure miHatszogClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmSik: TfmSik;
mx,my,mb: Integer;
x,y,r,dx,dy,dr: Integer;
al,dal: Integer;
kor, haromszog, negyzet, hatszog: Boolean;
Pontok: Array[0..6] Of TPoint;
implementation
Procedure Ki;
Begin
Kor:= False;
Haromszog:= False;
Negyzet:= False;
Hatszog:= False;
End;
Procedure Allit;
Begin
Inc(x,dx); If (x-r<0) Or (x+r>mx) Then dx:=-dx;
Inc(y,dy); If (y-r<0) Or (y+r+r>my) Then dy:=-dy;
Inc(r,dr); If (r<10) Or (r>100) Then dr:=-dr;
Inc(al,dal); al:= al mod 360;
End;
Procedure Forgat;
Var px, py: Real;
i: Byte;
Begin
For i:=0 To 6 do
Begin
px:= (Pontok[i].x-x)*Cos(al*pi/180)
-(Pontok[i].y-y)*Sin(al*pi/180);
py:= (Pontok[i].x-x)*Sin(al*pi/180)
+(Pontok[i].y-y)*Cos(al*pi/180);
Pontok[i].x:= Round(px)+x;
Pontok[i].y:= Round(py)+y;
End;
End;
{$R *.DFM}
procedure TfmSik.miKilepesClick(Sender: TObject);
begin
Close;
end;
procedure TfmSik.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TfmSik.FormCreate(Sender: TObject);
begin
mx:= GetDeviceCaps(Canvas.Handle,HorzRes);
my:= GetDeviceCaps(Canvas.Handle,VertRes);
mb:= GetDeviceCaps(Canvas.Handle,BitsPixel);
x:= mx div 2;
y:= my div 2;
r:= 20;
dx:= 1;
dy:= 1;
dr:= 0;
al:= 0;
dal:= 5;
Ki;
end;
procedure TfmSik.miKorClick(Sender: TObject);
begin
Ki; Kor:= True;
With Canvas Do
Begin
Brush.Color:=rgb(192,192,192);
Rectangle(0,0,mx,my);
Brush.Color:=rgb(0,0,192);
Ellipse(x-r,y-r,x+r,y+r);
Allit;
End;
end;
procedure TfmSik.Timer1Timer(Sender: TObject);
begin
If kor Then miKorClick(Sender);
If Haromszog Then miHaromszogClick(Sender);
If Negyzet Then miNegyzetClick(Sender);
If Hatszog Then miHatszogClick(Sender);
end;
procedure TfmSik.btXClick(Sender: TObject);
begin
dx:= dx+1;
btX.Caption:='DX='+IntToStr(dx);
end;
procedure TfmSik.btYClick(Sender: TObject);
begin
dy:= dy+1;
btY.Caption:='DY='+IntToStr(dy);
end;
procedure TfmSik.btRClick(Sender: TObject);
begin
dr:=dr+1;
btR.Caption:='DR='+IntToStr(dr);
end;
procedure TfmSik.miHaromszogClick(Sender: TObject);
begin
KI; Haromszog:= True;
Pontok[0].x:= x + r;
Pontok[0].y:= y;
Pontok[1].x:= x - Round(r/2);
Pontok[1].y:= y - Round(r*sqrt(3)/2);
Pontok[2].x:= x - Round(r/2);
Pontok[2].y:= y + Round(r*sqrt(3)/2);
Forgat;
With Canvas Do
Begin
Brush.Color:=rgb(192,192,192);
Rectangle(0,0,mx,my);
Brush.Color:=rgb(192,0,192);
Polygon(Slice(Pontok,3));
Allit;
End;
end;
procedure TfmSik.miNegyzetClick(Sender: TObject);
begin
KI; Negyzet:= True;
Pontok[0].x:= x + r;
Pontok[0].y:= y;
Pontok[1].x:= x;
Pontok[1].y:= y - r;
Pontok[2].x:= x - r;
Pontok[2].y:= y;
Pontok[3].x:= x;
Pontok[3].y:= y + r;
Forgat;
With Canvas Do
Begin
Brush.Color:=rgb(192,192,192);
Rectangle(0,0,mx,my);
Brush.Color:=rgb(192,0,192);
Polygon(Slice(Pontok,4));
Allit;
End;
end;
procedure TfmSik.miHatszogClick(Sender: TObject);
begin
KI; Hatszog:= True;
Pontok[0].x:= x + r;
Pontok[0].y:= y;
Pontok[1].x:= x + round(r/2);
Pontok[1].y:= y - Round(r*sqrt(3)/2);
Pontok[2].x:= x - Round(r/2);
Pontok[2].y:= y - Round(r*sqrt(3)/2);
Pontok[3].x:= x - r;
Pontok[3].y:= y;
Pontok[4].x:= x - Round(r/2);
Pontok[4].y:= y + Round(r*sqrt(3)/2);
Pontok[5].x:= x + Round(r/2);
Pontok[5].y:= y + Round(r*sqrt(3)/2);
Forgat;
With Canvas Do
Begin
Brush.Color:=rgb(192,192,192);
Rectangle(0,0,mx,my);
Brush.Color:=rgb(192,0,192);
Polygon(Slice(Pontok,6));
Allit;
End;
end;
end.
A térbeli mozgás modulja:
unit UTer;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls;
type
TfmTer = class(TForm)
MainMenu1: TMainMenu;
Tr1: TMenuItem;
miKocka: TMenuItem;
N1: TMenuItem;
miKilepes: TMenuItem;
pnGomb: TPanel;
btPAl: TButton;
Timer1: TTimer;
btPBe: TButton;
btPGa: TButton;
btMAl: TButton;
btMBe: TButton;
btMGa: TButton;
procedure miKilepesClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure miKockaClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure btPAlClick(Sender: TObject);
procedure btPBeClick(Sender: TObject);
procedure btPGaClick(Sender: TObject);
procedure btMAlClick(Sender: TObject);
procedure btMBeClick(Sender: TObject);
procedure btMGaClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const c = 80; {Vetítés kp-ja a képernyőtől}
t = 50; {A valós tér középpontja a képernyőtől}
a = 2; {A kocka fél élhossza}
qx = 15; {Pixelsűrűség centiméterenként}
qy = 12;
Cs = 8; {Csúcsok száma}
Lc = 4; {Lapok csúcsszáma}
Ls = 6; {Lapok száma}
Type Vekt = Array[1..3] Of Real;
Csucsok= Array[1..Cs] Of Vekt;
Lapok = Array[1..Ls,1..Lc] Of Byte;
Const KTest: Csucsok= (( a,-a, a), ( a,-a,-a), (-a,-a,-a), (-a,-a, a),
( a, a, a), ( a, a,-a), (-a, a,-a), (-a, a, a));
KTestL: Lapok= ((1,4,3,2),(1,2,6,5),(2,3,7,6),
(3,4,8,7),(1,5,8,4),(5,6,7,8));
Al : Integer= 1;
Be : Integer= 2;
Ga : Integer= 3;
var
fmTer: TfmTer;
mx,my,mb: Integer;
x,y,r,dx,dy,dr: Integer;
kx, ky: Integer;
Gomb, Kocka, Oktaeder: Boolean;
implementation
{$R *.DFM}
Procedure Ki;
Begin
Gomb:= False;
Kocka:= False;
Oktaeder:= False;
End;
Procedure Forgatas;
Var i: Byte;
Px, Py, Pz: Real;
SinAl, CosAl, SinBe, CosBe, SinGa, CosGa: Real;
Begin
SinAl:= Sin(Al*pi/180); CosAl:= Cos(Al*pi/180);
SinBe:= Sin(Be*pi/180); CosBe:= Cos(Be*pi/180);
SinGa:= Sin(Ga*pi/180); CosGa:= Cos(Ga*pi/180);
For i:= 1 To Cs Do
Begin
Px:= KTest[i,1]*CosBe*CosGa-KTest[i,2]*CosBe*SinGa+KTest[i,3]*SinBe;
Py:= KTest[i,1]*(CosAl*SinGa+SinAl*SinBe*CosGa)+
KTest[i,2]*(CosAl*CosGa-SinAl*SinBe*SinGa)-
KTest[i,3]*SinAl*CosBe;
Pz:= KTest[i,1]*(SinAl*SinGa-CosAl*SinBe*CosGa)+
KTest[i,2]*(SinAl*CosGa+CosAl*SinBe*SinGa)+
KTest[i,3]*CosAl*CosBe;
KTest[i,1]:= Px;
KTest[i,2]:= Py;
KTest[i,3]:= Pz;
End;
End;
Procedure VektSzor(a, b: Vekt; Var s: Vekt);
Begin
s[1]:= a[2]*b[3]-a[3]*b[2];
s[2]:= a[3]*b[1]-a[1]*b[3];
s[3]:= a[1]*b[2]-a[2]*b[1];
End;
Procedure VektKul(a, b: Vekt; Var k: Vekt);
Begin
k[1]:= a[1]-b[1];
k[2]:= a[2]-b[2];
k[3]:= a[3]-b[3];
End;
procedure TfmTer.miKilepesClick(Sender: TObject);
begin
Close;
end;
procedure TfmTer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TfmTer.FormCreate(Sender: TObject);
begin
ki;
mx:= GetDeviceCaps(Canvas.Handle,HorzRes);
my:= GetDeviceCaps(Canvas.Handle,VertRes);
mb:= GetDeviceCaps(Canvas.Handle,BitsPixel);
kx:= mx div 2;
ky:= my div 2;
end;
procedure TfmTer.miKockaClick(Sender: TObject);
Procedure Vetites;
Var Kp: Array[1..Lc+1] Of TPoint;
i, j: Byte;
s, k1, k2: Vekt;
CosDe: Real;
Begin
With Canvas Do
Begin
Brush.Color:=rgb(192,192,192);
Rectangle(0,0,mx,my);
For I:= 1 To Ls Do
Begin
For J:= 1 To Lc Do
Begin
If j = 1 Then
Begin
Kp[Lc+1].x:= Round(Kx + c * KTest[KTestL[i,j],1] * qx/
(c - t - KTest[KTestL[i,j],3]));
Kp[Lc+1].y:= Round(Ky - c * KTest[KTestL[i,j],2] * qy/
(c - t - KTest[KTestL[i,j],3]));
End;
Kp[j].x:= Round(Kx + c * KTest[KTestL[i,j],1] * qx/
(c - t - KTest[KTestL[i,j],3]));
Kp[j].y:= Round(Ky - c * KTest[KTestL[i,j],2] * qy/
(c - t - KTest[KTestL[i,j],3]));
End;
If Kp[1].x*(Kp[2].y-Kp[3].y)+
Kp[2].x*(Kp[3].y-Kp[1].y)+
Kp[3].x*(Kp[1].y-Kp[2].y)<0 Then
Begin
VektKul(KTest[KTestL[i,2]],KTest[KTestL[i,1]],K1);
VektKul(KTest[KTestL[i,3]],KTest[KTestL[i,2]],K2);
VektSzor(K1, K2, S);
CosDe:= s[3] / Sqrt(s[1]*s[1]+s[2]*s[2]+s[3]*s[3]);
Brush.Color:=rgb(0,
Round(255*CosDe),
Round(255*CosDe));
Polygon(Slice(Kp,Lc));
End;
End;
End;
End;
begin
Ki; Kocka:= True;
Vetites;
Forgatas;
end;
procedure TfmTer.Timer1Timer(Sender: TObject);
begin
If Kocka Then miKockaClick(Sender);
end;
procedure TfmTer.btPAlClick(Sender: TObject);
begin
Inc(Al);
btPAl.Caption:='+Al='+IntToStr(Al);
btMAl.Caption:='-Al='+IntToStr(Al);
end;
procedure TfmTer.btPBeClick(Sender: TObject);
begin
Inc(Be);
btPBe.Caption:='+Be='+IntToStr(Be);
btMBe.Caption:='-Be='+IntToStr(Be);
end;
procedure TfmTer.btPGaClick(Sender: TObject);
begin
Inc(Ga);
btPGa.Caption:='+Ga='+IntToStr(Ga);
btMGa.Caption:='-Ga='+IntToStr(Ga);
end;
procedure TfmTer.btMAlClick(Sender: TObject);
begin
Dec(Al);
btPAl.Caption:='+Al='+IntToStr(Al);
btMAl.Caption:='-Al='+IntToStr(Al);
end;
procedure TfmTer.btMBeClick(Sender: TObject);
begin
Dec(Be);
btPBe.Caption:='+Be='+IntToStr(Be);
btMBe.Caption:='-Be='+IntToStr(Be);
end;
procedure TfmTer.btMGaClick(Sender: TObject);
begin
Dec(GA);
btPGa.Caption:='+Ga='+IntToStr(Ga);
btMGa.Caption:='-Ga='+IntToStr(Ga);
end;
end.