Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Алгоритм Брезенхэма - Рисование окружностей23 января 2011Оглавление: 1. Алгоритм Брезенхэма 2. Рисование линий 3. Рисование окружностей Также существует алгоритм Брезенхэма для рисования окружностей. По методу построения он похож на рисование линии. В этом алгоритме строится дуга окружности для первого квадранта, а координаты точек окружности для остальных квадрантов получаются симметрично. На каждом шаге алгоритма рассматриваются три пикселя, и из них выбирается наиболее подходящий путём сравнения расстояний от центра до выбранного пикселя с радиусом окружности.
// R - радиус, X1, Y1 - координаты центра
int x := 0
int y := R
int delta := 2 - 2 * R
int error := 0
while
drawpixel
drawpixel
drawpixel
drawpixel
error = 2 * - 1
if &&)
delta += 2 * ++x + 1
continue
error = 2 * - 1
if &&)
delta += 1 - 2 * --y
continue
x++
delta += 2 *
y--
void drawCircle {
int x = 0;
int y = radius;
int delta = 2 - 2 * radius;
int error = 0;
while {
setPixel;
setPixel;
setPixel;
setPixel;
error = 2 * - 1;
if {
++x;
delta += 2 * x + 1;
continue;
}
error = 2 * - 1;
if {
--y;
delta += 1 - 2 * y;
continue;
}
++x;
delta += 2 * ;
--y;
}
}
Для Delphi 7
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
{ Объявляем процедуру "DrawCircle", реализующая
алгоритм Брезенхема для рисования окружности }
procedure DrawCircle;
procedure Button1Click;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DrawCircle;
var x,y,error,delta : integer;
begin
InvalidateRect; //Очистка Canvas, необходимая для затирания созданных кругов
x := 0;
y := R;
delta := ;
error := 0;
while y >= 0 do
begin
Canvas.Pixels := clBlack;
Canvas.Pixels := clBlack;
Canvas.Pixels := clBlack;
Canvas.Pixels := clBlack;
error := 2 * - 1;
if and ) then
begin
inc;
delta := delta + ;
continue;
end;
error := 2 * - 1;
if and ) then
begin
dec;
delta := delta + ;
continue;
end;
inc;
delta := delta + );
dec;
end;
end;
procedure TForm1.Button1Click;
begin
{ Здесь получаем необходимые данные из Edit-ов, содержащих информацию
для построения окружности по алгоритму Брезенхема, а именно координаты
центра окружности и радиус, реализуем их в процедуру DrawCircle }
DrawCircle,StrToInt, StrToInt);
end;
Модифицированный пример из книги Г.Шилдта "Си для профессиональных программистов"
/* Вспомогательная функция, печатает точки, определяющие окружность */
void plot_circle
{
mempoint;
mempoint;
mempoint;
mempoint;
}
/* Вычерчивание окружности с использованием алгоритма Брезенхама */
void circle
{
int x,y,delta;
x = 0;
y = radius;
delta=3-2*radius;
while {
plot_circle;
plot_circle;
if
delta+=4*x+6;
else {
delta+=4*+10;
y--;
}
x++;
}
if plot_circle;
}
Просмотров: 10612
|