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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 43

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ кривая рисуСтся ΡƒΠΆΠ΅ Π½Π΅ Π½Π° самой Ρ„ΠΎΡ€ΠΌΠ΅, Π° Π½Π° растрС, содСрТащСм Ρ„ΠΎΠ½. ПослС этого кривая пСрСстаСт ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ кривая ΠΈ становится Π½Π°Π±ΠΎΡ€ΠΎΠΌ пиксСлов Π½Π° Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅, Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вновь ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ интСрпрСтируСтся ΠΊΠ°ΠΊ созданиС Π½ΠΎΠ²ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ.

Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ листинг 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