|
Posledná zmena: 26.11.2002
|
polymorfizmus
|
Polymorfizmus
súkromná korytnačka:
|
Zadefinujte TMojaKor, ktorá bude
obsahovať svoju súkromnú korytnačku.
Táto sa bude pohybovať súčasne
s pôvodnou, ale bude mať nastavené
hrubé šedé pero (10).
Treba si dávať pozor na PH a PD.
|
type
TMojaKor = class(TKor)
private
kk:TKor;
public
constructor Create(xx,yy:real; uu:real=0);
destructor Destroy; override;
procedure ZmenXY(xx,yy:real); override;
end;
constructor TMojaKor.Create(xx,yy,uu:real);
begin
inherited;
kk:=TKor.Create(xx,yy,uu);
kk.HP:=10; kk.FP:=clLtGray;
end;
destructor TMojaKor.Destroy;
begin
kk.Free;
inherited;
end;
procedure TMojaKor.ZmenXY(xx, yy: real);
begin
if Dole then kk.ZmenXY(xx,yy)
else kk.PresunXY(xx,yy);
inherited;
end;
|
zistenie dĺžky cesty:
|
Korytnačka bude mať svoju súkromnú
premennú, v ktorej si bude počítať
prejdenú dĺžku. Najprv to vyriešte
pomocou Dopredu a potom ZmenXY. Momentálne
prejdená dĺžka bude prístupná
pomocou property dlzka - umožní
prístup len na čítanie
Treba si dávať pozor na to, či
je pero hore alebo dole.
|
type
TMojaKor1 = class(TKor) // alebo TMojaKor
private
dlz:real; // netreba inicializova5 na 0
public
procedure Dopredu(d:real); override; // buď
procedure ZmenXY(xx,yy:real); override; // alebo
property dlzka:real read dlz;
end;
procedure TMojaKor1.Dopredu(d: real);
begin
inherited;
if Dole then dlz:=dlz+d;
end;
/////////// alebo
procedure TMojaKor1.ZmenXY(xx, yy: real);
begin
if Dole then dlz:=dlz+vzd(xx,yy);
inherited;
end;
|
použitie zisťovania dĺžky cesty:
|
Korytnačku zadefinujte pomocou premennej
triedy TKor - aby bolo treba pretypovávať.
|
var
k:TKor;
begin
k:=TMojaKor1.Create(200,400);
...
Label1.Caption:=FloatToStr(TMojaKor1(k).dlzka);
k.Free;
end;
|
Hierarchia korytnačiek
štvorlístok:
|
Trieda TKor0 má definovanú
metódu stvorlistok na kreslenie
štvorlístka veľkosti d - 4
rovnostranné trojuholníky.
|
type
TKor0 = class(TKor)
procedure stvorlistok(d:real);
end;
procedure TKor0.stvorlistok(d: real);
var
i:integer;
begin
for i:=1 to 12 do begin
Dopredu(d);
if i mod 3=0 then Vpravo(210)
else Vpravo(120);
end;
end;
|
prerušované Dopredu:
|
Trieda TKor1 - potomok TKor0 - kreslí
prerušované Dopredu - prejdená
dĺžka sa rozdelí na tretiny a strednú
prejde so zdvihnutým perom.
|
type
TKor1 = class(TKor0)
procedure Dopredu(d:real); override;
end;
procedure TKor1.Dopredu(d: real);
var
b:boolean;
begin
b:=Dole;
inherited Dopredu(d/3);
PH;
inherited Dopredu(d/3);
if b then PD;
inherited Dopredu(d/3);
end;
|
tieňované Dopredu:
|
|
type
TKor2 = class(TKor1)
procedure Dopredu(d:real); override;
end;
procedure TKor2.Dopredu(d: real);
var
f:Tcolor;
begin
f:=FP; FP:=clLtGray; HP:=HP+3;
inherited; // Dopredu(d);
inherited Dopredu(-d);
FP:=f; HP:=HP-3;
inherited; // Dopredu(d);
end;
|
použitie:
|
Po zatlačení tlačidla sa na náhodnom
mieste s náhodným uhlom vygeneruje
korytnačka - náhodne sa zvolí
jedna z TKor0, TKor1 a TKor2. Potom táto
korytnačka nakreslí náhodne
veľký (20..40) štvorlístok.
|
procedure TForm1.Button1Click(Sender: TObject);
var
k:TKor;
x,y,u:integer;
begin
randomize;
x:=random(400); y:=random(400); u:=random(360);
case random(3) of
0: k:=TKor0.Create(x,y,u);
1: k:=TKor1.Create(x,y,u);
2: k:=TKor2.Create(x,y,u);
end;
k.FP:=clGreen;
TKor0(k).stvorlistok(20+random(21));
k.Free;
end;
|
Kreslenie korytnačkou
zrkadlová korytnačka:
|
Trieda TMojaKor1 bude preklápať
súradnice tak, aby pohyb korytnačky
bol symetrický podľa myslenej y-ovej
osi prechádzajúcej stredom
plochy.
|
type
TMojaKor1 = class(TKor)
procedure ZmenXY(xx,yy:real); override;
end;
procedure TMojaKor1.ZmenXY(xx, yy: real);
begin
inherited ZmenXY(sirka-xx,yy);
end;
|
kreslenie rukou:
|
Časť programu využije TMojaKor1 a zabezpečí
kreslenie dvomi korytnačkami (obyčajnou
a zrkadlovou).
Zamyslite sa prečo v Image1MousDown
korytnačka k1 nemôže robiť
PresunXY ako korytnačka k,
ale musí použiť ZmenXY so
zdvihnutým perom.
|
var
k,k1:TKor;
procedure TForm1.FormCreate(Sender: TObject);
begin
k:=TKor.Create;
k1:=TMojaKor1.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
k.Free; k1.Free;
end;
procedure TForm1.Image1MouseDown(...);
begin
k.PresunXY(X,Y);
k1.PH; k1.ZmenXY(X,Y); k1.PD;
end;
procedure TForm1.Image1MouseMove(...);
begin
if Shift=[ssLeft] then begin
k.ZmenXY(X,Y);
k1.ZmenXY(X,Y);
end;
end;
|
ndú:
|
Doplňte riešenie o ďalšie dve zrkadlové
korytnačky: podľa osi x a podľa oboch.
|
|
|

© 2002 AB, KVI blaho@fmph.uniba.sk
|