2013-02-18 40 views
2

我想計算一個圓圈中的所有點。我已經知道我可以使用x = r * cos(theta) + x0y = r * sin(theta) + y0來計算積分 - 但是我想知道是否有一種很好的方式來根據像素畫布的分辨率(或LCD對於我)的分辨率以及半徑圈。計算圓中的點數 - 步長?

這是我的代碼已經有(_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)) 

回答

6

這聽起來像midpoint circle algorithm可能適合你想要什麼。

中點圓算法是用來確定所需的畫圈

+0

簡短而明確的答案。太好了! – Rethunk 2013-02-19 02:20:47

+0

完美,謝謝!這也使我得到一個更好的算法(不涉及三角學,因爲我在微控制器上)繪製線。 – 2013-02-19 05:59:00

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)