@@ -1660,6 +1660,66 @@ TEST(SampleConsensusModelTorusSelfIntersectSpindle, RANSAC)
1660
1660
EXPECT_NEAR (coeff[7 ], 0.25000000000000017 , 1e-2 );
1661
1661
}
1662
1662
1663
+ TEST (SampleConsensusModelCylinder, SampleIntersectingLines)
1664
+ {
1665
+ PointCloud<PointXYZ> cloud;
1666
+ PointCloud<Normal> normals;
1667
+ cloud.resize (2 );
1668
+ normals.resize (2 );
1669
+ cloud[0 ].getVector3fMap () << 0 .0f , 1 .0f , 0 .0f ;
1670
+ cloud[1 ].getVector3fMap () << 1 .0f , 0 .0f , 0 .0f ;
1671
+ normals[0 ].getNormalVector3fMap () << 0 .0f , 1 .0f , 0 .0f ;
1672
+ normals[1 ].getNormalVector3fMap () << 1 .0f , 0 .0f , 0 .0f ;
1673
+
1674
+ SampleConsensusModelCylinder<PointXYZ, Normal> model (cloud.makeShared ());
1675
+ model.setInputNormals (normals.makeShared ());
1676
+
1677
+ Eigen::VectorXf model_coefficients;
1678
+ model.computeModelCoefficients ({0 , 1 }, model_coefficients);
1679
+
1680
+ ASSERT_EQ (7 , model_coefficients.size ());
1681
+
1682
+ EXPECT_NEAR (0 .0f , model_coefficients[0 ], 1e-5f );
1683
+ EXPECT_NEAR (0 .0f , model_coefficients[1 ], 1e-5f );
1684
+ EXPECT_NEAR (0 .0f , model_coefficients[3 ], 1e-5f );
1685
+ EXPECT_NEAR (0 .0f , model_coefficients[4 ], 1e-5f );
1686
+ EXPECT_LT (0 .0f , std::abs (model_coefficients[5 ]));
1687
+ EXPECT_NEAR (1 .0f , model_coefficients[6 ], 1e-5f );
1688
+ }
1689
+
1690
+ TEST (SampleConsensusModelCylinder, SampleModelsSymmetric)
1691
+ {
1692
+ PointCloud<PointXYZ> cloud;
1693
+ PointCloud<Normal> normals;
1694
+ cloud.resize (2 );
1695
+ normals.resize (2 );
1696
+ cloud[0 ].getVector3fMap () << 0 .1f , 1 .3f , 0 .4f ;
1697
+ cloud[1 ].getVector3fMap () << 1 .2f , -0 .2f , -0 .1f ;
1698
+ normals[0 ].getNormalVector3fMap () << 0 .0f , 0 .9f , -0 .1f ;
1699
+ normals[1 ].getNormalVector3fMap () << 1 .1f , -0 .2f , 0 .0f ;
1700
+
1701
+ SampleConsensusModelCylinder<PointXYZ, Normal> model (cloud.makeShared ());
1702
+ model.setInputNormals (normals.makeShared ());
1703
+
1704
+ Eigen::VectorXf model_coefficients, model_coefficients_swapped;
1705
+ model.computeModelCoefficients ({0 , 1 }, model_coefficients);
1706
+ model.computeModelCoefficients ({1 , 0 }, model_coefficients_swapped);
1707
+
1708
+ ASSERT_EQ (7 , model_coefficients.size ());
1709
+ ASSERT_EQ (7 , model_coefficients_swapped.size ());
1710
+
1711
+ Eigen::Vector4f pt1 (model_coefficients[0 ], model_coefficients[1 ], model_coefficients[2 ], 0 .f );
1712
+ Eigen::Vector4f dir1 (model_coefficients[3 ], model_coefficients[4 ], model_coefficients[5 ], 0 .f );
1713
+ Eigen::Vector4f pt2 (model_coefficients_swapped[0 ], model_coefficients_swapped[1 ], model_coefficients_swapped[2 ], 0 .f );
1714
+ Eigen::Vector4f dir2 (model_coefficients_swapped[3 ], model_coefficients_swapped[4 ], model_coefficients_swapped[5 ], 0 .f );
1715
+
1716
+ // Check if both cylinder axes are the same
1717
+ EXPECT_GT (1e-5 , sqrPointToLineDistance (pt2, pt1, dir1));
1718
+ EXPECT_GT (1e-5f , (dir1 * (dir2.x () / dir1.x ()) - dir2).squaredNorm ());
1719
+
1720
+ EXPECT_NEAR (model_coefficients[6 ], model_coefficients_swapped[6 ], 1e-5f );
1721
+ }
1722
+
1663
1723
int
1664
1724
main (int argc, char ** argv)
1665
1725
{
0 commit comments