web-dev-qa-db-ja.com

球体上の小さな円内にグリッドポイントをマークする

与えられた中心と半径を持つ 小さい円 (球上)があり、小さい円内にあるグリッドポイントをマークしたいと思います。

グリッド自体は、地理的マップで等間隔の経度と緯度で離散化されます。

これを解決するために実装した私の簡単なアルゴリズムは、小さな円の中心から小さ​​な円の外側の縁まで行き、途中ですべての点をマークします。これは、0〜360°のすべての方位角に対して繰り返されます。

上記のアルゴリズムは非常に遅いだけでなく、ポイントを失うことなく、さらに遅くなることもないように、適切な増分角度が必要です。

良いアルゴリズムのアイデアはありますか?

私の質問がフラッドフィルアルゴリズムの方向に向かっていることは承知していますが、いつかそれについて考えましたが、私にとってそれは大きな利点ではないようです。

7
Domenico

KISS=に基づいて球に固執しましょう。円の中心に緯度φと経度θを持たせます。円の半径を角度に変換しますψ = r / R。一定の経度の線は大きな円(極では経度が変化するため、半円)であるため、円でカバーされる緯度はφ - ψφ + ψ、制限されています-90度未満または+90度を超えないようにします。

緯度をグリッドに量子化し、次に、量子化された特定の緯度λについて、経度の範囲を取得する必要があります。明らかに、それはθを中心に対称です(±180度付近の経度の扱い方に注意が必要です)。実際、小さな円の円周上にある点は(λ, μ)です

cos φ cos λ cos (θ - μ) + sin φ sin λ = cos ψ

μを解きます。できない場合は、緯度の線全体が円の内側にあるためです。これは、極の近くで発生する可能性があります。

最適化したい場合は、sinとcosのテイラー近似を使用して、すばやく更新できる値を取得し、累積エラーが候補グリッドポイントが複数あるような場合にのみtrigを使用できます。

4
Peter Taylor