暖 墟 計算幾何 半平面交的學習與練習

2022-05-31 08:18:12 字數 2929 閱讀 4385

其中每個半平面用一條有向直線表示,它的左側就是它所代表的半平面。

半平面交通常是乙個凸多邊形,也有時候會得到乙個無界多邊形,

甚至是線段、直線、點或「空」,無論怎樣結果一定是「凸」的。

一般用乙個很大的矩形(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 在計算幾何中用向量表示,整個題統一以向量的左側或右側為半平面。半平面交就是多個半平面的交集。半平面交是乙個點集。它可以...