Интернет магазин китайских планшетных компьютеров



Компьютеры - Алгоритм Брезенхэма - Рисование окружностей

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--


Для C++

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;
}


Просмотров: 8882


<<< Алгоритм Бентли Оттмана
Алгоритм быстрой оболочки >>>