Здравствуйте,
Я пытаюсь нарисовать эллипс, параллельный ортогональной системе, используя алгоритм Брезенхэма. Я хочу нарисовать верхнюю левую (W,SW,S) четверть эллипса, а затем вывести другие.
Для этого я использую инкрементный алгоритм с логикой второго порядка. Я сделал это из другого алгоритма, который сначала рисует верхнюю правую четверть, но то, что я делаю, не работает.
Проблема появляется, когда прорисовывается 2-й регион, и я не знаю, откуда он берется.
Вы можете видеть, что у меня есть (черный) и что я ожидаю (зеленый): (центр эллипса (xc, yc) и верхняя правая кнопка (x2,y2), то есть ~(xc+30,yc+20) в этом примере) (a – abs (x2-xc), а b – abs (y2-yc) ) Первый параметр — это середина эллипса (xc, yc), второй — правая верхняя точка, определяющая радиусы x и y. Вы можете видеть, что эллипс заходит слишком далеко (по 2 точки слева и справа). Вы можете увидеть другой пример (центр эллипса (xc, yc) и верхняя правая кнопка (x2,y2), которая в этом примере ~(xc+15,yc+18))
Алгоритм выводится из инкрементного алгоритма с логикой второго порядка.
Вот мой код (a - это абс (x2-xc), а b - это абс (y2-yc))
ellipse(int a, int b, int xc, int yc) {
int a2 = a*a, b2 = b*b;
int x = 0, y = b; //Starting point
int incSW = b2*2 + a2*2;
int deltaW = b2*(-2*x + 3); //deduced from incremental algorithm with the second-order logic
int deltaS = a2*(-2*y + 3);
int deltaSW = deltaW + deltaS;
int d1 = b2 - a2*b + a2/4; //dp starting value in the first region
int d2 = b2*(x - 0.5)*(x - 0.5) + a2*(y - 1)*(y - 1) - a2*b2; //dp starting value in the second region
//First region
while(a2*(y-0.5) >= b2*(-x-1)) {
DrawPixel(g,-x+xc, -y+yc); // 1st case
DrawPixel(g,-x+xc, y+yc); // 2nd case
DrawPixel(g,x+xc, y+yc); // 3rd case
DrawPixel(g,x+xc, -y+yc); // 4th case
if(d1>0) {
d1+=deltaSW;
deltaW+=b2*2;
deltaSW+=incSW;
y--;
}
else {
d1+=deltaW;
deltaW+=2*b2;
deltaSW+=2*b2;
}
x--;
}
deltaSW = b2*(2 - 2*x) + a2*(-2*y + 3);
//Second region
while(y>=0) {
DrawPixel(g,-x+xc, -y+yc); // 1st case
DrawPixel(g,-x+xc, y+yc); // 2nd case
DrawPixel(g,x+xc, y+yc); // 3rd case
DrawPixel(g,x+xc, -y+yc); // 4th case
if(d2>0) {
d2+=deltaS;
deltaS+=a2*2;
deltaSW+=a2*2;
}
else {
d2+=deltaSW;
deltaSW+=incSW;
deltaS+=a2*2;
x--;
}
y--;
}
}
Я надеюсь, что вы можете мне помочь, спасибо.
a
иb
? - person SergGr   schedule 26.03.2018top-left (W,SW,S)
если я возьмуW
за запад: что означаетS
? - person greybeard   schedule 27.03.2018+3
) выглядят подозрительно - есть ли представление алгоритма, которому вы пытаетесь следовать? (Я никогда не уверен, использовать ли две петли или одну - даже после факторизацииdraw(cx, cy, x, y)
.) - person greybeard   schedule 27.03.2018