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

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

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

Растровая опСрация влияСт Π½Π° всС, Ρ‡Ρ‚ΠΎ рисуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π° ΠΈ кисти, Ρ‚.Π΅. Π½Π° рисованиС Π³Ρ€Π°Π½ΠΈΡ† Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ ΠΈΡ… Π·Π°Π»ΠΈΠ²ΠΊΡƒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, растровая опСрация влияСт Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetPixel (ΠΈ, соотвСтствСнно, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Canvas.Pixels[X, Y]), Ρ‚.ΠΊ. эта опСрация выполняСтся с ΠΌΠΎΡ‰ΡŒΡŽ кистСй.

Код, Ρ€ΠΈΡΡƒΡŽΡ‰ΠΈΠΉ "Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ" линию, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 1.59.

Листинг 1.59. РисованиС "Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ" Π»ΠΈΠ½ΠΈΠΈ инвСрсным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ

procedure TLinesForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 if Button = mbLeft then begin

  OldX := X;

  OldY := Y;

  BegX := X;

  BegY := Y;

  LineDrawing := True;

 end;

end;


procedure TLinesForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

 if LineDrawing and ((X <> OldX) or (Y <> OldY)) then

  with Canvas do

 begin

  SetROP2(Handle, R2_NOT);

  Line(BegX, BegY, OldX, OldY); // Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ ΡΡ‚Π°Ρ€ΡƒΡŽ линию.

  Line(BegX, BegY, X, Y); // РисуСм Π½ΠΎΠ²ΡƒΡŽ.

  OldX := X;

  OldY := Y;

 end;

end;


procedure TLinesFom.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

 if (Button = mbLeft) and LineDrawing then

 begin

  case RGroupLine.ItemIndex of

  2: Canvas.Pen.Color := clBlue;

  3: begin

   Canvas.Brush.Color := clRed;

   Canvas.Pen.Color := clRed;

  end;

  4: Canvas.Pen.Color := clGreen;

  end;

  Line(BegX, BegY, X, Y);

  LineDrawing := False;

 end;

end;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ рСзиновая линия слСдуСт Π·Π° ΠΌΡ‹ΡˆΡŒΡŽ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ΡˆΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‚.Π΅. Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСния ΠΌΡ‹ΡˆΠΈ, ΠΊΠΎΠ³Π΄Π° курсор находится Π·Π° Π΅Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ. Π­Ρ‚ΠΎ становится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ благодаря Π·Π°Ρ…Π²Π°Ρ‚Ρƒ ΠΌΡ‹ΡˆΠΈ ΠΎΠΊΠ½ΠΎΠΌ. Π›ΡŽΠ±ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π² Windows ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡ‹ΡˆΡŒ для монопольного использования, ΠΈ Ρ‚ΠΎΠ³Π΄Π° всС сообщСния ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ это ΠΎΠΊΠ½ΠΎ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π³Π΄Π΅ находится курсор. Π’ VCL любой Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ установлСн ΡΡ‚ΠΈΠ»ΡŒ csCaptureMouse (Π° Ρƒ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠ½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ установлСн) автоматичСски Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡ‹ΡˆΡŒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ освобоТдаСт ΠΏΡ€ΠΈ Π΅Π΅ отпускании, поэтому ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π½Π°ΠΌ эффСкт автоматичСски.

1.3.4.3. ΠšΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” научимся Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ стилСм Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прямыС, Π½ΠΎ ΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Π΅. ΠŸΡ€ΠΎΡ‰Π΅ всСго это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΊΡ€ΠΈΠ²Ρ‹ΠΌΠΈ Π‘Π΅Π·ΡŒΠ΅ β€” ΠΎΠ½ΠΈ, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ систСмой Windows, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ (Π² частности, Π² Windows NT/2000 XP всС ΠΊΡ€ΠΈΠ²Ρ‹Π΅ β€” окруТности, эллипсы, Π΄ΡƒΠ³ΠΈ β€” Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΡ€ΠΈΠ²Ρ‹ΠΌΠΈ Π‘Π΅Π·ΡŒΠ΅).

