在2D矢量数组中查找右上角的元素

时间:2016-11-14 09:53:48

标签: c sorting

我有一个由9个向量组成的数组,它们构成一个3x3点阵。 现在我想找到最“左上角”(标有O)和“最右上角”(标有D)元素。 整个事情不是矩形,数组没有排序。所以它可能看起来像这样:

array[0] x= 771 y=324
array[1] x= 968 y=323
array[2] x= 868 y= 397
array[3] x= 1065 y= 368
array[4] x= 1164 y= 326
array[5] x= 768 y= 470
array[6] x= 966 y= 471
array[7] x= 1000 y= 452
array[8] x= 1165 y= 472

O----x----D
|    |    |
|    |    |
x----x----x
|    |    |
|    |    |
x----x----x

我真的不知道从哪里开始。我是否同时比较x和y?

   FindD(int& x, int& y)
    {
      for (int i = 0; i < array.size(); i++)
      {
        for (int j = 0; j < array.size(); j++)
        {
          if(i != j)
          {

            //compare the array elements
          }

        }
      }
    }

FindO(int& x, int& y)

编辑:我应该指出,这些点并非随意放置在飞机上。它们总是以3x3模式出现,但点之间的距离相差一些像素。此外,整个图案可能会放置一点旋转。 这就是为什么我想找到最右上角和左上角的元素。获得旋转角度。

4 个答案:

答案 0 :(得分:2)

O----x----D
|    |    |
|    |    |
T----x----T
|    |    |
|    |    |
x----x----x

假设&#34;稍微旋转&#34;意味着上面标记为T的点不能具有比您正在寻找的更高的y值,并假设您的坐标从左下角开始并且y值向上增加并且x值增加到右:

找到具有最高y值的三个点,具有最低x值的那个是左边的那个。

答案 1 :(得分:0)

创建一个计算min的函数和一个计算数组最大值的函数。传递所有x点数组和y点数组,找到min x,max y和max x。答案是(min x,max y)(max x, max y).

答案 2 :(得分:0)

我会使用简单的坐标操作来定义左上角右上角。根据您的编辑和评论,我将定义:

  • 左上角点具有x + y
  • 的最小值
  • 右上角具有x-y
  • 的miminum值

问题就变成了数组中min / max的简单选择。

答案 3 :(得分:-1)

你在这里。您可以使用自己的谓词来查找任何点。

#include <stdio.h>

struct Point
{ 
    int x;
    int y;
};


int upper_right(  struct Point a, struct Point b )
{
    return ( b.x < a.x ) || ( !( a.x < b.x ) && ( b.y < a.y ) );
}

int upper_left(  struct Point a, struct Point b )
{
    return ( a.x < b.x ) || ( !( b.x < a.x ) && ( b.y < a.y ) );
}

struct Point * max_element( const struct Point *a, 
                            size_t n, 
                            int predicate( struct Point, struct Point ) )
{
    const struct Point *max = a;

    if ( n )
    {
        for ( size_t i = 1; i < n; i++ )
        {
            if ( predicate( a[i], *max ) ) max = a + i;
        }
    }

    return ( struct Point * )max;
}

int main(void) 
{
    struct Point a[] =
    {
        {  771, 324 },
        {  968, 323 },
        {  868, 397 },
        { 1065, 368 },
        { 1164, 326 },
        {  768, 470 },
        {  966, 471 },
        { 1000, 452 },
        { 1165, 472 }
    };

    const size_t N = sizeof( a ) / sizeof( * a );

    struct Point *max = max_element( a, N, upper_left );

    printf( "The upper left point is { %d, %d }\n", max->x, max->y );

    max = max_element( a, N, upper_right );

    printf( "The upper right point is { %d, %d }\n", max->x, max->y );

    return 0;
}

程序输出

The upper left point is { 768, 470 }
The upper right point is { 1165, 472 }