Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
C++でつくる歴史シミュレーションGIS
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
As Project
February 11, 2024
Programming
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++でつくる歴史シミュレーションGIS
文献学・考古学・人類学データを用いたABS & GIS
各国・各時代の暦表示機能や各時代の環境復元機能を持つ
XYZタイルや地物を自由に追加することが可能
As Project
February 11, 2024
More Decks by As Project
See All by As Project
考古学・人類学・文献学のための次世代GISの開発―時間情報とAgent-based modelの活用―
aspjt
1
360
クソアプリハッカソン 2023
aspjt
0
110
世界を創造するOSS開発を始めた話
aspjt
0
120
Other Decks in Programming
See All in Programming
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
iOSDCのペンライトを自動制御したい!
akkeylab
0
350
setup-vp GitLab対応の裏側
naokihaba
0
150
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
760
AWSに止められる覚悟してますか?
morizo_1984
2
500
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
220
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
470
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
310
Agents on Rails - Rails at Scale 2026
irinanazarova
0
320
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
410
Featured
See All Featured
Leo the Paperboy
mayatellez
10
2.3k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Rails Girls Zürich Keynote
gr2m
96
14k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
430
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
580
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
460
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Transcript
C++でつくる 歴史シミュレーションGIS C++ MIX #9 2023-02-09
GitHubリポジトリのQRコードと URLを表示するのでお手持ちの スマホ or パソコンをご用意ください
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
補足(学問) 文献学:日本書紀,古事記等の文字資料から歴史を考察 考古学:遺跡から出た遺物・遺構から歴史を考察 人類学:人骨の形質や遺伝子の情報から歴史を考察
補足(用語) ABS:Agent-based Simulation(後に解説) GIS:地理情報システム - Geographic Information System XYZタイル・地物:GISで表示する地図や点のこと
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能
None
開発期間 2023年1月10日から現在まで(1年ちょっと) 927 コミット / 96 プルリクエスト 2024年1月10日 ソフトウェア正式リリース
開発意義 歴史的事象の分析を得意とするGISは少ない 一般のGISは空間情報の扱いに長けているが 歴史にとって重要な時間情報の扱いは不向きなことが多い
開発意義 そのため,歴史的事象の分析のためのABSとGISの 双方の機能を持つソフトウェアを開発した 時間情報,空間情報,シミュレーションの3つの機能を 持つ汎用性・拡張性の高いソフトウェアを目指した
開発者(2人体制) 企画の立案が得意 Windows環境で開発 厳密な設計が得意 Mac環境で開発 私 相方
開発担当 データ作成・デザイン 描画関連・仕様の作成 暦と地図機能の作成 Windows/Android 対応 CI/CD・自動化周り CMake・ビルド環境整備 シミュレーションの作成 Mac/Linux
対応 私 相方
サポート環境 両方が担当
対応言語 C++17 をサポート 【理由】スマホ対応のためAndroid NDKに合わせた ※最近C++20に対応した噂を聞いている(要確認) いずれC++20や23へと対応していきたい 両方が担当
コンパイラ GCC・Clang・MSVCをサポート CI (GitHub Actions) ではGCCとClangでビルド実行 私の手元ではMSVCでビルド実行 相方の手元ではClangでビルド実行 主に相方が担当
CI/CD関連 CI は GitHub Actionsを使用 単体テスト,全体ビルド等がある 現在は6種類存在 テストはGoogle Test を使用
相方が担当
スクリプト一覧 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ファイル 相方が担当
ライブラリ行数 内製ライブラリの行数の合計は 「10803行」 意外とたくさん書いている (大規模なのか,それとも無駄が多くて汚いコードなのか) 両方が担当
ライブラリの構造 3種類用意 PAX_SAPIENTICA:描画ライブラリに依存しないもの PAX_GRAPHICA:描画ライブラリをラップするもの PAX_MAHOROBA:描画ライブラリに依存するもの 私が担当
描画Libraryのラップ 書籍のように100年後も扱える製品にしたい 大きい外部ライブラリの依存を少なくしたい 長方形の描画など基本的な機能を追加 マクロ分岐で自由に描画ライブラリを選択 私が担当
対応した描画Library OpenSiv3D・SFML・DxLibに対応 DirectX, Vulkan, Metal 等を直接使用はしていない 時間がかかるので簡単に描画できるものを使用 Qt などにも対応したらより便利かも 本質じゃないのであまり時間はかけたくない
主に私が担当
開発時の主な描画 OpenSiv3Dが便利で使いやすいので愛用 スマホ対応で究極のC++描画ライブラリになると期待 Android対応でDxLib,外で人前で作品を見せるときに スマホやタブレットで動くものがあると便利 私が担当
その他のライブラリ Google Test:テストに使用 stb:画像の入出力に使用 OpenMP:並列化に使用(ただしほぼ未使用) 今後更に追加される可能性あり 両方が担当
対応OS(GUI) Windows・Mac・Android・Linuxをサポート iOS はサポート無し(いずれサポートしたい) 入力デバイスも自由:マウスのみ,キーボードのみ, タッチのみでも基本動作はほぼすべて対応 両方が担当
None
開発環境(GUI) 【 SFML 】 CMake,ソリューション (.sln) 【 OpenSiv3D 】 ソリューション
(.sln) 【 DxLib (Windows) 】 ソリューション (.sln) 【 DxLib (Android) 】 Android Studio 両方が担当
地図機能 私が担当
地図の描画 GISなので地図を描画する機能が必要 様々な地図投影法が存在するが,メルカトル図法のみ使用 メルカトル図法とは経度と緯度が常に直交する図法 メルカトル図法の地図を分割して表示する形式が望ましい その形式である「XYZタイル形式」をサポートした 私が担当
XYZタイルとは 世界測地系の経緯度が正方形に変換されるよう極域の 一部地域(北緯及び南緯約85.05112878度以上)を 除外した範囲をメルカトル投影を使って変換された地図 地図をコンピュータで管理しやすくした形式 Z(Zは0以上の整数)がズームレベル,2のZ乗が分割数 私が担当
XYZタイルの座標 私が担当
初期の地図表示 二次元 std::vector で管理 表示範囲が変わった時に画像全て読み直し トンデモ実装・めちゃくちゃ重い 私が担当
初期の地図表示 表示範囲が変わった時に 元々読み込んであるものを保持しつつも 新しい画像を読み込んで管理する良い方法ないかな std::unordered_map を使えば簡単にできるのでは? 私が担当
地図の仕組み std::unordered_map の Key の型は uint64 を使用 Z=8bit, Y=24bit, X=24bit
としている(※8bit 余っている) XYZタイルのズームレベルとX・Y座標を入れるだけで 簡単かつ高速に管理が可能となった 私が担当
地図の仕組み Z=7が約1km間隔,Z=17が約1m間隔 つまり、Z=24が約7.6mm間隔 基本的にタイルはZ=17までのものがほとんど Z=24まで対応しているが24まで使用することはほぼ無い 私が担当
None
列挙型撲滅プロジェクト 私が担当
enum定義の問題点 ユーザが自由に定義できない点 ソースファイルに直接書き込んでしまう点 数値で管理するため,文字列と相性が悪い点 などなど 私が担当
文字列で管理 自由にユーザが追加しやすい 一方でenumや数値管理よりも処理が重くなる 自由度を保ち,処理を軽くするには 文字列を数値へ変換すれば良い 私が担当
文字列を数値へ変換 文字列を数値へ変換して管理する MurmurHash3関数という 文字列をuint32へ変換する機能を用意 コードの大部分を改修 私が担当
TSV読み込みと管理 ・画像 ・地名/人名 ・言語/テキスト ・暦 ・シミュレーション ・その他設定 私が担当
TSV読み込みと管理 1行目を読み込む→MurMur3で数値に変換し,数値で保持 対応する構造体へ変換,2行目以降を格納 文字列データを数値として保持することによって 高速にもなり,汎用性も上がった 私が担当
主に相方が担当 シミュレーション
ABSとは エージェントを用いた仮想実験(シミュレーション) 日本ではマルチエージェントシミュレーション(MAS)と 呼ばれることが多い 「マルチエージェントシステム」や「エージェントベース モデル」等の似た用語がある 主に相方が担当
None
主に相方が担当 シミュレーションは巨大で 今回の時間内で話すのは不可能 また次の機会に……
簡単なまとめ CIでGCC/Clangをビルド実行,C++17を使用 開発環境はCMake・VS sln・Android Studioに対応 分割された地図は std::unordered_map で管理 文字列をMurMur3で uint32
へ変換して処理高速化
https:// github.com/ AsPJT/PAX_SAPIENTICA GitHubリポジトリ
PAX SAPIENTICA 文献学・考古学・人類学データを用いた ABS & GIS 各国・各時代の暦表示機能や各時代の環境復元機能を持つ XYZ タイルや地物を自由に追加することが可能