*[[2次元Delaunay(杉原幸吉先生)]] [#a59dbce3]

杉原
[[CGAL:http://www.cgal.org]]ライブラリの[[ブーリアン演算:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html]]を使用して、直方体と円柱の表面メッシュに対する差演算を行います。

#ref(boolean_diff.png,center,nowrap,40%,ブーリアン演算(差));

プログラムでは、直方体の表面メッシュ(box.off)と円柱の表面メッシュ(cyl.off)を読み込み、Nef多面体のデータ構造[[CGAL::Nef_polyhedron_3<Traits>:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron_3.html#Cross_link_anchor_1172]]に変換します。CGALではNef多面体に対してブーリアン演算が定義されていますので、これを使用してブーリアン差を計算します。結果はOFFファイル形式でdiff.offというファイル名で出力しています。

**polygon_difference.cxx [#y88ae58d]
#code(c){{
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Nef_polyhedron_3.h>

#include <fstream>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef CGAL::Nef_polyhedron_3<Kernel> Nef_polyhedron;

int main() {

  Polyhedron P1;
  std::ifstream in1("box.off");
  in1 >> P1;

  Polyhedron P2;
  std::ifstream in2("cyl.off");
  in2 >> P2;

  Nef_polyhedron N1(P1);
  Nef_polyhedron N2(P2);

  N1 -= N2;

  Polyhedron P;
  if(N1.is_simple()) {
    N1.convert_to_Polyhedron(P);
    std::ofstream out("diff.off");
    out << P;
  }
  else
  {
    std::cerr << "N1 is not a 2-manifold." << std::endl;
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

}}

**ダウンロードとビルド [#k551ac14]
ソースコードと'''CMakeLists.txt'''ファイル:
#ref(polygon_difference.zip)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS