【发布时间】:2018-03-26 18:52:22
【问题描述】:
您好,
我正在尝试使用 Bresenham 算法绘制一个与正交系统平行的椭圆。我想画椭圆的左上角(W,SW,S)四分之一,然后推导出其他的。
为此,我使用了具有二阶逻辑的增量算法。我是通过另一个算法先绘制 右上角的四分之一,但我正在做的事情不起作用。
在绘制第二个区域的时候出现问题,不知道是从哪里来的。
您可以看到我拥有的(黑色)和我期望的(绿色): (椭圆的中心 (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 是 abs(x2-xc),b 是 abs(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--;
}
}
希望你能帮助我,谢谢。
【问题讨论】:
-
您可能还应该在问题中添加示例图像参数的数值。
-
好的,我刚刚做到了:)
-
OrsCrous,这不是 numeric 值!您是否希望读者手动计算图像上的像素?或者其他人应该如何获得
a和b的值? -
我觉得我做得更好,谢谢
-
top-left (W,SW,S)如果我用W代表西方:S代表什么?
标签: algorithm math geometry drawing ellipse