/*public*/ bool Geometry::getCentroid(Coordinate& ret) const { if ( isEmpty() ) { return false; } Coordinate c; int dim=getDimension(); if(dim==0) { CentroidPoint cent; cent.add(this); if ( ! cent.getCentroid(c) ) return false; } else if (dim==1) { CentroidLine cent; cent.add(this); if ( ! cent.getCentroid(c) ) return false; } else { CentroidArea cent; cent.add(this); if ( ! cent.getCentroid(c) ) return false; } getPrecisionModel()->makePrecise(c); ret=c; return true; }
TEST (PCL, CentroidPoint) { PointXYZ p1; p1.getVector3fMap () << 1, 2, 3; PointXYZ p2; p2.getVector3fMap () << 3, 2, 1; PointXYZ p3; p3.getVector3fMap () << 5, 5, 5; // Zero points (get should have no effect) { CentroidPoint<PointXYZ> centroid; PointXYZ c (100, 100, 100); centroid.get (c); EXPECT_XYZ_EQ (PointXYZ (100, 100, 100), c); } // Single point { CentroidPoint<PointXYZ> centroid; centroid.add (p1); PointXYZ c; centroid.get (c); EXPECT_XYZ_EQ (p1, c); } // Multiple points { CentroidPoint<PointXYZ> centroid; centroid.add (p1); centroid.add (p2); centroid.add (p3); PointXYZ c; centroid.get (c); EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c); } // Retrieve centroid into a different point type { CentroidPoint<PointXYZ> centroid; centroid.add (p1); PointXYZRGB c; c.rgba = 0x00FFFFFF; centroid.get (c); EXPECT_XYZ_EQ (p1, c); EXPECT_EQ (0x00FFFFFF, c.rgba); } // Centroid with XYZ and RGB { PointXYZRGB cp1; cp1.getVector3fMap () << 4, 2, 4; cp1.rgba = 0xFF330000; PointXYZRGB cp2; cp2.getVector3fMap () << 2, 4, 2; cp2.rgba = 0xFF003300; PointXYZRGB cp3; cp3.getVector3fMap () << 3, 3, 3; cp3.rgba = 0xFF000033; CentroidPoint<PointXYZRGB> centroid; centroid.add (cp1); centroid.add (cp2); centroid.add (cp3); PointXYZRGB c; centroid.get (c); EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c); EXPECT_EQ (0xFF111111, c.rgba); } // Centroid with normal and curavture { Normal np1; np1.getNormalVector4fMap () << 1, 0, 0, 0; np1.curvature = 0.2; Normal np2; np2.getNormalVector4fMap () << -1, 0, 0, 0; np2.curvature = 0.1; Normal np3; np3.getNormalVector4fMap () << 0, 1, 0, 0; np3.curvature = 0.9; CentroidPoint<Normal> centroid; centroid.add (np1); centroid.add (np2); centroid.add (np3); Normal c; centroid.get (c); EXPECT_NORMAL_EQ (np3, c); EXPECT_FLOAT_EQ (0.4, c.curvature); } // Centroid with XYZ and intensity { PointXYZI ip1; ip1.getVector3fMap () << 1, 2, 3; ip1.intensity = 0.8; PointXYZI ip2; ip2.getVector3fMap () << 3, 2, 1; ip2.intensity = 0.2; PointXYZI ip3; ip3.getVector3fMap () << 5, 5, 5; ip3.intensity = 0.2; CentroidPoint<PointXYZI> centroid; centroid.add (ip1); centroid.add (ip2); centroid.add (ip3); PointXYZI c; centroid.get (c); EXPECT_XYZ_EQ (PointXYZ (3, 3, 3), c); EXPECT_FLOAT_EQ (0.4, c.intensity); } // Centroid with label { Label lp1; lp1.label = 1; Label lp2; lp2.label = 1; Label lp3; lp3.label = 2; CentroidPoint<Label> centroid; centroid.add (lp1); centroid.add (lp2); centroid.add (lp3); Label c; centroid.get (c); EXPECT_EQ (1, c.label); } }