3

一連のポリラインが与えられた場合、角度タイプ(軸の原点の内側または外側)の検出に問題があることがわかりました。非常によく似た質問を何十も見つけましたが、どれも私の問題を解決しなかったので、何かが出てくることを期待してここに置きました。

角度の分類

私が持っているのはポリラインのセットだけです。(長方形に近い特定の許容誤差で)角度を見つけて、それらを内側または外側に分類する必要があります。

各ポリラインについて、頂点3 x 3を取得し、中心の頂点が角度であるかどうかを認識し、その値を0〜180度の数値として測定できます。

ここで、この角度に方向を指定する必要があります(たとえば、符号、鋭角が原点から離れる方向を向いている場合は負、中心を向いている場合は正)、次の2つの方法のいずれかで実装すると思いました。 、しかしそれらのどれも機能しませんでした。

1)「2次元外積の符号」(これは数学的に正しい用語ではないことを私は知っています):

//given 3 contiguous vertices a,b,c
//check if b is a inner (+1) or outer (-1) vertex (0 in other cases)

double cross = ((b.x - a.x)*(c.y - a.y)) - ((b.y - a.y)*(c.x - a.x));

if(cross > 0){
  return 1;
} else if (cross < 0) {
  return -1;
}
return 0;

しかし、それは左下の象限でのみ機能するようです。右上ではまったく逆の方法で機能しますが、他の象限ではねじ込まれ、理由がわかりません。

2)頂点のノルムを比較します

if b.norm() < a.norm() && b.norm() < c.norm 
then return +1
else return -1

これは基本的なケースでのみ機能し、全体として軸を横切る(原点を含む)ポリラインはありません。すべてのケースをチェックできますが、それは避けたいと思います。

明らかに、頂点が2つのベクトル上にある2つの隣接点の間を通る線と比較して、原点の同じ側にあるかどうかを確認するなど、はるかに安全な方法があります。しかし、可能な限り最適化する必要があります。

4

3 に答える 3

4

短いバージョン:

中心点から来る 2 つの角度ベクトルをaおよびとして記述しbます。そして、中心点から原点までのベクトルを として記述しますcenter

次の場合、角度は「内側」として記述されます。

dot( a + b, center ) > 0.0 && dot( cross( a, center ), cross( b, center ) ) < 0.0

説明:

これは、クロス積ドット積の両方を使用して解決できます。(幸いなことに、角度はまったくありません。これは、加算、乗算、および比較で完全に解決できます。)

ここでは、2 つのステップで解決します。

1. 角度は、原点よりも原点に向いていますか?

2 つの角度ベクトルを合計して「角度が指している方向」を定義すると、角度は 遠ざかる方向ではなく、向かっている方向になります。

と の個々の長さが異なる場合、非常に広い角度に対して誤ったエッジ ケースが得られる可能性があることに注意して a ください b 。正規化 a し、それ b を修正します。

`dot( a + b, center ) > 0.0`

2. ベクトルabは原点の反対側を指していますか?

ベクトルabは、それらの外積が反対方向を指している場合、原点の反対側を指しています。

`dot( cross( a, center ), cross( b, center ) ) < 0.0`

これらが両方とも真である場合にのみ、角度は「内側」として定義されます。

于 2012-09-13T00:59:57.550 に答える
3

角度abcが内側にあるかどうかを検出するには、ベクトルb0(bから原点まで)がベクトルbaとbcの凸結合であるかどうかを確認する必要があります。

ベクトルpx+qyがベクトルp1x+q1yとp2x+q2yの凸結合である場合、r *(p​​1、q1)+ s *(p2、q2)=(p、q)となる正の定数rとsが存在します。 。rとsを代数的に解くと、r =(pq2 --p2q)/(p1q2 --q1p2)およびs =(p1q --pq1)/(p1q2 --q1p2)が得られます。rとsが両方とも正の場合、abcは内部です。

于 2012-09-13T01:06:43.483 に答える
0

個人的には、ドット積を使用します。具体的には(頂点から原点までaベクトルを表し、頂点の外側を指すエッジベクトルである場合)、両方が正の場合、角度は外側になります。そうでなければ、それは内側です。bca dot ba dot c

しかし、私はあなたの「内側」と「外側」の本当の定義について少し混乱しています...

于 2012-09-13T00:30:19.520 に答える