我有一个由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模式出现,但点之间的距离相差一些像素。此外,整个图案可能会放置一点旋转。 这就是为什么我想找到最右上角和左上角的元素。获得旋转角度。
答案 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)
我会使用简单的坐标操作来定义左上角和右上角。根据您的编辑和评论,我将定义:
问题就变成了数组中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 }