Среда программирования:
Lazarus 1.2.4
Статья по теме:
Задача: зарисовать (заполнить) окружность, зная координаты её центра и радиус.
Суть алгоритма: используя свойства вписанной в квадрата окружности, можно утверждать, что все точки окружности и круга, ограниченного этой окружностью, лежат в квадрате,описанном вокруг данной окружности. Перебирая все точки двойным циклом (по OX и OY) и проверяя их удовлетворение неравенству (X-текущийX)2+(Y-текущийY)2≤Радиус2 строится сама окружность и эта же окружность заполняется
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, ActnList, ColorBox, Math; //Используем бибилотеку Math для функции intpower() type { TForm1 } TForm1 = class(TForm) Button1: TButton; ColorBox1: TColorBox; //Выбор цветов осуществляется из панели Color Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); //Обрабатываемое событие нажатия на кнопку Draw private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure FillCircle(X,Y,Radius: Integer; color: Tcolor); //Функция заполнения var curX, curY : Integer; //текущие значения Х и У,которые проверяются в уравнении окружности begin for curX:=X-Radius to X+Radius do //двигаемся от левой стороны описанного квадрата до правой по OX begin for curY:=Y-Radius to Y+Radius do //двигаемся от верхней стороны описанного квадрата до нижней по OY begin if ((intpower(X-curX,2)+intpower(Y-curY,2) <= intpower(Radius,2)) and (Form1.PaintBox1.Canvas.Pixels[curX, curY] <> color)) then // Пиксель нового цвета будет поставлен если текущая точка (curX,curY) лежит в или на окружности и цвет не совпадает с новым Form1.PaintBox1.Canvas.Pixels[curX,curY]:=color; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin FillCircle(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text), ColorBox1.Selected); end; end.
Прикрепленный файл | Размер |
---|---|
konsmanov_1_circle_example.zip | 279.89 кб |