c++ - 对 vector 中的点进行排序以形成轮廓

标签 c++ sorting vector coordinates

我得到了一个包含 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 函数注意工作正常。 所以这张图片显示了未排序的点。 Picture of unsorted points

当我对 vector 进行排序时,我得到了这个结构作为结果 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 的点与所有其他点之间的 vector 长度对坐标进行排序。但这是我的问题。我会先按 atan2 排序,然后再按长度排序。但是第二次排序过程会破坏第一次排序函数的空洞结果。

最佳答案

atan2 显然在一般情况下无济于事。它主要适用于凸图形。考虑一个内部有 (0,0) 的窄矩形和一个相邻的矩形,并尝试按它们的 atan2 对它们的点进行排序。 您是否尝试过在集合中绘制一个点,然后寻找最近的尚未绘制的点作为迭代步骤?

关于c++ - 对 vector 中的点进行排序以形成轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37322047/

相关文章:

c++ - 如何在保持文档打开的同时关闭 MFC CVIEW

c# - 通过反射从 C# 访问 C++ 非成员函数

mysql - InnoDB 与 MyIsam 在频繁排序的 MySQL 5.5 表上的比较

c++ - vector 第一个指针的变化

c++ - 如何只接受整数而忽略其他数据类型?

c++ - 链接/编译使用 boost/filesystem.hpp 的程序

C++ 将指定的 vector 内容复制到另一个 vector

c++ - 如何从 C++ 中的 vector 中删除几乎重复项

javascript - Jquery/JavaScript : Sort a datatable on column that has <a>

sorting - 在CUDA上有什么好的排序算法?