ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Алгоритмы вычСрчивания графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ экран растрового дисплСя с ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΠΎ-Π»ΡƒΡ‡Π΅Π²ΠΎΠΉ Ρ‚Ρ€ΡƒΠ±ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π–Πš — экраном ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ дискрСтных элСмСнтов (пиксСлСй), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подсвСчСн, нСльзя нСпосрСдствСнно провСсти ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ опрСдСлСния пиксСлСй, Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ, называСтся Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ€Π°ΡΡ‚Ρ€. Растром называСтся ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Алгоритмы вычСрчивания графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π°

«ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ вычСрчивания графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²»

ЦСль Ρ€Π°Π±ΠΎΡ‚Ρ‹: Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…ности Ρ„ΠΎΡ€ΠΌΡ‹ графичСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹: Π»ΠΈΠ½ΠΈΠΈ, ΠΊΡ€ΡƒΠ³ΠΈ, эллипсы.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ задания:

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ экран растрового дисплСя с ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΠΎ-Π»ΡƒΡ‡Π΅Π²ΠΎΠΉ Ρ‚Ρ€ΡƒΠ±ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π–Πš — экраном ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ дискрСтных элСмСнтов (пиксСлСй), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подсвСчСн, нСльзя нСпосрСдствСнно провСсти ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ опрСдСлСния пиксСлСй, Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π°ΠΏΠΏΡ€ΠΎΠΊΡΠΈΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ, называСтся Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ€Π°ΡΡ‚Ρ€.

Рассмотрим:

1. Алгоритм разлоТСния Π² Ρ€Π°ΡΡ‚Ρ€ прямой Π»ΠΈΠ½ΠΈΠΈ.

Рис. 1. РастСризация ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° прямой Π»ΠΈΠ½ΠΈΠΈ

графичСский ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ линия ΠΊΡ€ΡƒΠ³

Растром называСтся ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Π°Ρ сСтка Ρ‚ΠΎΡ‡Π΅ΠΊ, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΡ€Π°Π½Π΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. КаТдая Ρ‚ΠΎΡ‡ΠΊΠ° растра характСризуСтся двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ: своим ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° ΡΠΊΡ€Π°Π½Π΅ ΠΈ ΡΠ²ΠΎΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ. РастровыС изобраТСния состоят ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° дискрСтных Ρ‚ΠΎΡ‡Π΅ΠΊ, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹.

РисованиС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° прямой Π»ΠΈΠ½ΠΈΠΈ — ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ растровой Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. Бмысл Π΅Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ся Π² Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ пиксСлСй, находящихся Π²Π±Π»ΠΈΠ·ΠΈ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Ρ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ², Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π½Π° Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΉ растровой сСткС.

Рис. 2. Алгоритм разлоТСния Π² Ρ€Π°ΡΡ‚Ρ€ прямой Π»ΠΈΠ½ΠΈΠΈ

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° разлоТСния ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ рисования Canvas. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ это Π΄Π»ΠΈΠ½Ρƒ ΠΏΠΎ ΠΎΡΠΈ oX ΠΈΠ»ΠΈ oY, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, которая Π΄Π»ΠΈΠ½Π½Π΅Π΅:

if abs (X2 — X1) >= abs (Y2 — Y1) then Length := abs (X2 — X1)

else Length := abs (Y2 — Y1);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ приращСния для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ оси:

dX := (X2 — X1) / Length;

dY := (Y2 — Y1) / Length;

ИмСя приращСния ΠΈ Π΄Π»ΠΈΠ½Ρƒ Π»ΠΈΠ½ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΡΠΌΡƒΡŽ, Π½ΠΎ Π΄Π»Ρ Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ построСния Π»ΠΈΠ½ΠΈΠΈ:

X := X1 + 0.5 * Sign (dX);

Y := Y1 + 0.5 * Sign (dY);

Π—Π΄Π΅ΡΡŒ Sign — функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Ссли число ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ; 1, Ссли число ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ; ΠΈ 0, Ссли число Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ i Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС:

i := 1;

И Π·Π°ΠΏΡƒΡΡ‚ΠΈ Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i ΠΈ ΠΏΡ€ΠΎΡ€ΠΈΡΠΎΠ²ΠΊΠ° Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ†ΠΈΠΊΠ» закончится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° i <= Length:

i := 1;

While i <= Length do begin

Canvas.Pixels[Trunc (X), Trunc (Y)] := clBlue;

X := X + dX;

Y := Y + dY;

i := i + 1

end;

2. Алгоритм построСния ΠΊΡ€ΡƒΠ³Π°.

Рис. 3. ΠšΡ€ΡƒΠ³

ΠšΡ€ΡƒΠ³ — гСомСтричСскоС мСсто Ρ‚ΠΎΡ‡Π΅ΠΊ плоскости, расстояниС ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ ΠΊΡ€ΡƒΠ³Π°, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ радиусом этого ΠΊΡ€ΡƒΠ³Π°. Если радиус Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ ΠΊΡ€ΡƒΠ³ выроТдаСтся Π² Ρ‚ΠΎΡ‡ΠΊΡƒ.

Для построСния ΠΊΡ€ΡƒΠ³Π° Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ понадобятся ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π° ΠΊΡ€ΡƒΠ³Π° X1 ΠΈ Y1 ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ X2 ΠΈ Y2, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ рисования Canvas.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ радиус

R := abs (X2 — X1) div 2.

Π’ΠΎΡ‡ΠΊΡƒ Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΊΡ€ΡƒΠ³Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊ:

X := X1 + (X2 — X1) div 2;

