2

我想计算一个圆圈中的所有点。我已经知道我可以使用x = r * cos(theta) + x0, y = 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))
4

2 回答 2

6

听起来中点圆算法可能适合您想要的。

中点圆算法是一种用于确定画圆所需点的算法

于 2013-02-18T23:43:27.867 回答
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)
于 2013-02-18T23:58:24.320 回答