我想计算一个圆圈中的所有点数。我已经知道我可以使用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))
答案 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)