通过算法定义一个圆
defining a circle by algorithm
我有一张 100px*100px 的图片
必须绘制一些随机位置的实心圆圈,radius.the 问题不是随机的东西。
我只是不知道用像素上的位置(x,y)和半径(r)定义圆的算法。
你必须应用的方程式应该来自毕达哥拉斯:
r² = x²+y²
r <= 50
希望说得通。
得到了答案:
中点圆算法
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;
}
}
}
在圆的边缘只有 三个点,你可以找到 center 和 radius圈子的:
设 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));
那么半径 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
终于
- 检测边缘
- 边取三点,求圆
- 验证(尤其是如果圆圈相互交叉)
我有一张 100px*100px 的图片 必须绘制一些随机位置的实心圆圈,radius.the 问题不是随机的东西。 我只是不知道用像素上的位置(x,y)和半径(r)定义圆的算法。
你必须应用的方程式应该来自毕达哥拉斯:
r² = x²+y²
r <= 50
希望说得通。
得到了答案: 中点圆算法
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;
}
}
}
在圆的边缘只有 三个点,你可以找到 center 和 radius圈子的:
设 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));
那么半径 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
终于
- 检测边缘
- 边取三点,求圆
- 验证(尤其是如果圆圈相互交叉)