これはC++ Advent Calendar 2019 18日目の記事です。
昨日は@43x2さんのC++でGCを実装してみたでした。
明日は@CdecPGLさんの担当です。
はじめに
年末ですね。忘年会シーズンですね。退社間際に会社の先輩からとばっちりの口撃をくらい、その後高校の同級生との忘年会に参加して不愉快な出来事を忘れるためにワインを飲んでいたら、Advent Calendarの担当日であることも忘れそうになりました。
さて、参加を表明してから何を書こうかずっと悩み、結局いいアイデアが思い浮かばなかったので、研究のために作成したメッシュクラスをもとにライブラリを作り始めたよというお話をしてお茶を濁すことにします。あと10分以内に…
fmesh
fmesh
はフラクチャー(亀裂)を表現するためのヘッダーのみのメッシュライブラリです。レポジトリのmotivation(動機)に書いていますが、面を表現するメッシュライブラリで分岐を許すものがOSSになかったので研究の過程で自作したメッシュクラスが元になっています。その後色々学んだこと、実装していて思ったことなどをとりこみ、一から作りなおしてライブラリとして公開してみました。順次機能を追加して行く予定です。
特徴
- ヘッダーのみ
- 三角形・四角形の面をサポート
- 面の分岐をサポート
- 型安全なインデックスを使ってメッシュ要素にアクセス
- Range-based forに対応
- Boost.PropertyMapに似た機能を提供する
property_array
などなど。
使い方
#include <vector>
#include "fmesh/fixed_size_face.hpp"
#include "fmesh/fracture_mesh.hpp"
using namespace fmesh;
struct point {
double x;
double y;
double z;
point() = default;
point(double tx, double ty, double tz) : x{tx}, y{ty}, z{tz} {}
};
int main() {
fracture_mesh<point, tri_face> mesh;
// Add vertices
std::vector<vertex_index> v_ids;
v_ids.push_back(mesh.add_vertex(0.0, 0.0, 0.0));
v_ids.push_back(mesh.add_vertex(1.0, 0.0, 0.0));
v_ids.push_back(mesh.add_vertex(0.0, 0.0, 1.0));
v_ids.push_back(mesh.add_vertex(1.0, 0.0, 1.0));
v_ids.push_back(mesh.add_vertex(0.0, 0.0, 2.0));
v_ids.push_back(mesh.add_vertex(2.0, 0.0, 0.5));
// Add faces
std::vector<face_index> f_ids;
f_ids.push_back(mesh.add_face(v_ids[0], v_ids[1], v_ids[2]));
f_ids.push_back(mesh.add_face(v_ids[1], v_ids[3], v_ids[2]));
f_ids.push_back(mesh.add_face(v_ids[2], v_ids[3], v_ids[4]));
f_ids.push_back(mesh.add_face(v_ids[1], v_ids[5], v_ids[3]));
// Access to a point
const auto& p1 = mesh.vertex(v_idx[0]);
// Access to a face
const auto& f1 = mesh.face(f_idx[0]);
// Range-based for
for (auto&& vi : mesh.vertices()) {
const auto& p = mesh.vertex(vi);
// ...
}
for (auto&& ei : mesh.edges()) {
const auto& e = mesh.edge(ei);
// ...
}
for (auto&& fi : mesh.faces()) {
const auto& f = mesh.face(fi);
// ...
}
// Invalidate vertices and faces
mesh.invalidate(v_ids[0]);
mesh.invalidate(f_ids[1]);
// Remove invalid mesh entities
mesh.remove_invalid_entities();
}
今後の予定
元のクラスには用意したけど、まだ移植していない機能がたくさんあるので、順次追加していきます。
ああ、0時に間に合わなかった…