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

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

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

type

 // Π’ΠΈΠΏ TCurve Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС: Π½Π°Ρ‡Π°Π»ΠΎ,

 // ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, ΠΊΠΎΠ½Π΅Ρ†

 TCurve = array[0..3] of TPoint;


// Ѐункция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для LineDDA

procedure LineDrawFunc(X, Y: Integer; Canvas: TCanvas); stdcall;

begin

 case CurveForm.RGroupType.ItemIndex of

 // Π Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Π΅ ΡˆΠ°Ρ€ΠΈΠΊΠΈ

 0: if CurveForm.FCounter mod 10 = 0 then

 begin

  Canvas.Pen.Style := psSolid;

  Canvas.Pen.Width := 1;

  Canvas.Brush.Style := bsSolid;

  if CurveForm.FCounter mod 15 = 0 then Canvas.Pen.Color := clBlue

  else if CurveForm.FCounter mod 15 = 5 then Canvas.Pen.Color := сlLime

  else Canvas.Pen.Color := clRed;

  Canvas.Brush.Color := Canvas.Pen.Color;

  Canvas.Ellipse(X - 2, Y - 2, X + 3, Y + 3);

 end;

 // ΠŸΠΎΠΏΠ΅Ρ€Π΅Ρ‡Π½Ρ‹Π΅ полосы

 1: it CurveForm.FCounter mod 5 = 0 then

 begin

  Canvas.Pen.Style := psSolid;

  Canvas.Pen.Width := 1;

  Canvas.Pen.Color := clBlue;

  Canvas.MoveTo(X - CurveForm.FDX, Y - CurveForm.FDY);

  Canvas.LineTo(X + CurveForm.FDX, Y + CurveForm.FDY);

 end;

 // ΠŸΠ»Π°ΠΊΠ°Ρ‚Π½ΠΎΠ΅ ΠΏΠ΅Ρ€ΠΎ

 2: begin

  Canvas.Pen.Style := psSolid;

  // ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, нСкоторая Ρ‚ΠΎΡ‡ΠΊΠ° прямой ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (X, Y),

  // Π° сосСдняя с Π½Π΅ΠΉ - ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (Π₯+1, Y-1). Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ

  // Ρ‡Π΅Ρ€Π΅Π· эти Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π°ΠΊΠ»ΠΎΠ½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ

  // останутся Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠ°ΠΊ Π½Π° ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС.

  // ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½Ρƒ ΠΏΠ΅Ρ€Π°

  Canvas.Pen.Width := 2;

  Canvas.Pen.Color := clBlack;

  Canvas.MoveTo(X - 5, Y - 5);

  Canvas.LineTo(X + 6, Y + 6);

 end;

 // Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ°

 3: begin

  case CurveForm.FCounter mod 15 of

  0: begin

   Canvas.Pen.Style := psSolid;

   Canvas.Pen.Width := 1;

   Canvas.Pen.Color := clBlack;

   Canvas.Brush.Style := bsClear;

   Canvas.Ellipse(X - 5, Y - 5, X + 6, Y + 6);

  end;

  2..13: Canvas.Pixels[X, Y] := clBlack;

  end;

 end;

 end;

 Inc(CurveForm.FCounter);

end;


procedure TCurveForm.DrawCurve(Canvas: TCanvas);

var

 LCurve: TCurve;

 I, Size: Integer;

 PtBuf: array of TPoint;

 TpBuf: array of Byte;

 L: Extended;

