Example #1
0
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;
}
Example #2
0
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;
}