我得到了一个包含 n 行的 vector ,其中点的 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));
所以首先我对 vector 矩阵中的点进行排序。作为比较功能,我使用这段代码
bool sort1(vector<double> const& s1, vector<double> const& s2)
{
return atan2(s1[1],s1[0])<atan2(s2[1],s2[0]);
}
vector 排序后,我只是删除重复项以减小 vector 的大小。最后一步是将第一个点推回 vector 的末尾以关闭轮廓。 对于像立方体或球这样的标准模型,这工作正常,但对于更复杂的模型,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 的点与所有其他点之间的 vector 长度对坐标进行排序。但这是我的问题。我会先按 atan2 排序,然后再按长度排序。但是第二次排序过程会破坏第一次排序函数的空洞结果。
最佳答案
atan2
显然在一般情况下无济于事。它主要适用于凸图形。考虑一个内部有 (0,0) 的窄矩形和一个相邻的矩形,并尝试按它们的 atan2 对它们的点进行排序。
您是否尝试过在集合中绘制一个点,然后寻找最近的尚未绘制的点作为迭代步骤?
关于c++ - 对 vector 中的点进行排序以形成轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37322047/