【发布时间】:2016-05-19 11:37:19
【问题描述】:
我得到了一个带有 xy 点坐标的 n 行向量。这些点形成给定 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]);
}
向量排序后,我只是删除重复项以减小向量的大小。最后一步是将第一个点推回向量的末尾以关闭轮廓。 对于像立方体或球这样的标准模型,这可以正常工作,但对于更复杂的模型,atan2 函数可以正常工作。 所以这张图片显示了未排序的点。
当我对向量进行排序时,我得到了这个 conture 作为结果
我的第一个方法是检查 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 排序,然后再按长度排序。但是第二次排序过程会破坏第一次排序函数的空洞结果。
【问题讨论】:
-
所以基本上,atan2 不是正确的排序方式,您想知道如何排序以获得任何给定点集的轮廓。这似乎与数学有关。
-
对我来说 atan2 似乎是对向量进行排序的一个好的开始。但我认为我需要的不仅仅是这一个函数来对整个向量进行排序。
-
atan2 执行循环扫描,这适用于有限的点集,不适用于更复杂的轮廓或原点不在内部的轮廓。
标签: c++ sorting vector coordinates