兩個多邊形求交的實現需要幾個模組
(cgal中有insect函式,但是必須要求使用cgal::exact_predicates_exact_constructions_kernel)
本人出於其他想法,沒有把基於exact_predicates_inexact_constructions_kernel核的polygon_2轉換為
exact_predicates_exact_constructions_kernel的核,而是自己寫了乙個求交函式自用.
//cgal實現版本
bool
getinsertionoflineandline
(double bsx,
double bsy,
double bex,
double bey,
double sx,
double sy,
double ex,
double ey,
double
&rx,
double
&ry)
else
}return
false
;}
double
getangle
(point_2 p0, point_2 p1, point_2 p2)
}bool
ispointinpolygon
(const point_2 p,
const polygon_2 poly)
return
abs(angle -
2* pi)
< eps;
}bool
ispolygoninpolygon
(const polygon_2 p,
const polygon_2 poly)
return
true
;}
a.通過線線求交找到兩個交點p1,p2以及對應的相交邊的起始頂點i1,j1和i2,j2
b.通過判斷i1+1是否在polyb中,獲取相交部分的逆時針索引vector
bool
intersect
(const polygon_2 polya,
const polygon_2 polyb, polygon_2 *intersect)
for(
int i =
0; i < lenb;
++i)
bool first =
false
;bool second =
false
;int i1, i2, j1, j2;
double p1x, p1y, p2x, p2y;
bool isinsertion =
false
;for
(int i =
0; i < lena;
++i)
else
break;}
}}if(
!first ||
!second)
return
false
; polygon_2 result;
int s1, s2;
//if vertex(i1+1) is located in poly2,get p1->i1+1->...->i2->p2->j2+1->...->j1if(
this
->
ispointinpolygonbybao
(polya.
vertex
((i1+1)
%lena)
, polyb)
)else
result.
push_back
(point_2
(p2x, p2y));
if(j1 != j2)
if(s2 <= j1)
else
}//if vertex(i1+1) isn't located in poly2,get p1->j1+1->...->j2->p2->i2+1->...->i1
else
else
result.
push_back
(point_2
(p2x, p2y));
if(s2 <= i1)
else
}*intersect = result;
return
true
;}
求兩個多邊形的交面積(模板)
別人的部落格 多邊形的交,多邊形的邊一定是要按逆時針方向給出 還要判斷是凸包還是凹包,呼叫相應的函式 面積並,只要和面積減去交即可 include using namespace std const int maxn 300 const double eps 1e 8 int dcmp double...
bsoj1140 兩個凸多邊形交的面積
在平面上有兩個給定的凸多邊形,若兩個凸多邊形相交,則它們的交集也是乙個凸多邊形。若兩個凸多邊形不相交,指的是兩個凸多邊形相離或僅限於邊界點與邊上相交,則相交面積為0。如圖所示 你的任務是程式設計求出給定的兩個凸多邊形的交集的面積。兩給定的凸多邊形按順時針方向依次給出多邊形每個頂點的座標。第一行為乙個...
演算法競賽模板 求任意兩個簡單多邊形的並面積
includeusing namespace std define maxn 510 const double eps 1e 8 int sig double d struct point point double x,double y x x y y bool operator const poi...