科学と家事とプログラミング (python を中心に)

python 温度計測 湿度計測 DS18B20 USB9097

緯度経度で分割された星カタログの選択は、なかなかやっかいなのです

カメラ視野を模擬したい

カメラの視野を模擬するとき、 手元の星カタログを全部スキャンすると星の数が多すぎて性能が出ない時があります。 こういう時は、星カタログをいくつかの部分に分けて対応します。 分けたものをサブカタログと呼んだりします。

経度緯度で分割したサブカタログ

サブカタログの分割方法で一番簡単なのは、緯度と経度で分ける方法でしょうか。 さて、分割したからには必要なサブカタログがどれかを調べなければいけません。 簡単なのは、各サブカタログの4隅(極だと3隅)と中心方向が、カメラの視野に入るかどうかを判定することでしょうか。 こういう方法だと、辺の一部に視野が重なる場合などはうまく判定できません。 特に困るのが極付近の判定です。その難しさは、下の図を見てもらえば分かってもらえるでしょうか。

力技による判定は、細かく面でサンプルする方法ですが、判定に時間がかかって残念な感じになってしまいます。 なんとかスマートに判定したいものです。

ビットマップを使ったサブカタログの選択

ここで、ビットマップを使った視野判定の方式を紹介します。

f:id:sken20k:20180330172056j:plain

手順はこうです

  1. 視野より大きめの描画エリアを用意して、カタログの境界線を描画する
  2. 背景色で視野を抜く
  3. 中心付近を視点として、塗りつぶす。
  4. 各サブカタログの中心(代表点)の色を調べる

細かな説明は不要と思いますが、これで視野の端がサブカタログにちょっとだけかかるときも、 ビットマップの分解能で正しく判定できます。実用上は、視野を少し大きく採ればよいでしょう。 けっきょく、面でサンプルしているといえなくもないのですが、サブカタログの境界線と境界線の間は、 ビットマップの塗りつぶし処理だけで代用できているので、ちょっとお得かなと思います。

他の方式

球座標のような特異点を避けるという観点からは、N 面体で分割するのも一案です。 用途によっては、排他的に分割するのではなく、重複を許すと便利そうです。 他にも分割の工夫はありそうですが、最近は使えるメモリーも桁違いに増えたので、 一括で扱った方が良い場面も多いかもしれません。 ビットマップを使った解法というのは、他にも応用が利きそうに思うので、一応紹介しておきます。