アルゴリズムの学習:計算幾何学をし、個人的に凸包ポイントに点線を見つけるためにしよう

 


 

予備知識:
計算幾何学の基礎

 


 

検索凸包を

ベクター<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つの線分が交差します

 


 

 

上記の二つの知識の点を通ります:

見つけることが可能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 ])))
                 を返す 返す ; 
}
2つのポリゴンが交差します

 

おすすめ

転載: www.cnblogs.com/rentu/p/11269739.html