2016-09-08 8 views
0
def drawCircle(h, k, r): 
    #(x-h)^2 + (y-k)^2 = r^2 
    for x in range(screen.Width): 
     y = (math.sqrt(r**2 - (x-h)**2) + k) 
     if y % 1 == 0: 
      screen.Set(x, int(y), "X") 

drawCircle(0, 0, 5) 

screenは、アイテムを2次元配列に配置すると書いた簡単なコンソールレンダラーライブラリです最も左上隅が(0,0)math.sqrt(r ** 2 - (xh)** 2)+ kがValueErrorを返す理由:数学的ドメインエラー

+0

y%1 == 0も同様に0に設定されているようです。違うことをしたいですか? – aschultz

+0

これは本当に円を描く最善の方法ではありません。 sqrtを使って問題を並べ替えるとしても、多くの点を欠場することがわかります。古典的な方法は[Midpoint circle algorithm](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm)ですが、一般的に可能な限りライブラリ呼び出しを使用するのが最善です。 –

+0

[h-r、h + r]の範囲外の 'x '値の場合、円もy値もないので、' ValueError'を取得します。エラーをキャッチして、その 'x'値を無視してください:' except ValueError:continue' – zvone

答えて

3

sqrt ingであることを括弧で括った結果は、ある時点で否定的になると私は推測しています。あなたが見ているエラーは、その番号の平方根を取ろうとすると発生します。

これを確認するには、sqrtを受け取る前にr**2 - (x-h)**2を変数に保存して印刷してください。

+0

): 、-11 、 0、 9、16 、21 、 24、 25それはその時に私のようですループが7回目の反復に達すると、負の数が出力されます。これを調べます。 Answer –

+1

私はscreen.widthが5以上の場合、-11の平方根を取ろうとします。だからおそらく無関係な値のループを閉じて もしabs(x-h)> rなら#おそらくx> hであるかどうかを確認する必要がある場合 break; – aschultz

+0

@BenKostenあなたがまだ問題を提起していない場合は、この問題に関する可能な解決策についてのコメントをチェックしてください。また、元の質問に答えた場合は、この回答を受け入れることを忘れないでください。 – elethan

関連する問題