2016-11-14 9 views
0

私は3x3のドットマトリックスを構成する9つのベクトルの配列を持っています。 今、私は、最も左上のもの(Oとマークされている)とほとんどの "右上"(Dとマークされた)要素を探したいと思います。 全体が長方形ではなく、配列はソートされません。だから、それは次のようになります。2Dベクトル配列の右上の要素を見つける

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) 

EDIT:点が平面上に任意に配置されていないことを指摘します。それらは常に3x3パターンで表示されますが、ポイント間の距離はピクセルによって異なります。また、パターン全体が少し回転しているかもしれません。実際に私は最も右上と左の要素を探したいのですが。回転角度を取得する。

+0

min x、max y、max xを見つけようとします。答えは(min x、max y)と(max x、max y)です。 – learner

+0

@tzippyこの2点{1,1}と{2,2}の間の最も左上の点は何ですか? –

+1

"ほとんどの右上"の定義は何ですか? –

答えて

0

minを計算する関数と、配列のmaxを計算する関数を作成します。すべてのx点の配列とy点の配列を渡し、min x、max y、max xを見つけます。答えは(min x,max y)だろうと「少し回転した」と仮定すると、(max x, max y).

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

は、あなたが探していると、あなたの座標を想定しているよりも高いy値を持つことができません上記Tをマークポイントは左下にスタート意味しますy値が上方向に増加し、x値が右方向に増加しています。

最も高いy値を持つ3点を見つけます。最も低いx値を持つものが左側になります。

+0

仮定は正しいです。そして、うわー、私は本当にそれを考えなかった。私は一番上の3点を見つけて、最も高い、最も低いx値を持つものを取るだけです。ありがとう! – tzippy

-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 } 
0

私は左上右上ポイントを定義するために、単純な座標演算を使用しています。編集やコメントに基づいて、私は定義します

  • を左上の点は、x + yの
  • 右上の点の最小値は、XY

ためmiminum値を持っていた問題は、簡単になります配列内の最小/最大の選択。

関連する問題