既存の回答では、エンドポイントが(与えられているのではなく)arbitrary意的であることを考慮していません。したがって、曲線の真直度を測定する場合、終点を使用することは(たとえば、予想される長さ、角度、位置を計算するために)意味がありません。簡単な例は、両端がねじれている直線です。曲線からの距離と端点間の直線を使用して測定すると、これは非常に大きくなります。これは、描画した直線が端点間の直線からオフセットされるためです。
曲線の直線性をどのように確認しますか?曲線が十分に滑らかであると仮定して、曲線の接線が平均してどれだけ変化しているかを知りたいです。線の場合、これはゼロになります(接線が一定であるため)。
時間tでの位置を(x(t)、y(t))とすると、接線は(Dx(t)、Dy(t))になります。ここで、Dx(t)は時間tでのxの導関数です(このサイトにはTeXサポートが欠けているようです)。曲線が弧の長さでパラメーター化されていない場合、||(Dx(t)、Dy(t))||で割って正規化します。したがって、時間tでの曲線の接線の単位ベクトル(または角度)があります。したがって、角度はa(t)=(Dx(t)、Dy(t))/ ||(Dx(t)、Dy(t))||
次に、曲線に沿って積分された|| Da(t)|| ^ 2に興味があります。
ほとんどの場合、曲線ではなく離散データポイントがあるため、有限差分を使用して導関数を近似する必要があります。したがって、Da(t)はになり(a(t+h)-a(t))/h
ます。そして、a(t)はになり((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)/||((x(t+h)-x(t))/h,(y(t+h)-y(t))/h)||
ます。次にh||Da(t)||^2
、すべてのデータポイントを合計し、場合によっては曲線の長さで正規化してSを取得します。ほとんどの場合、を使用しますh=1
が、実際には単なる任意のスケールファクターです。
繰り返しますが、Sはラインではゼロであり、ラインから逸脱するほど大きくなります。必要な形式に変換するには、を使用します1/(1+S)
。スケールがいくぶんarbitrary意的であることを考えると、Sに正の数を掛ける(またはSの代わりにbS ^ cを使用するなど他の方法で変換する)ことにより、特定の曲線の直線性を調整することができます。