begin

 // LCurve Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π°Ρ‡Π°Π»Π° ΠΈ ΠΊΠΎΠ½Ρ†Π° ΠΊΡ€ΠΈΠ²ΠΎΠΉ ΠΈ Π΅Π΅

 // ΠΎΠΏΠΎΡ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ. Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ рисования ΠΏΠΎ ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΌ

 // Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ, LCurve совпадаСт с FCurve, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ

 // рисования ΠΏΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ ΠΊΡ€ΠΈΠ²ΠΎΠΉ, ΠΎΠΏΠΎΡ€Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ LCurve[1]

 // ΠΈ LCurve[2] Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π² ΠΊΠ½ΠΈΠ³Π΅

 // Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°ΠΌ Π½Π° основании Ρ‚ΠΎΡ‡Π΅ΠΊ FCurve

 LCurve := FCurve;

 if RGroupDrawMethod.ItemIndex = 1 then

 begin

  LCurve[1].X :=

   Round((-5 * FCurve[0].X + 18 * FCurve[1].X -

   9 * FCurve[2].X + 2 * FCurve[3].X) / 6);

  LCurve[1].Y :=

   Round((-5 * FCurve[0].Y + 18 * FCurve[1].Y -

   9 * FCurve[2].Y + 2 * FCurve[3]-Y) / 6);

  LCurve[2].X :=

   Round((2 * FCurve[0].X - 9 * FCurve[1].X +

   18 * FCurve[2].X - 5 * FCurve[3].X) / 6);

  LCurve[2].Y :=

   Round((2 * FCurve[0].Y - 9 * FCurve[1].Y +

   18 * FCurve[2].Y - 5 * FCurve[3].Y) / 6);

 end;

 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π½Π° основС ΠΊΡ€ΠΈΠ²ΠΎΠΉ

 BeginPath(Canvas.Handle);

 Canvas.PolyBezier(LCurve);

 EndPath(Canvas.Handle);

 // АппроксимируСм Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°ΠΌΠΈ прямых

 FlattenPath(Canvas.Handle);

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ число Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ сами Ρ‚ΠΎΡ‡ΠΊΠΈ Π½ΠΈΠΊΡƒΠ΄Π°

 // ΠΏΠΎΠΊΠ° Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π² качСствС Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ

 // Π»ΡŽΠ±ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС - ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ I

 Size := GetPath(Canvas.Handle, I, I, 0);

 // ВыдСляСм ΠΏΠ°ΠΌΡΡ‚ΡŒ для хранСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ

 SetLength(PtBuf, Size);

 SetLength(TpBuf, Size);

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ Ρ‚ΠΈΠΏΡ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ. Π’ΠΈΠΏΡ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ нас Π² Π΄Π°Π½Π½ΠΎΠΌ случаС

 // Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚: Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΠΏ PT_MOVETO,

 // Π° Ρƒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… - PT_LINETO. ПоявлСниС PT_MOVETO Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ

 // Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚.ΠΊ. траСктория содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹ΠΉ

 // ΠΊΠΎΠ½Ρ‚ΡƒΡ€, состояний ΠΈΠ· ΠΊΡ€ΠΈΠ²ΠΎΠΉ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰Π΅ΠΉ Π΅Π΅ ΠΊΠΎΠ½Ρ†Ρ‹ прямой.

 // ПоявлСниС Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‚ΠΈΠΏΠ° PT_BEZIERTO Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‚.ΠΊ. послС

 // Π²Ρ‹Π·ΠΎΠ²Π° FlattenPath ΠΊΠΎΠ½Ρ‚ΡƒΡ€ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ прямых.

 // ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ значСния, записанныС Π² TpBuf, Π±ΡƒΠ΄ΡƒΡ‚ Π² дальнСйшСм

 // ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ

 GetPath(Canvas.Handle, PtBuf[0], TpBuf[0], Size);

 FCounter := 0;

 // РисуСм ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ², ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€

 for I := 1 to Size - 1 do

 begin

  // ВычисляСм Π΄Π»ΠΈΠ½Ρƒ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°

  L :=

   Sqrt(Sqr(PtBuf[I - 1].X - PtBuf[I].X) +

   Sqr(PtBuf[I - 1].Y - PtBuf[I].Y));

  // ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π°Π»Π°, Ρ‡Ρ‚ΠΎ аппроксимированный ΠΊΠΎΠ½Ρ‚ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚

  // ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ - Π²ΠΈΠ΄ΠΈΠΌΠΎ, это ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ

  // Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° аппроксимации. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² дальнСйшСм Π½Π°ΠΌ придСтся

  // Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° L, Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ ΠΌΡ‹ просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‚.ΠΊ.

  // Π½Π° экранС ΠΎΠ½ΠΈ всС Ρ€Π°Π²Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ

  if L > 0 then begin

   // ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ FDX ΠΈ FDY ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ рисовании

   // Π»ΠΈΠ½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° "ΠΏΠΎΠΏΠ΅Ρ€Π΅Ρ‡Π½Ρ‹Π΅ полосы". Если Π±Ρ‹ Π»ΠΈΠ½ΠΈΠΈ этого

   // Ρ‚ΠΈΠΏΠ° Π½Π΅ Π±Ρ‹Π»ΠΎ, Ρ‚ΠΎ FDX, FDY, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ L ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹

   // Π½Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ

   FDX := Round (4 * (PtBuf[I - 1].Y - PtBuf[I].Y) / L);

   FDY := Round(4 * (PtBuf[I].X - PtBuf[I - 1].X) / L);

   LineDDA(PtBuf[I - 1].X, PtBuf[I - 1].Y, PtBuf[I].X, PtBuf[I].Y,

    @LineDrawFunc, Integer(Canvas));

  end;

 end;

