我得到一个n行的点,xy坐标为点。这些点构成了给定CAD模型的一个概念。现在我想恢复模型的轮廓。所以我尝试用atan2函数对点进行排序。 这是我用来对点进行排序的代码。
std::sort(matrix.begin(), matrix.end(), sort1);
matrix.erase(std::unique(matrix.begin(), matrix.end(), compare2),matrix.end());
matrix.push_back(std::vector<double>(3, 0));
首先,我对矢量矩阵中的点进行排序。作为比较功能,我使用此代码
bool sort1(vector<double> const& s1, vector<double> const& s2)
{
return atan2(s1[1],s1[0])<atan2(s2[1],s2[0]);
}
向量排序后,我只删除重复项以减小向量的大小。最后一步是将第一个点推回到向量的末尾以关闭conture。 对于像立方体或球这样的标准模型,这可以正常工作,但对于更复杂的模型,atan2功能注意工作正常。 所以这个图像显示了未分类的点。
我的第一个方法是检查atan2功能,但它运行正常。问题似乎是atan2功能的结果。所以这个列表显示了实际坐标和atan2函数的结果
x y z atan2
-5.44283 -1.94995 0 -2.79758
-5.36969 -1.93228 0 -2.79617
-5.33637 -1.92454 0 -2.79547
-13.15 -4.76500 0 -2.79395
-5.26308 -1.90750 0 -2.79389
-5.22970 -1.90005 0 -2.7931
-5.15626 -1.88364 0 -2.79134
正如您所看到的那样,当x和y坐标发生变化时,atan2与其他值保持在相同的范围内。对我来说这就是问题,为什么我的绷带不正确。我是否必须在我的排序功能中添加一些内容才能获得正确的结果?
我的一个想法是不仅通过atan2对坐标进行排序,而且还通过点之间,最低atan2和所有其他点之间的矢量长度进行排序。但这是我的问题。我首先按atan2排序,然后再按长度排序。但是第二个排序过程会破坏第一个排序函数的空洞结果。
答案 0 :(得分:1)
atan2
显然无助于通用案例。对于凸起的数字来说,它最有用。考虑一个内部为(0,0)的窄矩形和一个相邻的矩形,并尝试按atan2对它们的点进行排序。
您是否尝试在集合中绘制一个点,然后在迭代步骤中查找最近的尚未绘制的点?
答案 1 :(得分:0)
如果您只处理曲线,那么我建议使用以下算法:
这不是最终解决方案,但它应该能够找到基本曲线和一些多边形。对于更宽的角度范围 R ,您可以近似更多的曲线。