Π’Π΅ΠΎΡ€ΠΈΡŽ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» П. Π΄Π΅ ΠšΠ°ΡΡ‚Π΅Π»ΠΎ Π² 1959 Π³ΠΎΠ΄Ρƒ ΠΈ, нСзависимо ΠΎΡ‚ Π½Π΅Π³ΠΎ, П. Π‘Π΅Π·ΡŒΠ΅ Π² 1962 Π³ΠΎΠ΄Ρƒ. Для построСния ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ N-Π³ΠΎ порядка Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ N+1 Ρ‚ΠΎΡ‡Π΅ΠΊ, Π΄Π²Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΊΠΎΠ½Ρ†Ρ‹ ΠΊΡ€ΠΈΠ²ΠΎΠΉ, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ N-1 Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΌΠΈ. Π’ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ наибольшСС распространСниС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅, строящиСся ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ, ΠΈ кубичСскиС ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅, строящиСся ΠΏΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ. ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΡˆΡ€ΠΈΡ„Ρ‚Π°Ρ… TrueType ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ² символов. Windows API позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ кубичСскиС ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅.

ΠšΡƒΠ±ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ:

P(t) = А(1-t)Β³ + 3Bt(1-t)Β² + 3CtΒ²(1-t)+DtΒ³ (1)

Π³Π΄Π΅ А β€” Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΡ€ΠΈΠ²ΠΎΠΉ, D β€” Π΅Π΅ ΠΊΠΎΠ½Π΅Ρ†, Π° Π’ ΠΈ Π‘ β€” пСрвая ΠΈ вторая ΠΎΠΏΠΎΡ€Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ. ΠŸΡ€ΡΠΌΠ°Ρ АВ ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΊ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ А, прямая CD β€” Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ D. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ t измСняСтся ΠΎΡ‚ 0 Π΄ΠΎ 1. ΠŸΡ€ΠΈ t = 0 P(t) = А, ΠΏΡ€ΠΈ t = 1 P(t) = D.

Одним ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… свойств ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ являСтся Π΅Π΅ Π΄Π΅Π»ΠΈΠΌΠΎΡΡ‚ΡŒ. Если ΠΊΡ€ΠΈΠ²ΡƒΡŽ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ t = 0,5, каТдая ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅. На этом свойствС основываСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ рисования ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅: Ссли кривая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно Ρ‚ΠΎΡ‡Π½ΠΎ аппроксимирована прямой, рисуСтся ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ прямой, Ссли Π½Π΅Ρ‚ β€” ΠΎΠ½Π° разбиваСтся Π½Π° Π΄Π²Π΅ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅, ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… вновь примСняСтся этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Для рисования ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅ слуТат Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PolyBezier, PolyBezierTo ΠΈ PolyDraw.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΡ€ΠΈΠ²ΡƒΡŽ Π‘Π΅Π·ΡŒΠ΅ Π½Π΅ ΠΏΠΎ ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ, Π° ΠΏΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΉΡ‚ΠΈ. ΠŸΡƒΡΡ‚ΡŒ кривая начинаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ А, ΠΏΡ€ΠΈ t=β…“ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΡƒ Π’', ΠΏΡ€ΠΈ t=β…”  β€” Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΡƒ Π‘', ΠΈ заканчиваСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ D. ΠŸΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ эти Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ (1), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ систСму, ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π’' ΠΈ Π‘' с Π’ ΠΈ Π‘ . РСшая систСму, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ

 (2)

Из этих ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, Π² частности, слСдуСт, Ρ‡Ρ‚ΠΎ для Π»ΡŽΠ±Ρ‹Ρ… Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ плоскости сущСствуСт, ΠΈ ΠΏΡ€ΠΈΡ‚ΠΎΠΌ СдинствСнная, кривая Π‘Π΅Π·ΡŒΠ΅, которая начинаСтся Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈ t=β…“ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, ΠΏΡ€ΠΈ t=β…” β€” Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΠΏΠΎΡ€Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ для ΠΊΡ€ΠΈΠ²ΠΎΠΉ, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… значСниях t.

1.3.4.4. Π’Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ 

