メインコンテンツに移動

モーメント

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());

これで任意の四面体の配列が構成する形状の重心が計算できる.