RMesh::MeshPCA RMesh::mesh::buildPCA( vector<Primitives::Point3d> &points ) { vector<CGAL_Point> cgal_points; CGAL_Line line; CGAL_Plane plane; MeshPCA pca; Primitives::BBoxD bbox; bbox.Set(points); for( int i = 0; i < points.size(); ++i ) { cgal_points.push_back( build_CGAL_Point( points[i] )); } linear_least_squares_fitting_3( cgal_points.begin(), cgal_points.end(), plane,CGAL::Dimension_tag<0>()); // fit line to triangle vertices linear_least_squares_fitting_3( cgal_points.begin(), cgal_points.end(), line, CGAL::Dimension_tag<0>()); pca.up = build_Vector3d( line.direction().vector() ); pca.down = pca.up * (-1.0); pca.front = build_Vector3d( plane.orthogonal_direction().vector() ); pca.back = pca.front * (-1.0); pca.right = pca.up.Cross( pca.front ); pca.left = pca.right * (-1.0); pca.center = bbox.Center(); pca.is_valid = true; return pca; }
void RMesh::mesh::buildPCA(RMesh::mesh &m) { vector<CGAL_Triangle> triangles; getCGALTriangles(m, triangles); CGAL_Line line; CGAL_Plane plane; // fit plane to whole triangles linear_least_squares_fitting_3( triangles.begin(), triangles.end(), plane,CGAL::Dimension_tag<2>()); // fit line to triangle vertices linear_least_squares_fitting_3( triangles.begin(), triangles.end(), line, CGAL::Dimension_tag<0>()); m.axes.up = build_Vector3d( line.direction().vector() ); m.axes.down = m.axes.up * (-1.0); m.axes.front = build_Vector3d( plane.orthogonal_direction().vector() ); m.axes.back = m.axes.front * (-1.0); m.axes.right = m.axes.up.Cross( m.axes.front ); m.axes.left = m.axes.right * (-1.0); m.axes.is_valid = true; }
void fit_point_set(std::list<Point>& points, Plane& plane, Line& line) { // fit a plane // call all versions of the function Kernel kernel; FT quality; Point centroid; std::cout << "fit 3D line..."; quality = linear_least_squares_fitting_3(points.begin(),points.end(),line,CGAL::Dimension_tag<0>()); quality = linear_least_squares_fitting_3(points.begin(),points.end(),line,centroid,CGAL::Dimension_tag<0>()); quality = linear_least_squares_fitting_3(points.begin(),points.end(),line,centroid,CGAL::Dimension_tag<0>(),kernel, CGAL::Default_diagonalize_traits<FT,3>()); std::cout << "done (quality: " << quality << ")" << std::endl; std::cout << "fit 3D plane..."; quality = linear_least_squares_fitting_3(points.begin(),points.end(),plane,CGAL::Dimension_tag<0>()); quality = linear_least_squares_fitting_3(points.begin(),points.end(),plane,centroid,CGAL::Dimension_tag<0>()); quality = linear_least_squares_fitting_3(points.begin(),points.end(),plane,centroid,CGAL::Dimension_tag<0>(),kernel, CGAL::Default_diagonalize_traits<FT,3>()); std::cout << "done (quality: " << quality << ")" << std::endl; }
int main(void) { std::cout << "Test linear least squares fitting of 3D spheres" << std::endl; // centers Point c1(0.0,0.0,0.0); Point c2(1.0,1.0,1.0); // radii FT sqr1 = 0.1; FT sqr2 = 0.5; // add two spheres std::list<Sphere> spheres; spheres.push_back(Sphere(c1,sqr1)); spheres.push_back(Sphere(c2,sqr2)); Line line; Plane plane; Kernel kernel; Point centroid; linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,centroid,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,centroid,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,centroid,CGAL::Dimension_tag<3>(),kernel); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),line,centroid,CGAL::Dimension_tag<2>(),kernel); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,centroid,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,centroid,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,centroid,CGAL::Dimension_tag<3>(),kernel); linear_least_squares_fitting_3(spheres.begin(),spheres.end(),plane,centroid,CGAL::Dimension_tag<2>(),kernel); return 0; }
int main() { std::cout << "Test 3D linear least squares fitting of tetrahedra" << std::endl; // generate two tetrahedra std::list<Tetrahedron> tetrahedra; Point a(0.0,0.0,0.0); Point b(1.0,0.0,0.0); Point c(0.0,1.0,0.0); Point d(0.0,0.0,1.0); Point e(0.0,1.0,1.0); tetrahedra.push_back(Tetrahedron(a,b,c,d)); tetrahedra.push_back(Tetrahedron(a,b,c,e)); Line line; Plane plane; Point centroid; // fit line, no centroid linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,CGAL::Dimension_tag<1>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,CGAL::Dimension_tag<0>()); // fit line, centroid linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<1>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<0>()); // fit plane, no centroid linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,CGAL::Dimension_tag<1>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,CGAL::Dimension_tag<0>()); // fit plane, centroid linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<2>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<1>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<0>()); // If Eigen is available, it's used by default everywhere. // These additional lines test the fallback version #ifdef CGAL_EIGEN3_ENABLED linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<3>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<2>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<1>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),line,centroid,CGAL::Dimension_tag<0>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<3>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<2>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<1>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); linear_least_squares_fitting_3(tetrahedra.begin(),tetrahedra.end(),plane,centroid,CGAL::Dimension_tag<0>(), Kernel(), CGAL::Diagonalize_traits<FT, 3>()); #endif return 0; }