1

経度と緯度によって定義された 2 つのポイント A と B が与えられた場合、別のポイント C が A と B の間の範囲にあるかどうかを判断したいと考えています。私はライン上にあるという意味ではありません - それはほぼ確実にありません。

幾何図 http://www.freeimagehosting.net/uploads/b5c5ebf480.jpg

この図では、点 C は点 A と点 B の法線とそれらの間の線 (細い線で示される法線) の間にあるため、A と B の間の ~ 間です。ポイント D は A と B の間ではなく、B と F の間です。

別の言い方をすれば、三角形 ABC と ABD が鈍角かどうかを判断したいということです。

ポイントは互いに非常に接近していることに注意してください - 通常は数十メートル以内です。

haversines の法則が役立つかもしれないと考えていますが、haversine の逆が何であるかはわかりません。

すべての助けに感謝します。

4

2 に答える 2

3

ポイントが非常に近い場合 (数十メートルで簡単に認定できます)、それを 2 次元の問題として近似し、角度 CAB、θ および CBA、φ を計算するだけでよい場合があります (内積を使用)。θ と φ の両方が π/2 未満の場合、C は「中間」です。

cos(θ) = ( AC · AB ) / (| AC | | AB |)

その近似が十分でない場合は、球面三角法が必要になりますが、これもそれほど難しくありません。

私があなたの問題を正しく理解していれば、角度 ACB が鈍角または鋭角であるのではなく、角度 CAB と CBA が鋭角であるかどうかを確認する必要があることに注意してください。

于 2010-01-28T04:45:15.237 に答える
3

まず、ポイントをローカル接平面に変換することから始めます。三角形が地球の半径よりもはるかに小さいという事実を使用します。(接空間は、2 つの座標のそれぞれの等しいデルタが等しい距離に対応するようなものです)

これは、経度を sin(lat) で割ることによって行われます。

A_local_x = A_lat_rads;
A_local_y = A_lon_rads/sin(A_lat_rads);

それで、

長さを計算する:

double ABsquared = (A_local_x - B_local_x)*(A_local_x - B_local_x) + (A_local_y - B_local_y)*(A_local_y - B_local_y);
double BCsquared = ..., ACsquared.

ついに:

bool obtuse = (ABsquared+BCsquared < ACsquared) || (ABsquared+ACsquared < BCsquared); 

鈍角とは、おっしゃる通り「線の中にない」という意味です。三角形 ABC が鈍角かどうかはチェックしていませんが、B と A の角度が鈍角かどうかをチェックしています。それでおしまい。

注:このコードはテストしていません。バグがある場合は修正します。

于 2010-01-28T04:24:34.300 に答える