在平面上有兩個給定的凸多邊形,若兩個凸多邊形相交,則它們的交集也是乙個凸多邊形。若兩個凸多邊形不相交,指的是兩個凸多邊形相離或僅限於邊界點與邊上相交,則相交面積為0。如圖所示:你的任務是程式設計求出給定的兩個凸多邊形的交集的面積。
兩給定的凸多邊形按順時針方向依次給出多邊形每個頂點的座標。
第一行為乙個整數n,表示第乙個凸多邊形的邊數,以後n行分別給出了n個頂點的座標;接著,給出第二個凸多邊形的邊數m,以後m行分別給出了m個頂點的座標。
輸出檔案僅乙個資料即交集面積,保留兩位小數點。
4 0 0
0 1
1 1
1 0
4 -0.5 -0.5
-0.5 0.5
0.5 0.5
0.5 -0.5
0.25
不會寫,只會拆成無數條直線求半平面交,注意是順時針方向。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
const
int get_int()
while(x>='0'&&x<='9')
return num*bj;
}const
double eps=1e-10;
struct point
point(){}
point operator + (const point& a) const
point operator - (const point& a) const
point operator * (const
double a) const
} ;typedef point vector;
double cross(vector a,vector b)
double area(point a,point b,point c)
double area(int n,point* p)
struct line
line(point p,vector v):p(p),v(v)
bool
operator
< (const line& l) const
point getintersection(line a,line b)
int halfplaneintersection(int n,line* l,point* poly)
if(first1]=getintersection(q[last-1],q[last]);
}while(first1]))last--; //刪除無用平面
if(last-first<=1)return
0; //空集
p[last]=getintersection(q[last],q[first]);
int m=0;
for(int i=first; i<=last; i++)poly[++m]=p[i];
return m;
}///
point a[10005],p[10005];
line l[10005];
int n,m,sum=0;
int main()
兩個簡單多邊形求交 CGAL
兩個多邊形求交的實現需要幾個模組 cgal中有insect函式,但是必須要求使用cgal exact predicates exact constructions kernel 本人出於其他想法,沒有把基於exact predicates inexact constructions kernel核的...
判斷兩個凸多邊形是否相交 SAT
最近在看recast detour原始碼的時候有遇到許多數學上的演算法問題,特此記錄,以便以後檢視。介紹 應用分離軸定理 sat 看是否能找到分離軸,如果能找到那麼就是不相交。否則相交。利用點積的幾何意義 投影 判斷 polya 和 polyb 兩個多邊形是否相交 all vertices are ...
求兩個多邊形的交面積(模板)
別人的部落格 多邊形的交,多邊形的邊一定是要按逆時針方向給出 還要判斷是凸包還是凹包,呼叫相應的函式 面積並,只要和面積減去交即可 include using namespace std const int maxn 300 const double eps 1e 8 int dcmp double...