2016-11-22 5 views
2

ユーザーはn番目の点を入力します。私は、ポリゴンが存在するかどうかを確認してから、凹凸ポリゴンを決定する必要があります。私は多角形がすべての角度が180度以下であれば凸であることを知っています。だから、問題はポリゴンの内側角を見つけることにまで下がります。私は数式やアルゴリズムを探してきましたが、成功しませんでした。ポリゴンの種類を決定する方法

例:

入力:N = 4。

にPoint1:(5; 6)

ポイント2:(4; -5)

Point3と:(-5; 4)

POINT4:(-5; 5)

予想される出力:Riを:ポリゴンこれは、これまでのコードである

Example

凸状であります今では、平面内の点の間の最大距離と最小距離しか見つけられません。

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    double a[15][2]; 
    int n; 
    cin >> n; 
    if (n <= 0 && n > 15) 
     return 1; 

    for (int i = 0; i < n; i++) 
    { 
     cout << "x" << i << " = , y" << i << " = "; 
     cin >> a[i][0] >> a[i][1]; 
    } 

    double maxDistance = 0.0; 
    double minDistance = 0.0; 
    double maxpoint1[2]; 
    double maxpoint2[2]; 
    double minpoint1[2]; 
    double minpoint2[2]; 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      if (j != i) 
      { 
       double x1 = a[i][0]; 
       double x2 = a[j][0]; 
       double y1 = a[i][1]; 
       double y2 = a[j][1]; 
       double currentDistance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); 

       if (currentDistance > maxDistance) 
       { 
        maxDistance = currentDistance; 
        maxpoint1[0] = x1; 
        maxpoint1[1] = y1; 
        maxpoint2[0] = x2; 
        maxpoint2[1] = y2; 

       } 

       if (minDistance > currentDistance) 
       { 
        currentDistance = minDistance; 
        minpoint1[0] = x1; 
        minpoint1[1] = y1; 
        minpoint2[0] = x2; 
        minpoint2[1] = y2; 
       } 

       cout << "x1 = " << x1 << " y1 = " << y1 << " x2 = " << x2 << " y2 = " << y2; 
       cout << endl << "Distance is " << currentDistance; 
       cout << endl; 
      } 
     } 
    } 

    cout << "The max distance is: " << maxDistance << " between x1 = " << maxpoint1[0] << " y1 = " << maxpoint1[1] << " and x2 = " << maxpoint2[0] << " y2 = " << maxpoint2[1]; 
    cout << "The min distance is: " << minDistance << " between x1 = " << minpoint1[0] << " y1 = " << minpoint1[1] << " and x2 = " << minpoint2[0] << " y2 = " << minpoint2[1]; 


    return 0; 
} 

答えて

3

ポリゴンが凸状または凹状であれば、ちょうどすべてのシーケンシャルポイントトリプレットCrossProduct(P[0], P[1], P[2]) etcのためのクロス製品の兆候を確認してください見つけることができます。例として

CrossProductSign(A, B, C) = 
       SignOf((B.X - A.X) * (C.Y - B.Y) - (B.Y - A.Y) * (C.X - B.X)) 

凸面の場合、すべての交差商品には同じ記号(+または - )が必要です。

どのように動作しますか:トリプレットごとに凸多角形の場合、同じ側(または歩行方向に応じてCWまたはCCW)で回転します。凹面の場合、いくつかの符号が異なります(内角が180度を超える場合)。角度値を計算する必要はありません。

1

2辺の間に角度を求める場合は、ベクトルの交差または内積を使用します。

aドットb = | a || b | COS(angle_between_vectors)は= [0] * B [0] + [1] * B [1] + [2] * B [2]

内角は次のようになり(PI - angle_between_vectors)

ああ、ところで、ポリゴン自体が交差する可能性があり、それは多くのユースケースでも有害な問題です。あなたの定義はそれを検出できません。複雑なクワッドは、すべての角度が90度未満になるようにします。

ポリゴンが凸であるかどうかを判断する唯一の方法ではなく、おそらく最も計算量の多いものの1つです。 角度がπ/ 2より小さいか大きいかを示す記号が表示されるドットプロットの問題点。多角形が複雑でないかどうかを判断する適切な方法は、ターンの方向が変わるかどうかを調べることです。そのためには、クロスプロダクトが必要です。 2次元ベクトルの場合、そのクロス積の結果はz成分(平面に垂直)のみを得、その符号は回転がどのように起こったかを決定する。

質問はすでにここにありました。

How do determine if a polygon is complex/convex/nonconvex?

関連する問題