与えられた曲率kで円を描きたいです。
特定の x 座標の y 座標を知る必要があるだけです。つまり、 z = 1/k + sqrt(1/k^2 - x^2) は、私が通常使用するものです。問題は、私の k がゼロになることが許されていることです。つまり、私の円は線になります。数学者にとっては問題ありません。しかし、私のコンピューターではそうです。たとえば、k が double の最小値の場合、y は無限大になります。k == 0 の場合、y に対して nan を受け取ります。
これを行う方法はありますか?
2 に答える
このような境界ケースが与えられた場合、入力パラメーターをテストして、それらのいずれかが適用されるかどうかを確認し、境界ケースが適用される場合は、別のロジックを使用して適切な水平線または垂直線を描画します。
これはかなり一般的なアプローチであり、計算上非常に効率的です。
境界ケースをテストするときは、kをテストして、次のことを確認します。 - k ^2は使用中のデータ型をオーバーフローしない
いずれの場合も、適切なボーダー ケース ロジックを使用します。それを指摘してくれてありがとう@Godeke。
あなたは式を与えた
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