質問
北東南東方向のロジックを使用して、線分(lx1、ly1)(lx2、ly2)に関連する2Dグラフ上のポイント(px、py)の位置を確認しようとしています。私が実装したロジックは、点から線分上に垂線を引くことです。
垂直がその南を意味する線上にある場合。
右側のポイントが東を意味する場合。
左側のポイントが西を意味する場合。
垂線が前方の線から離れている場合、北を意味します。
垂線が後方にある線から離れている場合、南を意味します。
私の問題は、このロジックは紙上では良さそうに見えるが、NW、NE、SW、SEのいずれであるかを判断するのが非常に難しくなっていることです。誰もこのロジックを計算する方法を提案できますか?私はC ++を使用していますが、どの言語のアルゴリズムでも大いに役立ちます。
北東南東関係を計算するために、線分の終点を使用しています。
乾杯
解決
-
delta_x = x2-x1
-
delta_y = y2-y1
-
距離= sqrt(delta_x ^ 2 + delta_y ^ 2)
-
tan(theta)= delta_y / delta_x
-
theta = arctan(delta_y / delta_x)
;; しかしゼロで割らないでください! - 度を取得するには、
180 / PI
でtheta
を乗算します
度は、x軸の正の側から反時計回りです。最終的には、0が(右ではなく)上昇し、時計回りに実行されるように、角度を少し向きを変えるために少量の代数を行う必要があります。しかしその前に:
問題は、 arctan(1 / -1)
が arctan(-1 / 1)
と同じであることです。 I.e。、左上(180度のオフセットが必要)と右下(そのまま)の両方で -PI / 4
ラジアンまたは-45度を取得します。 delta_y
vs。 delta_x
の符号をテストして、 arctan
の結果を確認する必要があります。調整する必要があります。
ソリューションをコーディングする前に、テストもコーディングして、呼び出している関数が期待値を生成することを確認してください。
他のヒント
ndim
に同情します。ある地点から別の地点への方向を計算するのは簡単です。私は、どのコンテキストが線からの指示を必要とするかを理解していません。これはマッピングアプリケーションですか?道路はありますか?道路セグメントのほぼ中間で、脇にポイントがありますか?
「北」の意味または「NE」または" east"線セグメントの実際には不明確であることを意味します。
「北」などの方向または" east"または「NE」通常、1つのポイントの位置を別の(ベース)ポイントを基準にして記述するために使用されます。その基点として使用している線分上の点は何ですか?
編集:これで、コンパスの中心点としてエンドポイント(x2、y2)
を使用すると言いましたが、ポイント(x 、y)
は、デルタベクトル(x-x2、y-y2)
を調べることにより、コンパスに対して相対的に配置されます。
メソッドについて簡単に推論するには、デルタベクトルで atan2()
を使用し、 atan2()
によって返される角度を考慮します。
ただし、単に atan2()
の引数を比較して、そこから結果の角度範囲を決定することをお勧めします。これにより、コンパイル時に(またはコンパイル前に)計算を行う必要がありますが、実行時に atan2()
を呼び出すことは基本的に回避されます。