2

私はList2Dポイントを持っています。ポイントのリストが直線上にあるか、または曲線上にあるか (およびその程度) を判断するために、ポイントを反復処理する効率的な方法は何ですか。小さなサブセット間で単純に傾きを取得することは避けたいと思います。どうすればこれを行うことができますか?

助けてくれてありがとう

編集:返信ありがとうございます。明確にするために、数値的に正確である必要はありませんが、ユーザーがマウスで湾曲した形状を作成したかどうか、作成した場合は曲線の鋭さを判断したいと思います。鋭い曲線と少し柔らかい曲線の違いを判断できる限り、値はそれほど重要ではありません。

4

4 に答える 4

1

直線かどうかをテストするには、相関係数を計算します。ウィキペディアでカバーされていると確信しています。

曲がっているかどうかをテストするには、より複雑です。予想される曲線の種類を知り、それらに適合する必要があります。

于 2011-03-29T19:10:06.367 に答える
1

すべてのポイントが程度の曲線に多かれ少なかれ適合するかどうかを単に知りたい場合は、配列内からエンドポイントと等間隔dのポイントにラグランジュ補間を適用するだけです。d-2これにより、次数の多項式が得られますd

曲線を作成したら、配列を反復処理して、各点が曲線からどれだけ離れているかを確認します。それらがしきい値よりも離れている場合、データは次数d多項式に適合しません。

編集: の値を反復することdは有限のプロセスであることに言及する必要があります。取得したポイント数にd達すると、ラグランジュ補間がどのように機能するかにより、完全に適合します。

于 2011-03-29T19:11:30.613 に答える
1

角度を計算する方法は次のとおりです。C# を使用して 2 点間の角度を計算する

リスト内のすべてのポイント間の角度を計算し、角度のリストを作成してから、角度リストの値が異なるかどうかを比較します。差がなければ直線、そうでなければ曲線...

直線の場合、すべての点の間の角度は同じでなければなりません。

于 2011-03-29T19:12:18.570 に答える
0

ここでの質問は本当に漠然としています:

おそらく、B スプラインのような補間が必要です。記憶が正しければ、2 つのポイントと 2 つの追加のコントロール ポイントを使用します。実装はずっと前から (少なくとも 1980 年代には) どこにでもあります。これで作業を開始できます

曲線を端点に合わせるには、おそらく制御点を追加する必要があることに注意してください。それらに到達することを確認する 1 つのトリックは、エンドポイントを追加のコントロールポイントとして単純に複製することです。

乾杯

更新codeprojectへのリンクを追加しまし た。80 年代にさかのぼって私が覚えているのは、一種の前身であるベジエ曲線だったようです。

于 2011-03-29T19:07:39.407 に答える