Среда программирования:
Lazarus 1.2.4
Статья по теме:
Задача : построить (растеризовать) эллипс, зная координаты его центра и длины меньшей и большей полуосей a и b соответственно.
Суть алгоритма : использование модифицированного алгоритма Брезенхема для построение окружности . Как и в оригинальном алгоритме Брезенхема, выбор ближайшей точки основан на анализе знаков управляющих
В поля "X" и "Y" вводятся координаты центра окружности, в поля "a" и "b" — длины соответствующих полуосей.
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, ColorBox; type { TForm1 } TForm1 = class(TForm) Button1: TButton; ColorBox1: TColorBox; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure DrawEllipse (x, y, a, b : Integer; color: TColor); var col, row : Integer; //Column - "Столбец", row - "ряд,строка" // Нет необходимости создавать переменные ниже // Но я пользуюсь правилом " Используется более 1 раза -- создай переменную " a_sqr, b_sqr, two_a_sqr, two_b_sqr, four_a_sqr, four_b_sqr, d: Longint; // Чтобы избежать переполнения int при больших значениях a или b begin a_sqr:=a*a; //a^2 b_sqr:=b*b; //b^2 row:=b; col:=0; two_a_sqr:=a_sqr<<1; //2*a^2 two_b_sqr:=b_sqr<<1; //2*b^2 four_a_sqr:=a_sqr<<2; //4*a^2 four_b_sqr:=b_sqr<<2; //4*b^2 d:=two_a_sqr*((row-1)*(row))+a_sqr+two_b_sqr*(1-a_sqr); while (a_sqr*row > b_sqr*col) do begin Form1.PaintBox1.Canvas.Pixels[x+col, y+row]:=color; Form1.PaintBox1.Canvas.Pixels[x+col, y-row]:=color; Form1.PaintBox1.Canvas.Pixels[x-col, y+row]:=color; Form1.PaintBox1.Canvas.Pixels[x-col, y-row]:=color; if d >= 0 then begin row:=row-1; d:=d-four_a_sqr*row; end; d:=d+two_b_sqr*(3+col*2); col:=col+1; end; d:=two_b_sqr*(col+1)*col+two_a_sqr*(row*(row-2)+1)+(1-two_a_sqr)*b_sqr; while ((row)+1)<>0 do begin Form1.PaintBox1.Canvas.Pixels[x+col, y+row]:=color; Form1.PaintBox1.Canvas.Pixels[x+col, y-row]:=color; Form1.PaintBox1.Canvas.Pixels[x-col, y+row]:=color; Form1.PaintBox1.Canvas.Pixels[x-col, y-row]:=color; if d<=0 then begin col:=col+1; d:=d+four_b_sqr*col; end; row:=row-1; d:=d+two_a_sqr*(3-(row << 1 )); end; end; procedure TForm1.Button1Click(Sender: TObject); // Обработка события нажатия кнопки Draw begin DrawEllipse (StrToInt(Edit1.Text), StrToInt(Edit2.Text),StrToInt(Edit3.Text), StrToInt(Edit4.Text), ColorBox1.Selected); // 4 координаты и цвет, который исрользуется для рисования end; end.
Прикрепленный файл | Размер |
---|---|
konsmanov_2_ellepse_example.zip | 272.79 кб |