予備知識:
計算幾何学の基礎
検索凸包を:
ベクター<P>凸(ベクトル<P> L) { ベクトル <P> ANS、S。 P TMP(LIM、LIM)。 int型 POS = 0 ; 以下のために(int型 i = 0 ; i)は(l.sizeを<; I ++の) 場合(L [i]は< TMP) TMP = L [i]は、POS = I。 用(int型 I = POS、cnt_は= 0 ; cnt_ <l.size(); CNT _ ++、I =(I + 1)%のl.size()) { 一方(s.size()> = 2 && SGN (クロス(S [s.size() - 2 ]、S [s.size() -1 ]、L [I]))<= 0 ) s.pop_back(); s.push_back(L [I])。 POS = I; } ANS =のS。s.clear(); 用(int型 I = POS、cnt_は= 0 ; cnt_ <l.size(); CNT _ ++、I =(I - 1)%のl.size()) { 一方(s.size()> = 2 && SGN (クロス(S [s.size() - 2 ]、S [s.size() - 1 ]、L [I]))<= 0 ) s.pop_back(); s.push_back(L [I])。 POS = I; } 以下のために(int型 I = 1 ; I + 1 <s.size(); I ++ ) ans.push_back(S [I])。 戻るANSを。 }
探しているポリゴン内の点か
彼らはその後、多角形内の点等しい場合の辺の数を計算することによって、ポイントの両側に等しいです
一方、点が直線上に計算され、直線点を見つけます。
BOOL P_In_S(P Aを、ベクトル<P> B) { int型の CNT = b.size()。 int型 cnt_ = 0 ; b.push_back(B [ 0 ])。 以下のために(int型 i = 0 ; iは、CNT <; iは++ ) { 場合(ONL(L(B [i]は、Bは[iが+ 1 ]))) を返す 真。 int型 K = SGN(クロス(B [i]は、[I + B 1 )])。 INT D1 = SGN(AY - B [i]が.Y)、 D2 = SGN(AY - B [I + 1 ] .Y)。 もし(K < 0 && D1> = 0 && D2 < 0)CNT _ ++ 。 もし(K> 0 && D2> = 0 && D1 < 0)CNT _-- 。 } 戻り cnt_ =!0 ; }
探している二つのベクトルが交差
BOOL L_is_Inter(L AとL Bの) { int型 C1 = SGN(クロス(AS、AT、BS))、 C2 = SGN(クロス()BT、で、など)、 C3 = SGN(クロス(BS、BT、として))、 C4 = SGN(クロス(BS、BT、で))。 もし(C1の* c2は< 0 &&のC3 * C4を< 0)を返す 真。 場合(!C1 && ONL(BS、a))は返す 真。 場合(!C2 && ONL(BT、a))は返す 真。 もし(!C3 && ONL()A、など)を返す 真。 もし(!C4 && ONL(a)は、で)返す 真。 返す 偽; }
上記の二つの知識の点を通ります:
見つけることが可能2つのポリゴンが交差
BOOL IF_inter(ベクトル<P>、ベクトル<P> B) { // のprintf( "1つの\ n"); 以下のために(int型 i = 0 ; i)は(a.sizeを<; I ++の) 場合(P_In_S([i]は、B)) を返す 真。 // printfの( "2 \ N"); 用(int型 iは= 0 ; iがb.sizeを()<I ++は) 場合(P_In_S(B [i]は、A)) を返す 真。 INT CNT1 = a.size()、CNT2 = b.size()。 a.push_back([ 0 ])、b.push_back(B [ 0]); // のprintf( "3 \ N"); 以下のために(int型 i = 0 ; I <CNT1; I ++ ) のための(INT J = 0 ; J <CNT2; J ++ ) 場合(L_is_Inter(L([I]、[Iは+ 1 ])、L(B [J ]、B [J + 1 ]))) を返す 真。 返す 偽; }