*Catmull-Clark細分割法(CGALライブラリ) [#f3bfe3d2] 近似細分割手法の1つであるCatumull-Clark再分割法を利用して、凸凹な表面メッシュを滑らかにしたいと思います。 今回使用した表面メッシュは、2本の円管を含む画像データから、円管表面をマーチンキューブス法を利用して取り出したものです。画像の解像度が低いため、円管表面は凸凹しています。 #ref(c3t3_surface_mesh.png,left,nowrap,40%,表面メッシュ); 今回使用したプログラムは[[CGALライブラリ:http://www.cgal.org]]の[[Catmull-Clark Subdivision:http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Subdivision_method_3/Chapter_main.html#Section_52.3]]の例題をそのままです。 結果は下絵のように円管からは程遠いですが、表面はやや滑らかになりました。細分割された面は、特異点以外ではC2連続、特異点でC1連続になります。 #ref(catmull_clark_cgal.png,left,nowrap,40%,catmull_clark); **CatmullClark_subdivision.cpp [#n9b7baec] #code(c){{ #include <CGAL/Polyhedron_3.h> #include <CGAL/Simple_cartesian.h> #include <CGAL/Subdivision_method_3.h> // IO #include <CGAL/IO/Polyhedron_iostream.h> typedef CGAL::Simple_cartesian<double> Kernel; typedef CGAL::Polyhedron_3<Kernel> Polyhedron; int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage: CatmullClark_subdivision d < filename" << std::endl; std::cerr << " d: the depth of the subdivision (0 < d < 10)" << std::endl; std::cerr << " filename: the input mesh (.off)" << std::endl; return EXIT_FAILURE; } int d = argv[1][0] - '0'; Polyhedron P; std::cin >> P; // read the .off CGAL::Subdivision_method_3::CatmullClark_subdivision(P,d); // Output std::cout << P; return EXIT_SUCCESS; } }} **ダウンロードとビルド [#w0808ed9] ソースコードと'''CMakeLists.txt'''ファイル: