Генерируем 1/8 часть окружности. Первая точка генерируемого участка окружности имеет координаты (0;радиус). По горизонтали координата X изменяется от 0 до радиус/sqrt(2).
Берём целое, максимально приближенное значение выражения (радиус/sqrt(2)).
Циклом, меняем координату по горизонтали от 0 до (радиус/sqrt(2)), увеличивая её на 1 до того момента, пока координата <=round(радиус/sqrt(2)).
В цикле ищем наиболее подходящее значение по вертикали Y. Для этого находим d1=|радиус2-X2-Y2| и d2=|радиус2-X2-(Y-1)2|. Нас интересует, какое из этих выражений ближе к нулю. Если d1>d2, то уменьшаем значение Y на единицу. Иначе — оставляем значение неизменным. Полученные координаты отражаем 7 раз.
Получаем 8 точек
( X, Y); ( Y, X);
( X,-Y); ( Y,-X);
(-X, Y); (-Y, X);
(-X,-Y); (-Y,-X);
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Buttons; type { TForm1 } TForm1 = class(TForm) BitBtn1: TBitBtn; PaintBox1: TPaintBox; procedure BitBtn1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure Circle(x_,y_,r_:integer;colour:TColor); var x,y,d1,d2:integer; begin x:=0; y:=r_; while ( x<=round(r_/sqrt(2)) ) do begin Form1.PaintBox1.Canvas.Pixels[x_+x,y_+y]:=colour; Form1.PaintBox1.Canvas.Pixels[x_+x,y_-y]:=colour; Form1.PaintBox1.Canvas.Pixels[x_-x,y_+y]:=colour; Form1.PaintBox1.Canvas.Pixels[x_-x,y_-y]:=colour; Form1.PaintBox1.Canvas.Pixels[x_+y,y_+x]:=colour; Form1.PaintBox1.Canvas.Pixels[x_+y,y_-x]:=colour; Form1.PaintBox1.Canvas.Pixels[x_-y,y_+x]:=colour; Form1.PaintBox1.Canvas.Pixels[x_-y,y_-x]:=colour; x:=x+1; d1:=ABS(r_*r_-x*x-y*y); d2:=ABS(r_*r_-x*x-(y-1)*(y-1)); if(d1>d2) then y:=y-1; end; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin Circle(200,200,100,ClBlack); end; end.
Прикрепленный файл | Размер |
---|---|
riza_circle.rar | 685.84 кб |