任意の2つのポリゴンの交差領域

#include <ビット/ STDC ++ H>
名前空間STDを使用して、
#define MAXN 510
CONSTダブルEPS = 1E-8。
INTのSIG(ダブルD){
リターン(D> EPS) - (D <-EPS)。
}
ポイント{ストラクト
ダブルX、Yと、ポイント(){}
点(ダブルX、ダブルY):X(X)、Y(Y){}
ブール演算子==(constのポイント&P)のconst {
戻りSIG(xp.x)== 0 && SIG(yp.y) == 0;
}
}。
二重交差(点O、点、B点){
リターン(AX-OX)*(バイOY) - (BX-OX)*(AY-OY)。
}
二重領域(ポイント* PS、INT N){
PS [N] = PS [0]。
ダブルRES = 0;
以下のために(INT I = 0、I <N; I ++){
RES + = PS [I] .X * PS [I + 1] .Y-PS [I] .Y * PS [I + 1] .X。
}
戻りRES / 2.0。
}
INT lineCross(点A、点B、点C、点D、点&P){
ダブルS1、S2。
S1 =(a、b、c)を相互。
S2 =(B、D)は、クロス。
IF(SIG(S1)== 0 && SIG(S2)== 0)リターン2。
IF(SIG(S2-S1)== 0)戻り0;
PX =(CX * S2-DX * S1)/(S2-S1)。
PY =(CY * S2-DY * S1)/(S2-S1)。
1を返します。
}

//多角切断
ベクター(B)の切断後に残っおよびin situ切断結果にセーブ直線AB&ポリゴンを切断// P、
//点まで減少すると、ここで、n、戻りますです1
空隙polygon_cut(ポイント* P、INT&N-、点A、点B){
静的ポイントPP [MAXN];
int型、M = 0; P [N-] = P [0];
のための(INT I = 0; I <N-; I ++){
IF(SIG(クロス(A、B、P [I]))> 0)PP [M ++] = P [I];
!IF(SIG(クロス(A、B、P [I]))= SIG(クロス(A、B、P [I + 1])))
lineCross(A、B、P [I]、P [I + 1]、PP [M +]);
}
N- = 0;
(INTのための私は= 0; I <M、I ++)
IF)(I ||(PP [I] == PP [I-1] !!)
P [N - ++] = PP [I];
一方、(N> 1 && P [N - 1 ] == P [0])N-;
}

//戻りOAB三角形と三角形が交差OCD領域であり、oは原点//ある
ダブルintersectArea(点A、点B、点C、点D){
;点O(0,0)
INT S1 = SIG(クロス( O、A、B));
INT S2 = SIG(クロス(O、C、D));
IF(== 0 || S1 S2 == 0)リターン0.0; //劣化エリア0
IF(S1 = -1 =)スワップ(A、B)、
IF(S2 == - 1)スワップ(C、D)。
点P [10] = {O、A、B};
int型N- = 3;
polygon_cut(P、N- 、O、C);
polygon_cut(P、N末端、C、D);
polygon_cut(P、N-、D、O)、
ダブルFABS RES = N-(エリア(P))
。IF(S1 * S2 == - 1 )RES = -res; RESを返します;
}

// 2多角形領域を見つける
ダブルintersectArea(PS1ポイント*、INT N1、PS2ポイント*を、INT N2){
IF(領域(PS1、N1)<0)リバース(PS1、PS1 + N1);
IF(領域( PS2、N2)<0)リバース(PS2、PS2 + N2);
PS1 [N1] = PS1 [0];
PS2 [N2] = PS2 [0];
ダブルRES = 0;
(INT I = 0、I < N1; I ++){
ため(INT J = 0; J <N2; J ++){
RES + = intersectArea(PS1 [I]、PS1 [I + 1]、PS2 [J]、PS2)[J + 1];
}
}
RESは返します;
}

//任意の二つの単純なポリゴンを検索し、エリア
ポイントPS1 [MAXN]、PS2 [MAXN];
int型N1、N2;
INTはメイン()
{
!一方(scanfの( "%D%D"、およびN1、およびN2)がEOFを= ){
ため(INT I = 0; I <N1; I ++)
scanfの( "%LF%LF"、&PS1 [I] .X、&PS1 [I] .Y);
のため(INT I = 0; I <N2。 I ++)
scanfの( "%LF%LF"、&PS2 [I] .X、&PS2 [I] .Y);
ダブルANS = intersectArea(PS1、N1、PS2、N2);
ANS = FABS(エリア(PS1、N1) )+ファブ(面積(PS2、 N2)) - ANS; // 撥受信
のprintf( "%2F \ N-"、ANS);
}
戻り0;
}

おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11921540.html
おすすめ