CGALでは, 3D領域の体積以外にも, いろいろと計算ができます.
幾何重心(centroid)
点が同一の重さをもつとして,その重心を求めることができます.
#include <CGAL/centroid.h> ... CGAL::Tetrahedron<Kernel> T=.....; //四面体があったとしよう auto G=CGAL::centroid(T); //幾何中心を求める std::cout << G.x() << " " << G.y() << " " << G.z() << std::endl;
これで四面体Tの幾何中心を求めることができる.
質量重心(barycenter)
点にそれぞれ質量が与えられているときに, その重心を求めることができます.たとえば四面体の配列Tが与えられているとしましょう.
#include <CGAL/centroid.h> #include <CGAL/barycenter.h> ... using Scalar=Kernel::FT; using Point=Kernel::Point_3; ... std::vector<CGAL::Tetrahedron> Tarray; Tarray=... //四面体の配列を設定してね♪ ... std::vector<Point,Scalar> Pt_Weight; //(座標, 質量)の配列 for(auto& t:Tarray) //四面体の幾何中心と体積を質量として記録 Pt_Weight.push_back(std::make_pair(CGAL::centroid(t),t.volume())); auto GP=CGAL::barycenter(Pt_Weight.begin(),Pt_Weight.end()); //四面体の配列の重心をゲット Eigen::Vector3d ret; //計算結果をEigenのベクトルに突っ込む予定 ret[0]=CGAL::to_double(GP.x()); ret[1]=CGAL::to_double(GP.y()); ret[2]=CGAL::to_double(GP.z());
これで任意の四面体の配列が構成する形状の重心が計算できる.