Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³. Π—Π°Ρ‡Π΅ΠΌ?Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 5

Автор DarkGoodWIN

Допустим Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для рисования ΠΊΡ€ΡƒΠ³ΠΎΠ² ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рисуСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³, ΠΎΠ½ кладётся Π² массив Circles: array of TCircle, Π° ΠΊΠΎΠ³Π΄Π° рисуСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΎΠ½ кладётся Π² массив Rectangles: array of TRectangle.

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚, находится–ли заданная ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· нарисованных ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ» ΠΊΠ»ΠΈΠΊ ΠΌΡ‹ΡˆΠΈ ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ΠΈΠ², Ссли ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Π΅Π³ΠΎ.

Π—Π°Π²Π΅Π΄Ρ‘ΠΌ для этого Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ HitTest, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ True Π² случаС, Ссли наша Ρ‚ΠΎΡ‡ΠΊΠ° находится Π²Π½ΡƒΡ‚Ρ€ΠΈ графичСского ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° ΠΈ False Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС:


type

TCircle = class(TObject)

public

X: Integer;

Y: Integer;

D: Integer;

function HitTest(aX, aY: Integer): Boolean;

end;


type

TRectangle = class(TObject)

public

X1: Integer;

Y1: Integer;

X2: Integer;

Y2: Integer;

function HitTest(X, Y: Integer): Boolean;

end;


function TCircle. HitTest(aX, aY: Integer): Boolean;

begin

Result:= Sqrt(Sqr(X β€” aX) + Sqr(Y β€” aY)) <= D;

end;


function TRectangle. HitTest(X, Y: Integer): Boolean;

begin

Result:= (X1 <= X) and (X <= X2) and (Y1 <= Y) and (Y <= Y2);

end;

Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° рСализация классов, Π° Ρ‚ΡƒΡ‚ рСализация Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HitTest, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всС наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:


var

Circles: array of TCircle;

Rectangles: array of TRectangle;


function HitTest(X, Y: Integer): Boolean;

var

I: Integer;

begin

Result:= False;

for I:= 0 to Length(Rectangles) β€” 1 do

begin

Result:= Rectangles[I].HitTest(X, Y);

if Result then

Exit;

end;

for I:= 0 to Length(Circles) β€” 1 do

begin

Result:= Circles[I].HitTest(X, Y);

if Result then

Exit;

end;

end;


НС слишком ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Ρƒ нас дСсятки ΠΈ Π΄Π°ΠΆΠ΅ сотни. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ΅Π½ свой массив, ΠΈ свой Ρ†ΠΈΠΊΠ» для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HitTest? Π•ΡΡ‚ΡŒ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ наслСдованиС.

Π’ Ρ‡Ρ‘ΠΌ Ρ‚ΡƒΡ‚ смысл? ВмСсто Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… массивов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ графичСского ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π·Π°Π²ΠΎΠ΄ΠΈΠΌ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт графичСский ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², Π½Π°Π·ΠΎΠ²Ρ‘ΠΌ Π΅Π³ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, TShape. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС наши ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹, нСзависимо ΠΎΡ‚ ΠΈΡ… Ρ‚ΠΈΠΏΠ° Π² массивС Β«Shapes: array of TShapeΒ». Но Ρ‚Π°ΠΊ просто Ρƒ нас это Π½Π΅ получится, компилятор ругнётся, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ Π½Π΅ совмСстимы.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ смогли ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ наши ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΈ ΠΊΡ€ΡƒΠ³ΠΈ Π² массив TShape, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… наслСдованиС. Π—Π°ΠΌΠ΅Π½ΠΈΠΌ TObject Π½Π° TShape Π² объявлСнии класса:


type

TShape = class(TObject)

end;


TCircle = class(TShape)

public

…..

end;


TRectangle = class(TShape)

public

…..

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш ΠΊΡ€ΡƒΠ³ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΊΡ€ΡƒΠ³ ΠΈ графичСский ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², Ρ€Π°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈ ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π΅. Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния программирования? Π’ΠΎ, Ρ‡Ρ‚ΠΎ класс TCircle, наслСдник класса TShape ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс TShape. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса TShape (ΠΊΡ€ΠΎΠΌΠ΅ private) Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ доступны Π² классС TCircle.