end;

1.3.4.5. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ кривая

Описанная тСхнология создания "Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ" Π»ΠΈΠ½ΠΈΠΈ Π½Π΅ годится для рисования ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅, Ρ‚. ΠΊ. ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π΅ Π΄Π²ΡƒΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ, Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…. Π£Π΄ΠΎΠ±Π½Π΅Π΅ всСго это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: сначала Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ "Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ" ΠΏΡ€ΡΠΌΡƒΡŽ, Π·Π°Π΄Π°Π² Ρ‚Π΅ΠΌ самым Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† ΠΊΡ€ΠΈΠ²ΠΎΠΉ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠΏΠΎΡ€Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. ΠŸΡ€ΠΈ этом Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π΄Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΠ½Ρ†Ρ‹ Π»ΠΈΠ½ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅ ΡΡ‚ΠΈΠ»ΡŒ, Ρ‚.Π΅. свободно ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Для Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ° Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ (рис. 1.16).

Π§Ρ‚ΠΎΠ±Ρ‹ кривая Π±Ρ‹Π»Π° Π±ΠΎΠ»Π΅Π΅ друТСствСнной для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ здСсь растровыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π° попытаСмся Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΊΡ€ΠΈΠ²ΡƒΡŽ Π±Π΅Π· искаТСния Ρ†Π²Π΅Ρ‚ΠΎΠ². Для этого Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΡ€ΠΈΠ²Ρ‹ΠΌΠΈ, ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ полоТСния Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ сначала Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ эту ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π½Π΅Π΅ β€” Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΊΡ€ΠΈΠ²ΡƒΡŽ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΠΎΠ½ Π² нашСм случаС состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· нарисованных Ρ€Π°Π½Π΅Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ просто Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ список, содСрТащий ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ ΡΡ‚ΠΈΠ»ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ, ΠΈ ΠΏΡ€ΠΈ пСрСрисовкС Ρ„ΠΎΠ½Π° сначала Π·Π°Π»ΠΈΠ²Π°Ρ‚ΡŒ всю Ρ„ΠΎΡ€ΠΌΡƒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π΅ΠΉ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· этих ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π·Π°Π½ΠΎΠ²ΠΎ. Но рисованиС ΠΎΠ΄Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ β€” достаточно мСдлСнная опСрация, Ρ‚.ΠΊ. Π½Π° основС ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°ΠΌΠΈ ΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ LineDDA. ΠŸΡ€ΠΈ большом количСствС ΠΊΡ€ΠΈΠ²Ρ‹Ρ… эта рСакция Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄: Π±ΡƒΠ΄Π΅Ρ‚ создан растр, содСрТащий всС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅, ΠΈ ΠΏΡ€ΠΈ пСрСрисовкС Ρ„ΠΎΡ€ΠΌΡ‹ этот растр Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅Π΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с растрами Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ быстро, мСрцания Ρ„ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ кривая Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΌΠ΅Ρ€Ρ†Π°Π»Π°, Π±ΡƒΠ΄Π΅Ρ‚ установлСн Ρ€Π΅ΠΆΠΈΠΌ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Рис. 1.16. Окно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Bezier. ΠšΡ€Π°ΡΠ½Ρ‹Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΈ β€” области Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Ρ‹ ΠΈ ΠΎΠΏΠΎΡ€Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ


Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° провСряСт, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ кривая. Если Ρ‚Π°ΠΊΠΈΡ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π½Π΅Ρ‚, начинаСтся созданиС Π½ΠΎΠ²ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€. ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ отпустит ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΈ, рисуСтся рСзиновая прямая. Π­Ρ‚Π° прямая становится Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΎΠΉ для Π½ΠΎΠ²ΠΎΠΉ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ.

Если Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ кривая ΡƒΠΆΠ΅ сущСствуСт, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΌΡ‹ΡˆΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ ΠΎΠΏΠΎΡ€Π½Ρ‹Ρ… ΠΈ ΠΊΠΎΠ½Ρ†Π΅Π²Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ, Ссли ΠΎΠ½ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ достаточно Π±Π»ΠΈΠ·ΠΊΠΈ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…, дальнСйшСС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΈ (ΠΏΡ€ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ пСрСрисовкС ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ИзмСнСниС Ρ‚ΠΈΠΏΠ° Π»ΠΈΠ½ΠΈΠΈ ΠΈ/ΠΈΠ»ΠΈ способа построСния отраТаСтся Π½Π° Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ β€” ΠΎΠ½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ пСрСрисовываСтся Π² соотвСтствии с Π½ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

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