コンテンツ参照ブック - 「アルゴリズム競争は、古典的な訓練をスタートアップガイド。」
プロセスでは、各頂点が反時計回りの順に配置されたポリゴンの頂点配列、で表されます。
ポイントを決定することは、多角形内にあります。それは360°である場合角法を使用して、基本的な考え方は、一緒になって、具体的には、多角形の各辺の角を回転数に対して決定ポリゴンの点を計算することである、多角形内に記載;それは0°である場合、記載ポリゴンそれは、ポリゴンエッジで180°である場合。弓形ポリゴン処理の数、各セグメントの端部のみがコーナの開始点まで追加するときに、この方法は影響を受けません。また、これは、三角形またはさらに単純な多角形(すなわち、自家受粉することができる)でなくてもよいです。
しかし、逆三角関数の直接計算は、精度をエラーに遅いとなりやすいだけでなく、多くのことを使用しています。アルゴリズムにおける競争は、私たちがいることをしないが、右の架空線があり、ポリゴンによって、この線の回数の長所と短所を数え、これは(巻数)番号WNを巻きのレコード番号、反時計回りの摩耗でありますプラス1の時代遅れ、WN、時計回りを通過する間、Wnはマイナスの1。
なお、プログラムは、左側または右側に入力点の必要性によって決定されているかどうか、及び外積の向きを通って決定を介して実装します。
凸多角形決意内の点のみに左にあるすべてのエッジ(各頂点を仮定し、反時計回りの順にソート)か否かを判断する、簡単です
凸包。
部位特異的凸包は、最小の凸多角形の閉じた領域の内側に置くことです。アンドリュー・アルゴリズムは、オーダーレベル(オリジナルグラハムより速く、より安定した)に基づきます。最初の大小規模のすべてのタップxの、P1、P2、...重複点を削除した後に得られた配列、および凸包にP1とP2(同じx、大、小に従ってyの場合)。左の凸包で新しい点は、「前方」方向に進み始め、P3から、それ以外の場合はポイントを削除]をクリックし、最近、左の新しいポイントまで凸包に参加しました。
(説明を追加します)
コードは以下の通りであります:
1 // 判断该点与多边形关系 2 INT isPointInPolygon(点P、ポリゴンポリ) 3 { 4 INT WN = 0 。 5 INT N = v.size()。 6 用(int型 I = 0 ; iがN <; ++ I) 7 { 8 であれば(isPointOnSegment(P、ポリ[I]、ポリ[(I + 1)%N]))リターン - 1 。 9 int型 K = DCMP(クロス(ポリ[(I + 1)%のN] -ポリ[i])と、P- ポリ[I])。 10 INTdCMP = D1(ポリ[I] .y- のPy) 。11 INT D2 = dCMPを(ポリ[(Iは、+ 1。 )%のn-] .y- のPy); 12で IF(K> 0 && D1 <= 0 && D2> 0 ++の)Wnは、 13である IF(K < 0 && D2 <= 0 && D1> 0)wn-- ; 14 } 15 IF(=のWnは!0)リターン 1。; 16 リターン 0 ; 17 } 18は //の凸包を計算し、入力点Pの数は、p、点CHの出力です。機能は、凸包の頂点の数を返します。 19 // 入力が重複したポイントを持つことができません。入力点の関数の実行順序が完了した後に破棄されます。 20 // あなたは凸包ポイントの入力側を持ってしたくない場合は、2が<=の変化< 21 //は高精度コンパレータでDCMPを推奨 22は int型、凸包(ポイント* P、int型のn、ポイント* CH ) 23である { 24 替え(P、P + N-); 25 INT、M = 0 、 26である ため(int型 I = 0、I <N - ; ++ I) 27 { 28 ながら(M> 1 &&クロス(CH [M- 。1 ] -CH [M- 2 ]、P [I] -CH [M- 2 ])<= 0)M-- ; 29個の CH [M ++] = Pの[I]。 30 } 31 のint、K = M。 32 のためには、(int型 iは= N- 2 ; I> = 0 ; - I) 33 { 34 ながら(M> K &&クロス(CH [M- 1 ] -CH [M- 2 ]、P [i]は-CH [M- 2 ])<= 0)M-- 。 35個の CH [M ++] = Pの[I]。 36 } 37 であれば(N> 1)M-- 。 38 リターンメートル; 39 }