1

与えられた曲率kで円を描きたいです。
特定の x 座標の y 座標を知る必要があるだけです。つまり、 z = 1/k + sqrt(1/k^2 - x^2) は、私が通常使用するものです。問題は、私の k がゼロになることが許されていることです。つまり、私の円は線になります。数学者にとっては問題ありません。しかし、私のコンピューターではそうです。たとえば、k が double の最小値の場合、y は無限大になります。k == 0 の場合、y に対して nan を受け取ります。
これを行う方法はありますか?

4

2 に答える 2

2

このような境界ケースが与えられた場合、入力パラメーターをテストして、それらのいずれかが適用されるかどうかを確認し、境界ケースが適用される場合は、別のロジックを使用して適切な水平線または垂直線を描画します。

これはかなり一般的なアプローチであり、計算上非常に効率的です。

境界ケースをテストするときは、kをテストして、次のことを確認します。 - k ^2使用中のデータ型をオーバーフローしない

いずれの場合も、適切なボーダー ケース ロジックを使用します。それを指摘してくれてありがとう@Godeke。

于 2012-12-13T16:16:01.297 に答える
1

あなたは式を与えた

y1 = 1/k + sqrt(1/k^2 - x^2)    // (1)

これは、半径と中心を持つ円の上半分を表します。小さい場合、これらの値は非常に大きくなり、最終的には描画範囲外になります。1/k(0, 1/k)k

円の下半分は、

y2 = 1/k - sqrt(1/k^2 - x^2)    // (2)

k がゼロに近づくと、これらの値は線に「近づきます」y = 0。しかし、 の値が小さい場合k、(2) は 2 つの大きな数の差を計算します。これにより、精度が失われ、オーバーフローが発生する可能性があります。

ただし、式(2)を同等の形式に書き換えることができます

y2 = k * x^2 / (1 + sqrt(1 - k^2 * x^2))    // (2a)

kこれで、 の値が小さい場合でもk = 0、オーバーフローや精度の低下がなくても、円の下半分を計算できます。

上半分には、常に がありy1 >= 1/kます。1/kが描画領域の境界よりも大きい場合は、上限値を無視できます。それ以外の場合は、次の方法で計算できy1ます

y1 = 2/k - y2
于 2012-12-13T18:39:53.037 に答える