如何逆时针排序具有n个元素的一个向量的所有点

Posted

技术标签:

【中文标题】如何逆时针排序具有n个元素的一个向量的所有点【英文标题】:How to sort in counterclockwise all point of one vector with n elments 【发布时间】:2017-03-20 16:29:28 【问题描述】:

我正在寻找以下问题的解决方案:

我计划用某种向量来解决这个问题,但这并不是我所有情况的解决方案。

我在this post about之前写过,如何用(x, y, z)对点向量进行排序。

我会在这里解释问题是什么。

我有这个矢量

 Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
 Point [1] = [X: 3.00;Y: 0.00;Z: 3.00] 
 Point [2] = [X: 3.00;Y: 5.00;Z: 0.00] 
 Point [3] = [X: 3.00;Y: 5.00;Z: 3.00] 
 Point [4] = [X: 0.00;Y: 5.00;Z: 0.00] 
 Point [5] = [X: 0.00;Y: 5.00;Z: 3.00] 
 Point [6] = [X: 0.00;Y: 0.00;Z: 0.00] 
 Point [7] = [X: 0.00;Y: 0.00;Z: 3.00]

第一步按z排序:然后

std::sort(std::begin(vector_points), std::end(vector_points),
[](auto const& a, auto const& b) return (a.z < b.z); );

 Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
 Point [1] = [X: 3.00;Y: 5.00;Z: 0.00] 
 Point [2] = [X: 0.00;Y: 5.00;Z: 0.00] 
 Point [3] = [X: 0.00;Y: 0.00;Z: 0.00] 
 Point [4] = [X: 3.00;Y: 0.00;Z: 3.00] 
 Point [5] = [X: 3.00;Y: 5.00;Z: 3.00] 
 Point [6] = [X: 0.00;Y: 5.00;Z: 3.00] 
 Point [7] = [X: 0.00;Y: 0.00;Z: 3.00]

第二步按y排序:然后

 auto yComp = [](const auto& p1, const auto& p2)return p1.y < p2.y;;

 std::sort(vector_points.begin(), vector_points.begin() + 4, yComp);

 std::sort(vector_points.begin() + 4, vector_points.begin() + 8, yComp);

 Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
 Point [1] = [X: 0.00;Y: 0.00;Z: 0.00] 
 Point [2] = [X: 3.00;Y: 5.00;Z: 0.00] 
 Point [3] = [X: 0.00;Y: 5.00;Z: 0.00] 
 Point [4] = [X: 3.00;Y: 0.00;Z: 3.00] 
 Point [5] = [X: 0.00;Y: 0.00;Z: 3.00] 
 Point [6] = [X: 3.00;Y: 5.00;Z: 3.00] 
 Point [7] = [X: 0.00;Y: 5.00;Z: 3.00] 

第三步按x排序:然后

std::sort(vector_points.begin(), vector_points.begin() + 2, xComp);

std::sort(vector_points.begin() + 2, vector_points.begin() + 4, xComp);

std::sort(vector_points.begin() + 4, vector_points.begin() + 6, xComp);

std::sort(vector_points.begin() + 6, vector_points.begin() + 8, xComp);

 Point [0] = [X: 0.00;Y: 0.00;Z: 0.00] 
 Point [1] = [X: 3.00;Y: 0.00;Z: 0.00] 
 Point [2] = [X: 0.00;Y: 5.00;Z: 0.00] 
 Point [3] = [X: 3.00;Y: 5.00;Z: 0.00] 
 Point [4] = [X: 0.00;Y: 0.00;Z: 3.00] 
 Point [5] = [X: 3.00;Y: 0.00;Z: 3.00] 
 Point [6] = [X: 0.00;Y: 5.00;Z: 3.00] 
 Point [7] = [X: 3.00;Y: 5.00;Z: 3.00] 

我想要一个前半部分点按逆时针方向排序的向量。

有人可以帮我吗?

【问题讨论】:

您的三重排序未正确排序,因为std::sort 不是stable。您需要改用std::stable_sort。更好的方法是将比较函数更改为return std::tie(a.x, a.y, a.z) &lt; std::tie(b.x, b.y, b.z);。顺时针排序适用于 2D 点,不知道如何将其推广到 3D 点。 【参考方案1】:

我没有写出完整的解决方案,但您可以将比较器传递给 std::sort:

std::sort(std::begin(vector_points), std::end(vector_points), [](const auto& a, const auto& b)

   if (a.z < 0)
   
      //compare x and y points and return true/false depending.
   
   else
   
      //compare x and y points and return false/true depending.
   
);

【讨论】:

以上是关于如何逆时针排序具有n个元素的一个向量的所有点的主要内容,如果未能解决你的问题,请参考以下文章

按给定轴的角度对点进行排序?

按顺时针点坐标排序

Leetcode练习(Python):数组类:第54题:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

CF598C Nearest vectors

按顺时针顺序对点进行排序?

Vjudge - E - 这是高中数学向量题