其中每個半平面用一條有向直線表示,它的左側就是它所代表的半平面。
半平面交通常是乙個凸多邊形,也有時候會得到乙個無界多邊形,
甚至是線段、直線、點或「空」,無論怎樣結果一定是「凸」的。
一般用乙個很大的矩形(4個半平面的交)代替「整個平面」,計算結果之後刪除這4個人工半平面。
這樣,在計算的過程中,每加入乙個半平面,都相當於用一條有向直線去切割多邊形。
[ 用一條有向直線去切割多邊形 ] 的方法:
按逆時針順序考慮多邊形的所有頂點;
保留直線左側和直線上的點,刪除直線右邊的點;
如果有向直線和多邊形相交時產生了新的點,新點加入新多邊形中;
【優化】雙端佇列:可以動態刪除隊尾的半平面和隊首的半平面。
/*【p4196】凸多邊形
逆時針給出n個凸多邊形的頂點座標,求它們交的面積。
*///
題意可以轉化為:對輸入的所有邊求半平面交。
//1.計算兩個直線的交點(add函式,用定比分點實現)
//2.計算面積(calcs函式,用叉積的幾何意義實現)
//3.求已有平面與新的乙個半平面的交(cut)
const
int n=5019; int
n,m,tot,pit_num;
struct point;}
point
operator + (const point a);}
double cross(point a) //
向量叉積
point operator * (double t);} }a[n],b[n],c[n];
void add(point a1,point a2,point b1,point b2) //
計算兩直線交點,放入點座標陣列中
void cut(point a,point b)
else
if((a-a[i+1]).cross(b-a[i+1])>=0) add(a[i],a[i+1
],a,b);
for(int i=1;i<=tot;i++) a[i]=c[i]; pit_num=tot; } //
用陣列c更新半平面交的答案a
double calcs() //
計算半平面交形成的多邊形的總面積
intmain() printf("
%.3f\n
",calcs()); return0;
}
#include #include——時間劃過風的軌跡,那個少年,還在等你#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
/*【poj2451】uyuw's concert
給你很多個半平面,求半平面交出來的凸多邊形的面積。
*///
題意可以轉化為:對輸入的所有邊求半平面交。
//1.計算兩個直線的交點(add函式,用定比分點實現)
//2.計算面積(calcs函式,用叉積的幾何意義實現)
//3.求已有平面與新的乙個半平面的交(cut)
const
int n=500019
;int
m,ccnt,curcnt;
struct point };
point points[n],p[n],q[n];
//初始化陣列points,答案陣列p,過程陣列q
void getline(point p1,point p2,double &a,double &b,double &c)
point intersect(point x,point y,
double a,double b,double
c)void cut(double a,double b ,double c) //
保留if(a*p[i-1].x+b*p[i-1].y+c>0) q[++curcnt]=intersect(p[i],p[i-1
],a,b,c);
if(a*p[i+1].x+b*p[i+1].y+c>0) q[++curcnt]=intersect(p[i],p[i+1
],a,b,c);
} for(int i=1;i<=curcnt;i++) p[i]=q[i]; //
把這一輪的新答案重新複製一遍
p[curcnt+1]=q[1],p[0]=p[curcnt],ccnt=curcnt; //
更新總點數ccnt
}void solve()
intmain()
for(int i=1;i<=n;i++) solve();
//求半平面交(凸多邊形)的面積
}}
計算幾何 半平面交
la 4992 hdu 3761 jungle outpost 杭電的有點坑啊。一直爆記憶體,後來發現大白的半平面交模板那裡 point p new point n line q new line n 這裡出了問題,應該是在函式裡面申請不了比較大的陣列,所以爆記憶體。我在全域性定義了兩個陣列就不會爆...
計算幾何 半平面交
step1.將所有半平面按極角排序,對於極角相同的,選擇性的保留乙個。o nlogn step2.使用乙個雙端佇列 deque 加入最開始2個半平面。step3.每次考慮乙個新的半平面 a.while deque頂端的兩個半平面的交點在當前半平面外 刪除deque頂端的半平面 b.while deq...
計算幾何 半平面交
平面內的一條直線把這個平面分成兩部分,每一部分對這個平面來說,都叫做半平面。包括這條直線的半平面叫做閉半平面,否則叫做開半平面。解析式為 ax by c 0 或 ax by c 0 在計算幾何中用向量表示,整個題統一以向量的左側或右側為半平面。半平面交就是多個半平面的交集。半平面交是乙個點集。它可以...