2016-08-09 4 views
2

これは本当にシンプルなはずですが、問題があります。基本的には、3つのポイントが変化し続けています(p1、p2、p3と呼ぶことができます)。また、p2を頂点として定義しましょう。3つの座標点を与えられたとき、それらの間の角度が180度に交差するときをどのように検出しますか?

私がする必要があるのは、3点の間の角度を計算することです。良い例は、3つの角度が179度の角度を形成する場合、ポイントは181度の角度を形成するように変化する。だから私が本当に必要とするのは、角度が180度より大きいかどうかを判断するための良い方法です。私はコサインの法則を使ってみましたが、ポイントが181度の角度を形成するとき、それは単にそれを異なる方向の179度の角度として解釈するので、私は良い答えを与えませんでした。また、Pythonでこれをやっています。ありがとう!

+0

のドットとクロス積では、atan2関数を使用していますか?すべての角度はccwで測定されますか? –

+1

この場合、最初のセグメントの時計回りまたは反時計回りの角度が正しいことを知っている必要がありますか?それ以外の場合、181を179と解釈することは絶対に正しいです。 –

+0

すべての角度は一貫して測定されます。反時計回りか時計回りかは問われません。角度が180度の境界を横切るときは重要です。 – user3047641

答えて

6

あなたが決定しようとしているのは、(p2-p1)と比較して(p3-p2)が左か右かどうかです。これは、実際には、凸包の計算に使用されるGraham Scanの中核部分です(https://en.wikipedia.org/wiki/Graham_scan)。 3点が「左折」又は 2つの線分との間の実際の角度を計算する必要がない 「右折」を構成するかどうかを決定...

、実際にすることができる:わずかな編集でウィキペディアを引用単純な算術で達成された のみ。 は、3つの点P1 =(x1、y1)、P2 =(x2、y2)、およびP3 =(x3、y3)に対して、2つのベクトル(p2-p1)の交差積のz座標を単純に計算し、 (p3-p1)となり、式 (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)となる。結果が0の場合、 ポイントは同一線上にあります。それが正の場合、3つの点は 「左回り」または反時計回りの向きを構成し、そうでない場合は「右回り」 または反時計回りの向き(反時計回りの番号付き点用)を構成します。あなたは、一貫性のある角度測定スキームを

+1

これはうまくいきます。私はこれを追加したいと思います。これは、追加の次元を導入する必要のないくさび製品に関しても説明することができます。くさび製品はもっと一般的です。寸法がより広いスペースで巻線を計算するために機能するので、クロス製品は3としか動作しません。 –

0

、フルレンジで署名した角度を取得するベクターp2p1p2p3

Angle(in radians) = atan2(cross(p2p1,p2p3), dot(p2p1,p2p3)) 
+0

三角法はここでは完全に不要です。 –

+0

@Dietrich Epp著者の言い回し「私がしなければならないことは、3点間の角度を計算することです」とは、180度の交差の事実だけでなく、角度値が必要であることを意味します – MBo

+0

質問のタイトルは、それらの間の角度は180度交差しますか?」ではなく、「どのように角度を計算するか」ではありません。 –

関連する問題