レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
おちゃめくらぶ掲示板
-
魚眼レンズで地球を作る・・・?
ふと思って、プチコンで魚眼レンズフィルタを作ってみたにょ。
http://twitpic.com/c9c1sr
http://ww5.tiki.ne.jp/~ochame/petitcom/tips/routine.htm#fisheye
これは原理的にはスクリーン座標を極座標に変換しているだけの簡単なものにょ。(一見
変数Cは無駄なことをやっているみたいだけど演算誤差の関係上こうするしかなかった)
極座標とは何かというと簡単に言えば時計の長針が長さと角度のパラメータさえあれば
長針の先の座標が分かるという感じにょ。
三角関数を使ってアナログ時計を作ったことがあれば極座標をイメージしやすいのでは
ないかと思われるにょ。
逆に画面上の座標(スクリーン座標)から極座標を求めるにはarc sinやarc cos が欲しい
けどプチコンにはarc tanのATANしかないためそれを使って求めなくてはならないにょ。
直角三角形において角度を求めることになるためATANを使うだけで簡単に求めることが
できるにょ。
3次元極座標であるため2つの角度を求める必要があるけど2つの角度は例えるならば緯度と
経度で地球表面上の座標を表すことができるのと同じにょ。
というわけで、まずは地球の表示・・・というか地球儀を作ることにしたにょ。
まぁ実際は地球儀の話題が出てから魚眼レンズフィルタを元にすればできそうということが
思いついたわけだけどね。
地球儀を作るならば必要なのは地図データにょ。
地図には計算がしやすい正距円筒図法を使うことにしたにょ。
http://ww5.tiki.ne.jp/~ochame/petitcom/mercator/
当初は真っ先に頭に浮かんだメルカトル図法をテスト用に使用してみたけれどやっぱり
緯度を正確に計算するのが面倒くさい(速度が遅くなる)ということに加えて極が表示
できないというのがネックであるため計算が楽で極の表示も可能なこの図法に差し替える
ことにしたにょ。
では、この地図データを使ってどうやって地球儀の表示を行うかだけど実際にやっている
ことは上記の魚眼レンズフィルタとほぼ同じにょ。
平面上に投影された地図を元の球面の座標に表示するだけだからね。
まずは、画面に映っている円形の任意のドットから緯度と経度を求めなくてはならないにょ。
緯度は画面上の半径と現在の画面上の(円の中心を原点としたときの)Y座標が分かっている
ためATANで簡単に求めることができるにょ。
次に経度だけどその基準となるX座標があればそれと現在のX座標を元にATANで求めることが
できるにょ。
緯度と経度が分かれば見えている部分は半球であるため角度はπラジアン(180度)であり、
それが縦は192ドット、横は128ドット(2πで256ドットであるため)の地図データのどの
部分を参照しているかを計算するだけにょ。
そして、それをGSPOITで読み取ってGPSETで表示すればいいにょ。
そうやってできたのがこの簡易地球儀にょ。
http://twitpic.com/c94ahk
(※この地球儀の画面写真はメルカトル図法によるものなので上記の正距円筒図法のデータに
差し替えればもう少しまともになる)
1ドット単位でGSPOITで読み出して1ドット単位で表示するということで元のサイズより
大きいと空白が空きそうなイメージを持つ人がいるかもしれないけど画面上の座標を順番に
1ドットの抜けなく順番に表示しているため問題はないにょ。
これが地図データを1ドットずつ読み出してそれを画面に表示すると拡大時には抜けが出て
しまうだけではなく拡大率が1未満の場合には同じ場所に何度もドットを打つことになるため
ループ回数は地図を構成しているドット数分だけ必要になってくるためとてつもなく遅く
なってしまうにょ。
半球を表示するためには画面のドット数の半分となる128x192ドット分、つまり128ドット
必要となるためどれだけ小さい地球儀であってもループ回数は2476回となるにょ。
しかも、拡大率が1より大きいと上記のように抜けが出るし、1より小さいと正確には表示
できないということで事実上使いもののはならないにょ。
これが画面上のドットを元にすれば半径64の場合はループ回数は12844回で済むし、地球儀の
表示面積が半分になればループ回数は概ね半分になるにょ。
そして、ドットの抜けなく表示が可能にょ。
これは、簡単に言えばニアレストネイバー法と同じアルゴリズムであり拡大補間が行われて
いるけど中間色で補間を行うものと比べるとやはり綺麗さでは劣るにょ。
これはプチコンのGRPが256色のパレット発色であるため中間色で補間を行うと色数の問題で
対応しきれないし、仮にできても1ドット単位でCOLSETをするなんて大幅に遅くなるため
速度面でかなり厳しいにょ。
まぁ、ここまでシンプルなアルゴリズムの簡易的な地球儀でも実行速度はデフォ(半径64)の
場合で0.4fpsと非常に遅いにょ。
現在は64色だけどこれを16色x16階調くらいにしてシェーディング処理を行うという方法も
あるけどこれよりもさらに遅くなることを考えると微妙にょ。
まぁそれでもBASICでここまで出来るならば御の字といえるかもしれないにょ。
ATANによる角度計算、ドットの読み取り、表示を1秒間に約5000回行えているわけだしね。
魚眼フィルタの方は角度の計算にもう少し時間がかかっているけどこちらはそこまで高速性を
求めないので問題は無さそうにょ。
というか、地球儀以外で魚眼フィルタを何に使うかが問題かもしれないにょ(笑)
|
|
|
掲示板管理者へ連絡
無料レンタル掲示板