【问题标题】:Sort Points Using C++ [closed]使用 C++ 对点进行排序 [关闭]
【发布时间】:2018-04-29 02:36:08
【问题描述】:

我有一个 std::vector<:point> 数组,看起来像-

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

让我们将数组元素视为[x, y]。现在我需要从数组中获取 4 个元素 -

  1. 最低 x 最高 y
  2. 最低 x 最低 y
  3. 最高 x 最低 y
  4. 最高 x 最高 y

目前,我正在使用函数根据条件进行排序,然后获取一个点。

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

使用 C++ 和 OpenCV 实现目标的标准方法应该是什么?

【问题讨论】:

  • 你已经看过here了吗?
  • 也许你可以找到“与边界矩形左上角距离最小的点”,但不知道如何在排序中使用它。也许只是……像 close2tlCorner 指向这两个点的边界矩形?
  • 正如@Micka 所说,“最低 x 和最高 y”是什么意思? x 非常低但 y 值中等的值与 x 稍高但 y 高得多的值相比如何?你只是想比较 x-y 吗?
  • 那么给定点 (0,0) 和 (1,1) 你想要哪一个?
  • 好吧,最低的 x 是 47,因为 47 没有其他点,所以这是赢家?如果没有最低 x(例如 47)和同时最高 y(例如 502)的点,但只有介于两者之间的点,您必须告诉算法您关于 x 和 y 如何协同工作的指标。我想告诉你,你的标准没有很好地定义你的问题。试试 a.x-a.y

标签: c++ algorithm sorting opencv point


【解决方案1】:

您的问题(找到最低 x 值最高 y 值)是 ILL-POSED,因为最低 x 值可能是另一个点比最高的 y 值。你不能同时要求两者,但要更清楚你真正想要什么。有多种可能性:

  1. x最低的点中最高的y

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

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

    [](Point const&a, Point const&b)
    { return a.y-a.x < b.y-b.x; }
    

从您的示例中,我想这是您真正想要的最后一个,因为[48,498] 既没有最低的 x 也没有最高的 y,而是最大的差异。

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

 auto extremum = std::max_element(Points.begin(), Points.end(),
                                  [](Point const&a, Point const&b)
                                  { return a.y-a.x < b.y-b.x; });

【讨论】:

    【解决方案2】:

    您调用的 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);
    }
    

    【讨论】:

    • 这行不通!
    • 好的。 @rsahu 解决方案有效吗?
    • 不。这也行不通。
    • 如果使用"return (a.x b.y) ;",结果是什么?
    • 使用 && 不起作用。这不是严格的弱排序。
    【解决方案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);
    }
    

    【讨论】:

    • 不走运。返回与我相同的输出。
    • @nsssayom,我认为您对要完成的任务的描述与函数名称之间存在不匹配。我会将最后一行更改为 return (a.y &lt; b.y); 以匹配描述。
    • 显然没有不匹配,并且您上次编辑返回的输出与我的代码相同。
    • @nsssayom,请发帖minimal reproducible example。这将有助于提供进一步的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多