Y := Y1 + (Y2 — Y1) div 2;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ градус: i := 0 ΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΏΠΎΠΊΠ° i Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ <= 359 градусов Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ Ρ€Π°Π΄ΠΈΡƒΡΡƒ ΠΊΡ€ΡƒΠ³Π° ΠΎΡ‚ Π΅Π³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°, Π° ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ градусов Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ 30 ΠΌΠΈΠ½ΡƒΡ‚, для увСличСния точности прорисовки ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°:

While i <= 359 do begin

Canvas.Pixels[Trunc (X + R * Sin (i)), Trunc (Y + R * Cos (i))] := clRed;

i := i + 0.3

end;

3. Алгоритм построСния эллипса.

Рис. 4. Эллипс

Эллипсом - называСтся гСомСтричСскоС мСсто Ρ‚ΠΎΡ‡Π΅ΠΊ, сумма расстояний ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎ Π΄Π²ΡƒΡ… Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ F1 ΠΈ F2, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… фокусами эллипса, Π΅ΡΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° постоянная.

Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ отличаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ ΠΎΠ΄ΠΈΠ½ радиус, Π° Π΄Π²Π°: ΠΏΠΎ ΠΎΡΠΈ oX ΠΈ oY. БоотвСтствСнно прорисовка измСнится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь приращСниями Ρ€Π°Π·Π½Ρ‹Ρ… радиусов:

Canvas.Pixels[Trunc (X + xR * Sin (i)), Trunc (Y + yR * Cos (i))] := clLime;

Рис. 5. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ эллипса

Π‘Π»ΠΎΠΊ-схСмы Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²:

Π‘Π»ΠΎΠΊ-схСма Π»ΠΈΠ½ΠΈΠΈ

Π‘Π»ΠΎΠΊ-схСма ΠΊΡ€ΡƒΠ³Π°

Π‘Π»ΠΎΠΊ-схСма эллипса

Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

unit ULab1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, XPMan;

type

TMainForm = class (TForm)

ButtonClear: TButton;

ElementsGroup: TRadioGroup;

PaintBox: TPaintBox;

procedure ButtonClearClick (Sender: TObject);

procedure PaintBoxPaint (Sender: TObject);

procedure PaintBoxMouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure PaintBoxMouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

end;

var

MainForm: TMainForm;

SX, SY: Word;

procedure Line (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

procedure Circle (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

procedure Ellipse (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

implementation

{$R *.dfm}

function Sign (Val: Single): ShortInt;

begin

if Val > 0 then Result := 1 else

if Val < 0 then Result := -1

else Result := 0

end;

procedure Line (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

var i, Leng: Word;

X, Y, dX, dY: Single;

begin

if abs (X2 — X1) >= abs (Y2 — Y1) then Leng := abs (X1 — X2)

else Leng := abs (Y1 — Y2); // Π”Π»ΠΈΠ½Π°

// ΠŸΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΡ

dX := (X2 — X1) / Leng;

dY := (Y2 — Y1) / Leng;

X := X1 + 0.5*Sign (dX);

Y := Y1 + 0.5*Sign (dY);

i := 1;

while i <= Leng do begin

Canvas.Pixels[Trunc (X), Trunc (Y)] := clBlue;

X := X + dX;

Y := Y + dY;

i := i + 1

end

end;

procedure Circle (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

var R, X, Y: Word;

i: Single;

begin

R := abs (X1 — X2) div 2; // Радиус

// Π¦Π΅Π½Ρ‚Ρ€

X := X1 + (X2 — X1) div 2;

Y := Y1 + (Y2 — Y1) div 2;

i := 0;

While i <= 359 do begin

Canvas.Pixels[Trunc (X + R * Sin (i)), Trunc (Y + R * Cos (i))] := clRed;

i := i + 0.1

end;

end;

procedure Ellipse (X1, Y1, X2, Y2: Word; Canvas: TCanvas);

var xR, yR, X, Y: Word;

i: Single;

begin

xR := abs (X1 — X2) div 2; // Радиус X

yR := abs (Y1 — Y2) div 2; // Радиус Y

// Π¦Π΅Π½Ρ‚Ρ€

X := X1 + (X2 — X1) div 2;

Y := Y1 + (Y2 — Y1) div 2;

i := 0;

While i <= 359 do begin

Canvas.Pixels[Trunc (X + xR * Sin (i)), Trunc (Y + yR * Cos (i))] := clLime;

i := i + 0.1

end;

end;

procedure TMainForm. ButtonClearClick (Sender: TObject);

begin

with PaintBox. Canvas do begin

Brush.Color := clBlack;

FillRect (PaintBox.ClientRect)

end

end;

procedure TMainForm. PaintBoxPaint (Sender: TObject);

begin

ButtonClear.Click

end;

procedure TMainForm. PaintBoxMouseDown (Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

SX := X;

SY := Y

end;

procedure TMainForm. PaintBoxMouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

case ElementsGroup. ItemIndex of

0: Line (SX, SY, X, Y, PaintBox. Canvas);

1: Circle (SX, SY, X, Y, PaintBox. Canvas);

2: Ellipse (SX, SY, X, Y, PaintBox. Canvas);

end

end;

end.

Π’Ρ‹Π²ΠΎΠ΄: Π’ Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹. Π‘Ρ‹Π»Π° написана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…ности Ρ„ΠΎΡ€ΠΌΡ‹ графичСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹: Π»ΠΈΠ½ΠΈΠΈ, ΠΊΡ€ΡƒΠ³ΠΈ, эллипсы.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