No.2ベストアンサー
- 回答日時:
地図ソフト、おもしろそうですね。
私も作ってみたいソフトの一つです。参考になるフリーソフトのソースや解説の場所をお知りになりたいと思いますが、私の知る限りではちょっと分かりません。
下の点についてコメントします。
>使えるリソースが限られているので、地図の一部しか描けないわけですが、膨大なベクトルデータ群から画面内に入りそうなベクトルだけを抽出するのは至難の業のようです。
基本的は地図全体をメッシュに分けて、そのメッシュにひっかかるベクトルデータをあらかじめデータベースとして持っておくしかないと思います。
そして広域・詳細表示の切り替えをサポートするには、それぞれの拡大・縮小にあわせて、異なるメッシュサイズのデータベースを保存しておき、現在の表示サイズに近いメッシュサイズのデータベースから、表示する範囲と重なるメッシュのみを描画する、ということになるのではないでしょうか。
世界地図を描くことを考えるとします。小さい町を表示するときは、例えば1km×1kmのメッシュサイズのデータを参照し、そのメッシュが画面の表示範囲と引っかかる最大4メッシュに引っかかるベクトルデータをすべて描けばよいです。もちろん表示範囲のクリッピングはしてください。その該当するメッシュ内のベクトルデータ数が数千程度に収まるのであれば描画処理はそんなにおもくないでしょう。もちろん、プロセッサの処理に応じて一度に描画できるベクトル数(=許容できる待ち時間)は変わってくるでしょう。
世界の全体を描画するとき、全体を1つのメッシュとしたデータを参照しますが、このときその地図データに含まれるであろう数百万、数千万のすべてのベクトルデータを表示するのはナンセンスですね。世界地図全体でしたら、建物や道路は表示しなくて良いかもしれません。小さい川も表示しなくて良いし、入り組んだ海岸線も要らないでしょう。つまり、細かいベクトルデータはそのサイズのメッシュのデータベースからはあらかじめ除いておき、やはり実処理(描画)時間として許容できるベクトル数に収まるようにしておくべきでしょうね。
こう考えると、地図ソフトで一番難しいのは、大小異なるメッシュサイズに対応するデータベースに、どの程度の粒度のベクトルデータを保存しておくか?という点になるのではないかと思います。
話はそれますが、3Dゲームなどで「バンプマッピング」という手法があるそうです。テクスチャをポリゴンの貼り付け表示するときに、近くで大きなポリゴンに貼り付けるときは精細なテクスチャを貼り付け、遠くで小さく表示されるポリゴンについては粗いおおざっぱなテクスチャを貼り付ける、ということをやるようで、そのためにあらかじめ精細なテクスチャデータから少しずつ粗くしてテクスチャデータをあらかじめ作成しておいて、必要に応じた解像度のテクスチャを利用するという方法です。
今回の件の参考になれば・・・
ご検討をお祈りしています。
同じく地図に興味があおりなんですね。地図の世界に踏み込みましたが、なんだか面白みを感じています。更に調べてみましたが、いわゆるGIS(地理情報システム)の分野のようです。
今回質問しております地図描画について、更に踏み込んで調べたところ、一つの方向性が見えてきましたのでご紹介します。
電子地図の分野では、shapefile形式が事実上の標準となっており、日本地図や世界地図などの詳細なベクトルデータが公開されいています。
このデータをC言語で操作することができる Shapefile C Library API がオープンソースで公開されており、これを使えば地図全体から指定座標内に含まれる、あるいは通過する線分を抽出することができます。これで、リソースに限りがあっても、一度切り出す作業さえしてしまえばとりあえず表示領域だけの演算で済むはずです。
多くの場合、頂点データは位置データが緯度、経度で表されて
いますが、これを地図と同じメルカトル座標系に変換すればディスプレイに投影できます。これは同じくオープンソースの drawmap に座標変換関数があります。 なお地図の座標を示すのに使われる緯度経度(Latitude/Longitude)は通常度分秒(Degrees/Minutes/Seconds)で表記されますが、座標計算の前に一旦度(Degree)に変換する必要があります。こちらもネットで探せばCの関数は見つかります。
グラフィックライブラリなどを活用して標準出力にX,Y座標を指定して線を書かせることができれば、理論的には地図プログラムが実現できるものと思われます。
その他参考文献を探しましたが、次のものが該当するようです。
Dr. Mark de Berg, Dr. Marc van Kreveld著
Computational Geometry Algorithms and Applications
Joseph O'rourke 著
COMPUTATIONAL GEOMETRY IN C
英文のため難しいですが、1冊目は和訳した本もあるようです。2冊目は題目から推定するとCプログラムが掲載されているはずです。これを応用すれば、フルスクラッチで切り出し描画のアルゴリズムが作れると思います。。。
まだまだ勉強途中ではありますが、ご参考になりましたら幸いです。
No.1
- 回答日時:
表示範囲が長方形だとして。
線分を考える。曲線だったら、線分として近似できる程度に分割する。
線分が、表示範囲の中か、交差しているか、外かを判定する。
中ならそのまま線を引く。
交差していたら、交点を求めて、範囲内だけ線を引く。
外なら線は引かない。
という処理になるのではないでしょうか。
交点の求め方とかは、中学か高校の数学レベルの問題ですし、画像処理ライブラリとか探せば関数一つで解決するかもしれません。
ご回答ありがとうございます。
画面外にある点が関係する線分が画面内に現れると、画面外であっても計算はしなければなりません。
ところが逆に、形状データのベクトルが画面内に入るかは計算しないと分からないので、結局は全世界のデータを演算しなければならなくなります。
使えるリソースが限られているので、地図の一部しか描けないわけですが、膨大なベクトルデータ群から画面内に入りそうなベクトルだけを抽出するのは至難の業のようです。
ここは画像処理ライブラリのみならず、地図描画ライブラリも必要としそうです。一度、フリーのGISシステムのソースコードを見てみる必要がありそうですね。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 数学 標高zがz=x^2-y^2で与えられている地形を、点Pが水準面上で曲線(x,y)=(t,t^2 3 2023/08/03 21:52
- 数学 球面と接する直線の軌跡が表す領域 4 2023/07/30 12:37
- 数学 線形代数の曲線の標準形と概形についての問題がわからないです。 2 2022/07/18 17:48
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 数学 数学の問題がわかりません。(球の中心の座標を求める問題) 2 2023/02/14 15:52
- 数学 2次関数y=ax^2のグラフは点A(4,2)を通っている。y軸上に点BをAB=OB(Oは原点)となる 1 2022/04/08 00:05
- PowerPoint(パワーポイント) 2016EXCEL→2016PowerPointにコピペすると図形がゆがみます 5 2022/03/31 11:44
- 物理学 座標変換に関して質問です。参考書に 「力は一般に時間と場所によって異なるから力f(ベクトル)はx,y 3 2022/07/03 20:24
- 画像編集・動画編集・音楽編集 ワード。頂点の編集。 4 2022/09/28 14:14
- Windows 8 win8 "ベータ ワールドワイド言語サポートで Unicode UTF-8 を使用"を出したい 2 2023/05/23 19:57
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
DTOとEntityの差は何ですか。
-
【C#】DataGridViewの最大列数...
-
excel access連携 このテーブル...
-
GridViewからチェックボックス...
-
VB.NET 2017の勉強中です。 今...
-
C言語で地図を描きたい
-
WordでExcelデータを差込...
-
表を表示するコントロールについて
-
★お手上げ状態です。助けてくだ...
-
VB 音の波形を取得する関数は?
-
VBA内でのGetPixelを使用した時...
-
MATLAB アスキーファイルの保...
-
TCPでデータを受け取ってそれを...
-
トラックバック機能の実装
-
クッキーを利用して複数のデー...
-
HTMLのファイルが無くても、URL...
-
表形式の表示
-
Dosブロンプトでtabを出力したい
-
「取得先」という表現について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DTOとEntityの差は何ですか。
-
wordの差し込み印刷で文字...
-
【C#】DataGridViewの最大列数...
-
WordでExcelデータを差込...
-
excel access連携 このテーブル...
-
ActiveReportのサブレポート機...
-
「外部データの取り込み」とい...
-
GridViewからチェックボックス...
-
★お手上げ状態です。助けてくだ...
-
INIファイルに一括書き込みを行...
-
VBA内でのGetPixelを使用した時...
-
VB.NET 2017の勉強中です。 今...
-
表を表示するコントロールについて
-
C#でのForm間のデータ受け渡し...
-
ASP.NET GridView の検索画面で...
-
C言語で地図を描きたい
-
回線速度が64kbpsだったら、64k...
-
ADOを使用してExcelファイルを...
-
MSFlexGridのデータを初期化し...
-
画像の読み込み&白黒判別プロ...
おすすめ情報