计算圆中的点 - 步长?

时间:2013-02-18 23:41:39

标签: algorithm math trigonometry geometry angle

我想计算一个圆圈中的所有点数。我已经知道我可以使用x = r * cos(theta) + x0y = r * sin(theta) + y0来计算点数 - 但是我想知道是否有一种很好的方法可以根据我的像素画布(或LCD)的分辨率为theta找到合适的步长对我来说)和圆的半径。

这是我已有的代码(_arange()range()类似,但也为step采用浮动值:

def circle(x0, y0, r):
    step = 2 * math.pi / 1000
    for theta in _arange(0, 2 * math.pi, step):
        x = x0 + r * math.cos(theta)
        y = y0 + r * math.sin(theta)
        set(round(x), round(y))

2 个答案:

答案 0 :(得分:6)

听起来midpoint circle algorithm可能更多适合您想要的内容。

  

中点圆算法是用于确定的算法   绘制圆圈所需的点数

答案 1 :(得分:1)

对于不同的方法,从顶点位于(x0 + -r,y0)和(x0,y0 + -r)的正方形开始,并递归地将每个边缘划分为其中点并将其投影到圆上。当边的长度小于一个像素时停止递归。也许不是最快的算法,但它确实避免了三角学,尽管它需要平方根和分裂。

以下是Lua中实现此策略的一些代码。作为递归组织方式的额外结果,它以正确的循环顺序输出点。

local tolerance=1e-2

local function explore(x0,y0,r,x1,y1,x2,y2)
    local x=x1+x2
    local y=y1+y2
    local s=r/math.sqrt(x^2+y^2)
    x=s*x
    y=s*y
    if math.sqrt((x1-x2)^2+(y1-y2)^2)<tolerance then
        print(x+x0,y+x0)
    else
        explore(x0,y0,r,x1,y1,x,y)
        explore(x0,y0,r,x,y,x2,y2)
    end
end

local function circle(x0,y0,r)
    explore(x0,y0,r,r,0,0,r)
    explore(x0,y0,r,0,r,-r,0)
    explore(x0,y0,r,-r,0,0,-r)
    explore(x0,y0,r,0,-r,r,0)
end

circle(0,0,2)