ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΠ°Π²Π΅ΡΡΠΈΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ ΠΊΡΠΈΠ²Π°Ρ ΡΠΈΡΡΠ΅ΡΡΡ ΡΠΆΠ΅ Π½Π΅ Π½Π° ΡΠ°ΠΌΠΎΠΉ ΡΠΎΡΠΌΠ΅, Π° Π½Π° ΡΠ°ΡΡΡΠ΅, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΌ ΡΠΎΠ½. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΊΡΠΈΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΡΠΈΠ²Π°Ρ ΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΏΠΈΠΊΡΠ΅Π»ΠΎΠ² Π½Π° ΡΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅, Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²Π½ΠΎΠ²Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ Π»ΠΈΡΡΠΈΠ½Π³ 1.61.
ΠΠΈΡΡΠΈΠ½Π³ 1.61. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉconst
// ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΡΠΎΡΠΊΡ ΠΊΡΠΈΠ²ΠΎΠΉ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΏΠ°ΡΡΡ ΠΌΡΡΡΡ
// Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΅Π΅ ΠΎΠΊΡΠ΅ΡΡΠ½ΠΎΡΡΡ. ΠΠΎΠ½ΡΡΠ°Π½ΡΠ° RectSize Π·Π°Π΄Π°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΎΠΉ
// ΠΎΠΊΡΠ΅ΡΡΠ½ΠΎΡΡΠΈ
RectSize = 3;
type
// Π’ΠΈΠΏ TDragPoint ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΡΡ ΡΠΎΡΠΊΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
// ptNone β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΠ½ΡΡΡ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΡΡ ΡΠΎΡΠΊΡ
// ptFirst - ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ Π²ΡΠΎΡΡΡ ΡΠΎΡΠΊΡ "ΡΠ΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ" ΠΏΡΡΠΌΠΎΠΉ
// ptBegin - ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ Π½Π°ΡΠ°Π»ΠΎ ΠΊΡΠΈΠ²ΠΎΠΉ
// ptInter1, ptInter2 - ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ
// ptEnd - ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠΎΠ½Π΅Ρ ΠΊΡΠΈΠ²ΠΎΠΉ
TDragPoint = (dpNone, dpFirst, dpBegin, dpInter1, dpInter2, dpEnd);
TCurveForm = class(TForm)
BtnEnd: TButton;
RGroupType: TRadioGrour;
RGroupDrawMethod: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure FomMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
procedure BtnEndClick(Sender: TObject);
procedure RGroupTypeClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
// ΠΡΠ»ΠΈ FNewLine = True, Π½Π΅Π·Π°Π²Π΅ΡΡΡΠ½Π½ΡΡ ΠΊΡΠΈΠ²ΡΡ Π½Π΅Ρ, ΠΈ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π°
// ΠΊΠ½ΠΎΠΏΠΊΡ ΠΌΡΡΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½ΠΎΠ²Π°Ρ ΠΊΡΠΈΠ²Π°Ρ.
// ΠΡΠ»ΠΈ FNewLine = False, Π΅ΡΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ ΠΊΡΠΈΠ²Π°Ρ, ΠΈ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΌΡΡΠΈ
// ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠΏΡΡΠΊΠΈ Π΅Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
FNewLine: Boolean;
// ΠΠΎΠ»Π΅ FDragPoint ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊΡΡ ΡΠΎΡΠΊΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
FDragPoint: TDragPoint;
// ΠΠΎΠ»Π΅ FCurve Ρ ΡΠ°Π½ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ
FCurve: TCurve;
// FBack - ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠΈΡΡΠ½ΠΎΠΊ Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΠΊΡΠΈΠ²ΡΠΌΠΈ
FBack: TBitmap;
// FCounter - ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΎΡΠ΅ΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉΡΡ ΠΏΡΠΈ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΡΡΠ΅Π·ΠΊΠΎΠ²
// Ρ ΠΏΠΎΠΌΠΎΡΡΡ LineDDA
FCounter: Integer;
// FDX, FDY - ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠΎΡΠΊΠΈ ΠΊΡΠΈΠ²ΠΎΠΉ Π΄Π»Ρ
// ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΏΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΎΡΡ
FDX, FDY: Integer;
// Π€ΡΠ½ΠΊΡΠΈΡ PtNearPt Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ True, Π΅ΡΠ»ΠΈ ΡΠΎΡΠΊΠ° Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ
// (X1, Y1) ΡΠ΄Π°Π»Π΅Π½Π° ΠΎΡ ΡΠΎΡΠΊΠΈ Pt ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π½Π΅ Π±ΠΎΠ»Π΅Π΅
// ΡΠ΅ΠΌ Π½Π° RectSize
functionPtNearPt(X1, Y1: Integer; const Pt: TPoint): Boolean;
// ΠΡΠΎΡΠ΅Π΄ΡΡΠ° DrawCurve ΡΠΈΡΡΠ΅Ρ ΠΊΡΠΈΠ²ΡΡ ΠΏΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌ FCurve Π²ΠΈΠ΄Π°,
// Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ RadioGroup.ItemIndex
procedure DrawCurve(Canvas: TCanvas);
end;
...
procedure TCurveForm.FormCreate(Sender: TObject);
begin
FNewLine := True;
FDragPoint := dpNone;
FBack := TBitmap.Create;
FBack.Canvas.Brush.Color := Color;
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΡΡΠ½ΠΊΠ° ΡΠ°Π²Π½ΡΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠΎΠ³ΠΎ
// Π½Π° Π²Π΅ΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΡΠΎΠ» ΠΎΠΊΠ½Π°
FBack.Width := GetSystemMetrics(SM_CXFULLSCREEN);
FBack.Height := GetSystemMetrics(SM_CYFULLSCREEN);
// ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΠΆΠΈΠΌ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ ΠΊΡΠΈΠ²Π°Ρ
// Π½Π΅ ΠΌΠ΅ΡΡΠ°Π»Π°
DoubleBuffered := True;
end;
procedure TCurveForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
// ΠΡΠ»ΠΈ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΡ ΠΊΡΠΈΠ²ΡΡ Π½Π΅Ρ, Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ
if FNewLine then
begin
FDragPoint := dpFirst;
FCurve[0].X := X;
FCurve[0].Y := Y;
FCurve[3] := FCurve[0];
end
else
begin
// ΠΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½Π°Ρ ΠΊΡΠΈΠ²Π°Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ, Π² ΠΊΠ°ΠΊΡΡ ΡΠΎΡΠΊΡ ΠΏΠΎΠΏΠ°Π»
// ΠΊΡΡΡΠΎΡ ΠΌΡΡΠΈ. Π‘ΡΡΠΎΠ³ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ,
// Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΡΡΠΎΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΊΡΡΡΠΎΡΠ° ΠΌΡΡΠΈ ΠΎΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ
// ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π΅ Π±ΡΠ»ΠΎ ΡΠΊΠ°ΡΠΊΠ°.
// ΠΠΎ Ρ.ΠΊ. ΠΎΠΊΡΠ΅ΡΡΠ½ΠΎΡΡΡ ΡΠΎΡΠΊΠΈ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»Π°, ΡΡΠΎΡ ΠΏΡΡΠΆΠΎΠΊ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ
// Π½Π΅Π·Π°ΠΌΠ΅ΡΠ΅Π½, ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π½Π΅Π±ΡΠ΅ΡΡ, ΡΡΠΎΠ±Ρ
// Π½Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
if PtNearPt(X, Y, FCurve[0]) then FDragPoint := dpBegin
else if PtNearPt(X, Y, FCurve[1]) then FDragPoint := dpInter1
else if PtNearPt(X, Y, FCurve[2]) then FDragPoint : = dpInter2
else if PtNearPt(X, Y, FCurve[3]) then FDragPoint := dpEnd
else FDragPoint := dpNone;
end;
end;
end;
procedure TCurveForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
begin
case FDragPoint of
dpFirst, dpEnd: begin
FCurve[3].X := X;
FCurve[3].Y := Y;
Refresh;
end;
dpBegin: begin
FCurve[0].X := X;
FCurve[0].Y := Y;
Refresh;
end;
dpInter1: begin
FCurve[1].X := X;
FCurve[1].Y := Y;
Refresh;
end;
dpInter2: begin
FCurve[2].X := X;
FCurve[2].Y := Y;
Refresh;
end;
end;
end;
end;
procedure TCurve Form.FormMouseUp(Sender: TObject; Button: Π’ΠouseButton; Shift: TShiftState; X, Y: Integer);
begin
// ΠΡΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡΠΏΡΡΠ΅Π½Π° ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΊΡΠΈΠ²ΠΎΠΉ, Π·Π½Π°ΡΠΈΡ,
// ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ» ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ ΠΏΡΡΠΌΠΎΠΉ, Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΡΠΎΡΠΎΠΉ
// Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π½ΠΎΠ²ΡΡ ΠΊΡΠΈΠ²ΡΡ
if (Button = mbLeft) and (FDragPoint = dpFirst) then
begin
FNewLine := False;
FDragPoint := dpNone;
// ΠΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΎ ΠΏΡΡΠΌΠΎΠΉ
FCurve[1].X := FCurve[0].X + Round((FCurve[3].X - FCurve[0].X) / 3);
FCurve[1].Y := FCurve[0].Y + Round((FCurve[3].Y - FCurve[0].Y) / 3);
FCurve[2].X := FCurve[0].X + Round(2 + (FCurve[3].X - FCurve[0].X) / 3);
FCurve[2].Y := FCurve[0].Y + Round(2 + (FCurve[3].Y - (Curve[0].Y) / 3);
Refresh;
end;
end;
procedure TCurveForm.FormPaint(Sender: TObject);
var
I: Integer;
L: Extended;
begin
// Π‘Π½Π°ΡΠ°Π»Π° Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ½
Canvas.Draw(0, 0, FBack);
if FNewLine then
begin
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ ΠΏΡΡΠΌΠΎΠΉ,
// ΡΠΈΡΡΠ΅ΠΌ ΠΏΡΡΠΌΡΡ ΠΎΡ ΡΠΎΡΠΊΠΈ FCurve[0] Π΄ΠΎ FCurve[3]. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ FCurve[1]
// ΠΈ FCurve[2] Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ
if FDragPoint = dpFirst then
begin
FCounter := 0;
L :=
Sqrt(Sqr(FCurve[0].X - FCurve[3].X) +
Sqr(FCurve[0].Y - FCurve[3].Y));
if L > 0 then
begin
FDX := Round(4 * (FCurve[0].Y -FCurve[3].Y) / L);
FDY := Round(4 * (FCurve[3].X - FCurve[0].X) / L);
LineDDA(FCurve[0].X, FCurve[0].Y, FCurve[3].X, FCurve[3].Y,
@LineDrawFunc, Integer(Canvas));
end;
end;
end
else
begin
// ΠΡΠ»ΠΈ Π΅ΡΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΡΠ½Π½Π°Ρ ΠΊΡΠΈΠ²Π°Ρ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
// ΠΏΠΎ ΠΎΠΏΠΎΡΠ½ΡΠΌ ΡΠΎΡΠΊΠ°ΠΌ, Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡΡΠ΅Π·ΠΊΠΈ, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠ΅ ΠΊΠ°ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅
// ΠΊ ΠΊΡΠΈΠ²ΠΎΠΉ Π² Π΅Ρ Π½Π°ΡΠ°Π»Π΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅
if RGroupDrawMethod.ItemIndex = 0 then
begin
Canvas.Pen.Style := psDot;
Canvas.Pen.Width := 3;
Canvas.Pen.Color := clDkGrey;
Canvas.MoveTo(FCurve[0].X, FCurve[0].Y);
Canvas.LineTo(FCurve[1].X, FCurve[1].Y);
Canvas.MoveTo(FCurve[3].X, FCurve[3].Y);
Canvas.LineTo(FCurve[2].X, FCurve[2].Y);
end;
// Π ΠΈΡΡΠ΅ΠΌ ΠΊΡΠ°ΡΠ½ΡΠ΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΡ, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠ΅ ΡΠΎΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
// ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ
Canvas.Pen.Style := psSolid;
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clRed;
Canvas.Brush.Style := bsClear;
for I := 0 to 3 do
Canvas.Rectangle(FCurve[I].X - RectSize, FCurve[I].Y - RectSize,
FCurve[I].X + RectSize + 1, FCurve[I].Y + RectSize + 1);
end;
end;
// ΡΡΠ½ΠΊΡΠΈΡ PtNearPt Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ True, Π΅ΡΠ»ΠΈ ΡΠΎΡΠΊΠ° Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ (X1, Y1)
// ΡΠ΄Π°Π»Π΅Π½Π° ΠΎΡ ΡΠΎΡΠΊΠΈ Pt ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π½Π° RectSize
function TCurveForm.PtNearPt(X1, Yl: Integer; const Pt: TPoint): Boolean;
begin
Result :=
(X1 >= Pt.X - RectSize) and (X1 <= Pt.X + RectSize) and
(Y1 >= Pt.Y - RectSize) and (Y1 <= Pt.Y + RectSize);
end;
procedure TCurveForm.BtnEndClick(Sender: TObject);
begin
if not FNewLine then