简体   繁体   English

如何逆时针对一个向量的所有点进行排序

[英]How to sort in counterclockwise all point of one vector with n elments

I am searching a solution for following problem: 我正在寻找以下问题的解决方案:

I planned to solve this with sort of vectors but It isn't a solution for all of my case. 我计划用一些向量来解决这个问题,但它不是我所有情况的解决方案。

I write before this post about , how to sort vector of points with (x, y, z). 我在这篇文章前写过,如何用(x,y,z)对点的矢量进行排序。

I will explain here what the problem is. 我将在这里解释问题是什么。

I have this vector : 我有这个向量

 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]

First step sort by z : Then 第一步按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]

Second step sort by y : Then 第二步按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] 

Third step sort by x : Then 第三步按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] 

I would like a vector with the first half of the points sorted in a counterclockwise direction. 我想要一个向量,前半部分按逆时针方向排序。

Would anyone help me? 有人帮我吗?

I'm not writing out the full soution, but you can pass a comparer to std::sort: 我没有写出完整的说法,但你可以将比较器传递给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.
   }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM