Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++でつくる歴史シミュレーションGIS

As Project
February 11, 2024

 C++でつくる歴史シミュレーションGIS

文献学・考古学・人類学データを用いたABS & GIS
各国・各時代の暦表示機能や各時代の環境復元機能を持つ
XYZタイルや地物を自由に追加することが可能

As Project

February 11, 2024
Tweet

More Decks by As Project

Other Decks in Programming

Transcript

  1. C++でつくる
    歴史シミュレーションGIS
    C++ MIX #9
    2023-02-09

    View full-size slide

  2. GitHubリポジトリのQRコードと
    URLを表示するのでお手持ちの
    スマホ or パソコンをご用意ください

    View full-size slide

  3. https:// github.com/
    AsPJT/PAX_SAPIENTICA
    GitHubリポジトリ

    View full-size slide

  4. PAX SAPIENTICA
    文献学・考古学・人類学データを用いた ABS & GIS
    各国・各時代の暦表示機能や各時代の環境復元機能を持つ
    XYZ タイルや地物を自由に追加することが可能

    View full-size slide

  5. 補足(学問)
    文献学:日本書紀,古事記等の文字資料から歴史を考察
    考古学:遺跡から出た遺物・遺構から歴史を考察
    人類学:人骨の形質や遺伝子の情報から歴史を考察

    View full-size slide

  6. 補足(用語)
    ABS:Agent-based Simulation(後に解説)
    GIS:地理情報システム - Geographic Information System
    XYZタイル・地物:GISで表示する地図や点のこと

    View full-size slide

  7. PAX SAPIENTICA
    文献学・考古学・人類学データを用いた ABS & GIS
    各国・各時代の暦表示機能や各時代の環境復元機能を持つ
    XYZ タイルや地物を自由に追加することが可能

    View full-size slide

  8. 開発期間
    2023年1月10日から現在まで(1年ちょっと)
    927 コミット / 96 プルリクエスト
    2024年1月10日 ソフトウェア正式リリース

    View full-size slide

  9. 開発意義
    歴史的事象の分析を得意とするGISは少ない
    一般のGISは空間情報の扱いに長けているが
    歴史にとって重要な時間情報の扱いは不向きなことが多い

    View full-size slide

  10. 開発意義
    そのため,歴史的事象の分析のためのABSとGISの
    双方の機能を持つソフトウェアを開発した
    時間情報,空間情報,シミュレーションの3つの機能を
    持つ汎用性・拡張性の高いソフトウェアを目指した

    View full-size slide

  11. 開発者(2人体制)
    企画の立案が得意
    Windows環境で開発
    厳密な設計が得意
    Mac環境で開発
    私 相方

    View full-size slide

  12. 開発担当
    データ作成・デザイン
    描画関連・仕様の作成
    暦と地図機能の作成
    Windows/Android 対応
    CI/CD・自動化周り
    CMake・ビルド環境整備
    シミュレーションの作成
    Mac/Linux 対応
    私 相方

    View full-size slide

  13. サポート環境
    両方が担当

    View full-size slide

  14. 対応言語
    C++17 をサポート
    【理由】スマホ対応のためAndroid NDKに合わせた
    ※最近C++20に対応した噂を聞いている(要確認)
    いずれC++20や23へと対応していきたい
    両方が担当

    View full-size slide

  15. コンパイラ
    GCC・Clang・MSVCをサポート
    CI (GitHub Actions) ではGCCとClangでビルド実行
    私の手元ではMSVCでビルド実行
    相方の手元ではClangでビルド実行
    主に相方が担当

    View full-size slide

  16. CI/CD関連
    CI は GitHub Actionsを使用
    単体テスト,全体ビルド等がある
    現在は6種類存在
    テストはGoogle Test を使用
    相方が担当

    View full-size slide

  17. スクリプト一覧
    CodeCounter.py:コード行数をカウント / CTest.*: CTestを実行
    DevelopmentBuild.sh(.bat): MapViewerの開発ビルドを行う
    ProductionBuild.sh(.bat): MapViewerの本番ビルドを行う
    SyncSubmodule.sh(.bat): submoduleを同期する
    UbuntuBuild/Build.sh: Ubuntu上でのビルドを行う
    UbuntuBuild/docker-compose.yml: build環境を
    構築するためのdocker-composeファイル
    相方が担当

    View full-size slide

  18. ライブラリ行数
    内製ライブラリの行数の合計は
    「10803行」
    意外とたくさん書いている
    (大規模なのか,それとも無駄が多くて汚いコードなのか)
    両方が担当

    View full-size slide

  19. ライブラリの構造
    3種類用意
    PAX_SAPIENTICA:描画ライブラリに依存しないもの
    PAX_GRAPHICA:描画ライブラリをラップするもの
    PAX_MAHOROBA:描画ライブラリに依存するもの
    私が担当

    View full-size slide

  20. 描画Libraryのラップ
    書籍のように100年後も扱える製品にしたい
    大きい外部ライブラリの依存を少なくしたい
    長方形の描画など基本的な機能を追加
    マクロ分岐で自由に描画ライブラリを選択
    私が担当

    View full-size slide

  21. 対応した描画Library
    OpenSiv3D・SFML・DxLibに対応
    DirectX, Vulkan, Metal 等を直接使用はしていない
    時間がかかるので簡単に描画できるものを使用
    Qt などにも対応したらより便利かも
    本質じゃないのであまり時間はかけたくない
    主に私が担当

    View full-size slide

  22. 開発時の主な描画
    OpenSiv3Dが便利で使いやすいので愛用
    スマホ対応で究極のC++描画ライブラリになると期待
    Android対応でDxLib,外で人前で作品を見せるときに
    スマホやタブレットで動くものがあると便利
    私が担当

    View full-size slide

  23. その他のライブラリ
    Google Test:テストに使用
    stb:画像の入出力に使用
    OpenMP:並列化に使用(ただしほぼ未使用)
    今後更に追加される可能性あり
    両方が担当

    View full-size slide

  24. 対応OS(GUI)
    Windows・Mac・Android・Linuxをサポート
    iOS はサポート無し(いずれサポートしたい)
    入力デバイスも自由:マウスのみ,キーボードのみ,
    タッチのみでも基本動作はほぼすべて対応
    両方が担当

    View full-size slide

  25. 開発環境(GUI)
    【 SFML 】 CMake,ソリューション (.sln)
    【 OpenSiv3D 】 ソリューション (.sln)
    【 DxLib (Windows) 】 ソリューション (.sln)
    【 DxLib (Android) 】 Android Studio
    両方が担当

    View full-size slide

  26. 地図機能
    私が担当

    View full-size slide

  27. 地図の描画
    GISなので地図を描画する機能が必要
    様々な地図投影法が存在するが,メルカトル図法のみ使用
    メルカトル図法とは経度と緯度が常に直交する図法
    メルカトル図法の地図を分割して表示する形式が望ましい
    その形式である「XYZタイル形式」をサポートした
    私が担当

    View full-size slide

  28. XYZタイルとは
    世界測地系の経緯度が正方形に変換されるよう極域の
    一部地域(北緯及び南緯約85.05112878度以上)を
    除外した範囲をメルカトル投影を使って変換された地図
    地図をコンピュータで管理しやすくした形式
    Z(Zは0以上の整数)がズームレベル,2のZ乗が分割数
    私が担当

    View full-size slide

  29. XYZタイルの座標
    私が担当

    View full-size slide

  30. 初期の地図表示
    二次元 std::vector で管理
    表示範囲が変わった時に画像全て読み直し
    トンデモ実装・めちゃくちゃ重い
    私が担当

    View full-size slide

  31. 初期の地図表示
    表示範囲が変わった時に
    元々読み込んであるものを保持しつつも
    新しい画像を読み込んで管理する良い方法ないかな
    std::unordered_map を使えば簡単にできるのでは?
    私が担当

    View full-size slide

  32. 地図の仕組み
    std::unordered_map の Key の型は uint64 を使用
    Z=8bit, Y=24bit, X=24bit としている(※8bit 余っている)
    XYZタイルのズームレベルとX・Y座標を入れるだけで
    簡単かつ高速に管理が可能となった
    私が担当

    View full-size slide

  33. 地図の仕組み
    Z=7が約1km間隔,Z=17が約1m間隔
    つまり、Z=24が約7.6mm間隔
    基本的にタイルはZ=17までのものがほとんど
    Z=24まで対応しているが24まで使用することはほぼ無い
    私が担当

    View full-size slide

  34. 列挙型撲滅プロジェクト
    私が担当

    View full-size slide

  35. enum定義の問題点
    ユーザが自由に定義できない点
    ソースファイルに直接書き込んでしまう点
    数値で管理するため,文字列と相性が悪い点
    などなど
    私が担当

    View full-size slide

  36. 文字列で管理
    自由にユーザが追加しやすい
    一方でenumや数値管理よりも処理が重くなる
    自由度を保ち,処理を軽くするには
    文字列を数値へ変換すれば良い
    私が担当

    View full-size slide

  37. 文字列を数値へ変換
    文字列を数値へ変換して管理する
    MurmurHash3関数という
    文字列をuint32へ変換する機能を用意
    コードの大部分を改修
    私が担当

    View full-size slide

  38. TSV読み込みと管理
    ・画像
    ・地名/人名
    ・言語/テキスト
    ・暦
    ・シミュレーション
    ・その他設定
    私が担当

    View full-size slide

  39. TSV読み込みと管理
    1行目を読み込む→MurMur3で数値に変換し,数値で保持
    対応する構造体へ変換,2行目以降を格納
    文字列データを数値として保持することによって
    高速にもなり,汎用性も上がった
    私が担当

    View full-size slide

  40. 主に相方が担当
    シミュレーション

    View full-size slide

  41. ABSとは
    エージェントを用いた仮想実験(シミュレーション)
    日本ではマルチエージェントシミュレーション(MAS)と
    呼ばれることが多い
    「マルチエージェントシステム」や「エージェントベース
    モデル」等の似た用語がある
    主に相方が担当

    View full-size slide

  42. 主に相方が担当
    シミュレーションは巨大で
    今回の時間内で話すのは不可能
    また次の機会に……

    View full-size slide

  43. 簡単なまとめ
    CIでGCC/Clangをビルド実行,C++17を使用
    開発環境はCMake・VS sln・Android Studioに対応
    分割された地図は std::unordered_map で管理
    文字列をMurMur3で uint32 へ変換して処理高速化

    View full-size slide

  44. https:// github.com/
    AsPJT/PAX_SAPIENTICA
    GitHubリポジトリ

    View full-size slide

  45. PAX SAPIENTICA
    文献学・考古学・人類学データを用いた ABS & GIS
    各国・各時代の暦表示機能や各時代の環境復元機能を持つ
    XYZ タイルや地物を自由に追加することが可能

    View full-size slide