2

円内のすべての点を計算したいと思います。x = r * cos(theta) + x0を使用してポイントを計算できることは既に知っていy = 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))
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 に答える