НС Π±ΡƒΠ΄Ρƒ сильно ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Ρ‚Π΅ΠΎΡ€ΠΈΡŽ, всё–таки я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, поэтому сразу ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ измСнится наша функция с ΠΏΠΎΠΏΠΌΠΎΡ‰ΡŒΡŽ этого Π½Π΅Ρ…ΠΈΡ‚Ρ€ΠΎΠ³ΠΎ прСобразования:


var

Shapes: array of TShape;


function HitTest(X, Y: Integer): Boolean;

var

I: Integer;

begin

Result:= False;

for I:= 0 to Length(Shapes) β€” 1 do

begin

if Shapes[I] is TCircle then

Result:= (Shapes[I] as TCircle).HitTest(X, Y)

else if Shapes[I] is TRectangle then

Result:= (Shapes[I] as TRectangle).HitTest(X, Y)

if Result then

Exit;

end;

end;

На самом Π΄Π΅Π»Π΅ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ красиво. ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, поддСрТиваСт–ли ΠΎΠ½ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ Ρ‚ΠΈΠΏ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ is) ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ as). ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ is ΠΈ as ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с простыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΌΠΎΡ‰ΡŒ наслСдования Π½Π°ΠΌ остался всСго ΠΎΠ΄ΠΈΠ½ шаг. Π’ класс TShape Π΄ΠΎΠ±Π°Π²ΠΈΠΌ строку Β«function HitTest(X, Y: Integer): Boolean; virtual; abstract;”, Π° Π² классы TCircle ΠΈ TRectangle Π΄ΠΎΠ±Π°Π²ΠΈΠΌ послС Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… строчСк ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово override:


type

TShape = class(TObject)

public

function HitTest(X, Y: Integer): Boolean; virtual; abstract;

end;


TCircle = class(TShape)

public

 β€¦..

function HitTest(X, Y: Integer): Boolean; override;

end;


TRectangle = class(TShape)

public

…..

function HitTest(X, Y: Integer): Boolean; override;

end;

Π§Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚? ΠœΡ‹ ΠΊΠ°ΠΊ Π±Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ класс TShape Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠΎΠΏΠ°Π»ΠΈ Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π½ΠΎ конкрСтная рСализация зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. Π’ΠΎ Π΅ΡΡ‚ΡŒ абстрактно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΅ΡΡ‚ΡŒ, Π½ΠΎ Π΅Ρ‘ рСализация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² классах ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ….

ΠΠ°ΡˆΡƒ ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€Π°Π΄Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:


var

Shapes: array of TShape;


function HitTest(X, Y: Integer): Boolean;

var

I: Integer;

begin

Result:= False;

for I:= 0 to Length(Shapes) β€” 1 do

begin

Result:= Shapes[I].HitTest(X, Y);

if Result then

Exit;

end;

end;

ΠŸΡ€ΠΈ этом, Π² ΡΠ»ΡƒΡ‡Π°ΡŽ ΠΊΡ€ΡƒΠ³ΠΎΠ², Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ функция TCircle. HitTest, Π° Π² случаС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² β€” TRectangle. HitTest.

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² случаС с ΠΎΠ΄Π½ΠΎΠΉ абстрактной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΡŒ Π½Π΅ совсСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½, Π½ΠΎ вСдь ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

TShape. Move(dx, dy: Integer); virtual; abstract;

для пСрСмСщСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°,

TShape. Rotate(x, y: Integer; angel: Double); virtual; abstract;

для ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚ΠΎΡ‡ΠΊΠΈ,

TShape. Flip(Line: TLine); virtual; abstract;

для Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния Π²ΠΎΠΊΡ€ΡƒΠ³ прямой.

РСализация Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· классов наслСдников, ΠΎΠ΄Π½Π°ΠΊΠΎ сама Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊΠΎ всСм графичСским ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌ.