使用C ++对点进行排序

时间:2017-11-15 18:26:01

标签: c++ algorithm sorting opencv point

我需要从 std :: vector 数组中找到最低x值最高y值的点。我目前正在使用C ++ sort 函数,在某些情况下可以正常工作但在某些情况下可能会失败。

我的代码是 -

predict(pool(model), type = c('response'))

此代码对于像

这样的案例是成功的
bool SortForMinXMaxY(const Point & a, const Point &b) 
{
     return (a.x < b.x || a.y > b.y) ;
}

sort( Points.begin(), Points.end(), SortForMinXMaxY);
MinXMaxY = Points[0];

但是失败了 - [返回[47,128]但是,我需要[48,498],因为它是最高Y的点,可能的最低X]

[49, 500]
[49, 374]
[49, 260]
[49, 129]
[440, 374]
[440, 259]
[440, 128]
[441, 501]

对现有代码的任何修改或任何其他方法来解决普遍情况下的这个问题都是值得赞赏的。我还需要从这一点找到更多三点:

  1. 最低x和最低y
  2. 最高x和最低y
  3. 最高x和最高y
  4. 所以,如果有办法轻松获得这四点,那将是最好的。

3 个答案:

答案 0 :(得分:3)

比较功能中使用的逻辑不正确。它不符合strictly weak ordering的要求。

将其更改为:

bool SortForMinXMaxY(const Point & a, const Point &b) 
{
   if ( a.x != b.x )
   {
      return (a.x < b.x);
   }
   return (a.y > b.y);
}

答案 1 :(得分:1)

您的问题(找到最低x值最高y值 ILL-POSED ,因为最低x值可能是另一个点比最高的y值。你不能在同一点上要求两者,而是要更清楚你真正想要的东西。有很多可能性:

  1. y

    中最高的x[](Point const&a, Point const&b) { return a.x==b.x? a.y<b.y : a.x>b.x; }
    x
  2. y

    中得分最低的[](Point const&a, Point const&b) { return a.y==b.y? a.x>b.x : a.y<b.y; }
    y-x
  3. 最大差异点[](Point const&a, Point const&b) { return a.y-a.x < b.y-b.x; }

    [48,498]
  4. 从你的例子中,我猜它是你真正想要的最后一个,因为 auto extremum = std::max_element(Points.begin(), Points.end(), [](Point const&a, Point const&b) { return a.y-a.x < b.y-b.x; }); 既没有最低的x也没有最高的y,但是最大的差异。

    最后,仅仅找到某些值的(某些函数)的最大值,您不需要对它们进行排序,而只需要进行一次传递:

    {{1}}

答案 2 :(得分:0)

您正在调用的C ++排序函数是快速排序,因此每个元素都将被多次计算。您需要更严格的确保每种可能性都由函数评估。

bool SortForMinXMaxY(const Point & a, const Point &b) 
{
   if ( a.x == b.x )
   {
      return (a.y > b.y);
   }
   if ( a.y == b.y)
   {
      return (a.x < b.x);
   }
   return (a.x < b.x || a.y > b.y);
}
相关问题