在向量中对点进行排序以形成conture

时间:2016-05-19 11:37:19

标签: c++ sorting vector coordinates

我得到一个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功能注意工作正常。 所以这个图像显示了未分类的点。 Picture of unsorted points

当我对矢量进行排序时,我得到了这个结果 enter image description here

我的第一个方法是检查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排序,然后再按长度排序。但是第二个排序过程会破坏第一个排序函数的空洞结果。

2 个答案:

答案 0 :(得分:1)

atan2显然无助于通用案例。对于凸起的数字来说,它最有用。考虑一个内部为(0,0)的窄矩形和一个相邻的矩形,并尝试按atan2对它们的点进行排序。 您是否尝试在集合中绘制一个点,然后在迭代步骤中查找最近的尚未绘制的点?

答案 1 :(得分:0)

如果您只处理曲线,那么我建议使用以下算法:

  1. 定义角度范围 R
  2. 取初始点 A ,将其标记为已访问
  3. 查找最接近 A B ,将其标记为已访问
  4. 计算向量[ A B ]
  5. 形成的方向
  6. 在角度范围 R 中找到最接近 B 未访问点 C 并将其标记为已访问
  7. 转到第4步, B A C B
  8. 这不是最终解决方案,但它应该能够找到基本曲线和一些多边形。对于更宽的角度范围 R ,您可以近似更多的曲线。