bsoj1140 兩個凸多邊形交的面積

2021-07-26 07:52:41 字數 1822 閱讀 2497

在平面上有兩個給定的凸多邊形,若兩個凸多邊形相交,則它們的交集也是乙個凸多邊形。若兩個凸多邊形不相交,指的是兩個凸多邊形相離或僅限於邊界點與邊上相交,則相交面積為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...