Re: Как нарисовать эллипс, с помощ целочисленной арифметики

nayk2002

и ф-ции PlotPixel(x, y) ?
Слышал, есть какой-то хитрый алгоритм. Проясните.

kamputer

ы?

nayk2002

нет ли ку кого на русском алгоритма Брезенхама построения эллипса,
типа дано x0, y0, a, b
и тект ф-ции на каком-либо языке(

maggi14

> нет ли ку кого на русском алгоритма Брезенхама построения эллипса
Obyazatelno na russkom? U menya gde-to na pascale byl

stm7583298


Procedure Circle(x,y,rr:integer);
var xi,yi,r,di,lim,s,ss:integer;
label 1,2,3,4,10,20,30;
Begin
r:=rr;
xi:=0; yi:=r; di:=2*(1-r); lim:=0;
1: SetPixel(xi+x,yi+y);
SetPixel(xi+x,-yi+y);
SetPixel(-xi+x,yi+y);
SetPixel(-xi+x,-yi+y);
if yi<limthen goto 4;
if di<0then goto 2;
if di>0then goto 3;
if di=0 then goto 20;
2: s:=2*di+2*yi-1;
if s<=0then goto 10;
if s>0then goto 20;
3: s:=2*di+2*xi-1;
if s<=0then goto 20;
if s>0then goto 30;
10:xi:=xi+1;
di:=di+2*xi+1;
goto 1;
20:xi:=xi+1;
yi:=yi-1;
di:=di+2*xi-2*yi+2;
goto 1;
30:yi:=yi-1;
di:=di-2*yi+1;
goto 1;4:
end;

gopnik1994

да это же бейсик!

356ft85

это не бейсик, это очень хитрая прога напаскале с кучей переходов

maggi14

СетПиксель - это, похоже, самописная функция

Olenenok

В юните граф на ТП такая была

maggi14

PutPixel была

Olenenok

Ах да, забыл уже.

nunu

переведите на паскаль пожалста лингвисты

artimon

Это и есть паскаль. Только это функция рисует окружность.

356ft85

если кому надо, то вроде как рисует окр. на Си
  
/*-----------------------------------------------
Эти подпрограммы должен определить программист:
void setpixel(int x, int y);
-----------------------------------------------*/
void drawcircle(int xc, int yc, int r);
/*************************************************************************
Рисование развертки круга методом Брэзенхема
Центр в точке (xc, yc радиус r.
*************************************************************************/
void drawcircle(int xc, int yc, int r)
{
int x;
int y;
int d;
x = 0;
y = r;
d = 3-2*r;
while(y>=x)
{
setpixel(x+xc, y+yc);
setpixel(x+xc, -y+yc);
setpixel(-x+xc, y+yc);
setpixel(-x+xc, -y+yc);
setpixel(y+xc, x+yc);
setpixel(y+xc, -x+yc);
setpixel(-y+xc, x+yc);
setpixel(-y+xc, -x+yc);
if( d<0 )
{
d = d+4*x+6;
}
else
{
d = d+4*(x-y)+10;
y = y-1;
}
x = x+1;
}
}

gopnik1994

ну, особо не углубляясь, а просто изменив стиль, получим например такое:
 
procedure Circle(x, y, rr: Integer);
var
xi, yi, r, di, lim, s, ss: Integer;
Action: Integer;
begin
r := rr;
xi := 0;
yi := r;
di := 2*(1-r);
lim := 0;
Action := 1;
while Action > 0 do
begin
case Action of
1:
begin
SetPixel(xi + x, yi + y);
SetPixel(xi + x, -yi + y);
SetPixel(-xi + x, yi + y);
SetPixel(-xi +x, -yi + y);
if yi < lim then
Action := 0
else if di < 0 then
Action := 2
else if di > 0 then
Action := 3
else
Action := 20;
end;
2:
begin
s := 2 * di + 2 * yi - 1;
if s <= 0 then
Action := 10
else
Action := 20;
end;
3:
begin
s := 2 * di + 2 * xi - 1;
if s <= 0 then
Action := 20
else
Action := 30;
end;
10:
begin
xi := xi + 1;
di := di + 2 * xi + 1;
Action := 1;
end;
20:
begin
xi := xi + 1;
yi := yi - 1;
di := di + 2 * xi - 2 * yi + 2;
Action := 1;
end;
30:
begin
yi := yi - 1;
di := di - 2 * yi + 1;
Action := 1;
end;
end;
end;
end;

Olenenok

И тут мы видим, что goto рулит?

gopnik1994

с чего такой вывод?
типа запись с goto короче?
я всего лишь расставил пробелы и преносы строк, как положено

maggi14

ну да и гото заменил на кейз зачем-то

gopnik1994

типа так больше нравится?
 
procedure Circle(x, y, rr: Integer); var xi, yi, r, di, lim, s, ss: Integer; Action: Integer;
begin
r := rr; xi := 0; yi := r; di := 2*(1-r); lim := 0; Action := 1;
while Action > 0 do begin case Action of
1: begin
SetPixel(xi + x, yi + y);
SetPixel(xi + x, -yi + y);
SetPixel(-xi + x, yi + y);
SetPixel(-xi +x, -yi + y);
if yi < lim then Action := 0 else if di < 0 then Action := 2 else if di > 0 then Action := 3 else Action := 20;
end;
2: begin
s := 2 * di + 2 * yi - 1;
if s <= 0 then Action := 10 else Action := 20;
end;
3: begin
s := 2 * di + 2 * xi - 1;
if s <= 0 then Action := 20 else Action := 30;
end;
10: begin
xi := xi + 1; di := di + 2 * xi + 1;
Action := 1;
end;
20: begin
xi := xi + 1; yi := yi - 1; di := di + 2 * xi - 2 * yi + 2;
Action := 1;
end;
30: begin
yi := yi - 1;
di := di - 2 * yi + 1;
Action := 1;
end; end; end; end;

gopnik1994

 
особо не углубляясь, а просто изменив стиль
читай "избавившись от goto"

nayk2002

а почему эта ф-ция сложнее той, что запостил Lexus ?

gopnik1994

без понятия
я алгоритм не изменял, а просто переписал
Оставить комментарий
Имя или ник:
Комментарий: