通过算法定义圆

时间:2016-12-29 09:15:23

标签: algorithm graph-algorithm

我有一张100px * 100px的图片 要绘制一些随机位置和半径的实心圆。问题不是随机的东西。 我只是不知道算法来定义一个在像素上有位置(x,y)和半径(r)的圆。

3 个答案:

答案 0 :(得分:0)

你必须应用的等式应该来自毕达哥拉:

 r² = x²+y² 
 r <= 50

希望有意义。

答案 1 :(得分:0)

得到了答案: 中点圆算法

void drawcircle(int x0, int y0, int radius)
{
int x = radius;
int y = 0;
int err = 0;

while (x >= y)
{
    putpixel(x0 + x, y0 + y);
    putpixel(x0 + y, y0 + x);
    putpixel(x0 - y, y0 + x);
    putpixel(x0 - x, y0 + y);
    putpixel(x0 - x, y0 - y);
    putpixel(x0 - y, y0 - x);
    putpixel(x0 + y, y0 - x);
    putpixel(x0 + x, y0 - y);

    if (err <= 0)
    {
        y += 1;
        err += 2*y + 1;
    }
    if (err > 0)
    {
        x -= 1;
        err -= 2*x + 1;
    }
}
}

答案 2 :(得分:0)

在圆圈边缘只有三个点,您可以找到圆圈的中心半径: 让A, B, C为点,a, b, c为对应的(二维情况下)

a = Sqrt((Bx - Cx) * (Bx - Cx) + (By - Cy) * (By - Cy));
b = Sqrt((Ax - Cx) * (Ax - Cx) + (Ay - Cy) * (Ay - Cy));
c = Sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay));     

然后 radius R

R = a * b * c / Sqrt((a+b+c)*(b+c-a)*(c+a-b)*(a+b-c));

接下来,让

d = (a*a*(b*b+c*c-a*a) + b*b*(c*c+a*a-b*b) + c*c*(a*a+b*b-c*c))

中心 K位于

K = (a*a*(b*b+c*c-a*a)*A + b*b*(c*c+a*a-b*b)*B + c*c*(a*a+b*b-c*c)*C)/d 

同时具有半径和中心,您可以使用圆形方程来定义圆内的所有点(2D情况):

(Kx - x) * (Kx - x) + (Ky - y) * (Ky - y) <= R * R 

最后

  1. 检测边缘
  2. 在边缘取三个点,找一个圆圈
  3. 验证(特别是如果圆圈相互交叉)