LoginSignup
5
3

More than 3 years have passed since last update.

メッシュクラスを自作した

Last updated at Posted at 2019-12-18

これは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時に間に合わなかった…

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3