API Windows Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ спСцифичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… траСкториями (path). ВраСктория прСдставляСт собой запись двиТСния ΠΏΠ΅Ρ€Π° ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ состоит ΠΈΠ· ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² прямых ΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅. Для построСния Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Windows NT/2000/XP ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ задСйствованы всС графичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рисования прямых, ΠΊΡ€ΠΈΠ²Ρ‹Ρ… ΠΈ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Скста (Π² этом случаС Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°ΠΌΠΈ символов). Π’ Windows 9x/Me ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рисования ΠΏΡ€ΡΠΌΡ‹Ρ…, Π»ΠΎΠΌΠ°Π½Ρ‹Ρ…, ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ PolyDraw ΠΈ Rectangle), ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° тСкста. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ рисования эллипсов, окруТностСй ΠΈ эллиптичСских Π΄ΡƒΠ³ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для создания Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Windows 9x/Me, Ρ‚.ΠΊ. Π² этих систСмах эллиптичСскиС ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ, Π° Π½Π΅ Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΡ€ΠΈΠ²Ρ‹ΠΌΠΈ Π‘Π΅Π·ΡŒΠ΅. Для создания Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ прСдусмотрСны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BeginPath ΠΈ EndPath. ВсС Π²Ρ‹Π·ΠΎΠ²Ρ‹ графичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, располоТСнныС ΠΌΠ΅ΠΆΠ΄Ρƒ BeginPath ΠΈ EndPath, вмСсто Π²Ρ‹Π²ΠΎΠ΄Π° Π² контСкст устройства Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π½Π΅ΠΌ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ траСктория построСна, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ здСсь ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с траСкториями, остановимся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Π»ΠΎΠΌΠ°Π½ΡƒΡŽ. Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, всС ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π°Π±ΠΎΡ€ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² прямых ΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΏΡ€ΠΈ построСнии ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ ΠΎΠ½Π° аппроксимируСтся Π»ΠΎΠΌΠ°Π½ΠΎΠΉ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, вся траСктория ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ аппроксимирована Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² прямой. Ѐункция FlattenPath ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅, входящиС Π² состав Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π² Π»ΠΎΠΌΠ°Π½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ траСктория Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² прямой.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ для создания графичСских Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Ѐункция PathToRegion позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² Ρ€Π΅Π³ΠΈΠΎΠ½. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Π² частности, ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ курсор ΠΌΡ‹ΡˆΠΈ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, прСдставляСмого слоТной Ρ„ΠΈΠ³ΡƒΡ€ΠΎΠΉ. Ѐункция WidenPath ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Π΄Π²Π° ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° β€” Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΈ внСшний. РасстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ опрСдСляСтся Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½ΠΎΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, траСктория ΠΊΠ°ΠΊ Π±Ρ‹ утолщаСтся. ПослС прСобразования ΡƒΡ‚ΠΎΠ»Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² Ρ€Π΅Π³ΠΈΠΎΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ курсор ΠΌΡ‹ΡˆΠΈ Π½Π° ΠΊΡ€ΠΈΠ²ΡƒΡŽ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ, опрСдСляСмой Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π°.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetPath. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ Ρ‚ΠΈΠΏ Ρ‚ΠΎΡ‡ΠΊΠΈ (Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π»ΠΈΠ½ΠΈΠΈ, Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°, Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅, ΠΊΠΎΠ½Π΅Ρ† ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, создав Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ· ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ (BeginPath/PoliBezier/EndPath), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² Π»ΠΎΠΌΠ°Π½ΡƒΡŽ (FlattenPath), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ угловэтой Π»ΠΎΠΌΠ°Π½ΠΎΠΉ (GetPath). А ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π²Π΅Π½ΠΎ этой Π»ΠΎΠΌΠ°Π½ΠΎΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ стилСм, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ LineDDA. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π°Π΄Π°Ρ‡Π° построСния ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ свСдСна ΠΊ ΡƒΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ построСния ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°.

Π’ листингС 1.60 Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ DrawCurve, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ дСйствия. Π—Π΄Π΅ΡΡŒ FCurve β€” это ΠΏΠΎΠ»Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚ΠΈΠΏΠ° TCurve, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… ΠΊΡ€ΠΈΠ²ΡƒΡŽ.

Листинг 1.60. Π Π°Π±ΠΎΡ‚Π° с Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ Π½Π° основС ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅

type

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

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