半平面交學習筆記

2022-09-11 02:15:14 字數 2355 閱讀 1826

參考** 演算法合集之《半平面交的新演算法及其實用價值》

問題簡介:

給出多個如 \(ax + by + c \ge 0\) 的限制( 接下來都以 \(ax+by+c \ge 0\) 為例) , 求解 \((x,y)\) 的集合

可以轉化為多個直線在平面上圍成的凸包

將所有直線按角度排序,角度相同的保留下需要的乙個(如圖)

用乙個雙端佇列儲存當前半平面交,每次通過判斷隊首與隊尾第乙個交點是否滿足當前直線來更新

先用隊尾判定隊首交點是否合法,再用隊首判斷隊尾交點是否合法

現在佇列中的相鄰半平面的交點即為凸包的節點, 如果剩餘半平面數量小於3則無解

// 滿足plane a的點為a.s->a.t的逆時針方向

#include #include #include #include #include using namespace std;

inline char nc()

templatevoid readin(t & x)

while(ch>='0'&&ch<='9')

x *= f;

}const double eps = 1e-9;

int sign(double a)

struct point

};inline point operator + (const point & a, const point & b)

inline point operator - (const point & a, const point & b)

inline point operator * (const point & a, const double & b)

inline double cross(point a, point b)

inline double angle(point a)

inline bool parallel(point p0, point p1, point q0, point q1)

inline point intersection(point p0, point p1, point q0, point q1)

inline double area(point * p, int n)

return fabs(res / 2);

}struct plane

plane(point s, point t) : s(s), t(t)

};inline bool operator < (const plane & a, const plane & b)

inline point intersection(plane a, plane b)

inline bool parallel(plane a, plane b)

inline bool invalid(plane p, point q)

bool si(plane * l, int n, point * s, int & m)

while(hd < tl && invalid(l[i], p[tl - 1])) tl--;

while(hd < tl && invalid(l[i], p[hd])) hd++;

q[++tl] = l[i];

if(hd < tl) p[tl - 1] = intersection(q[tl], q[tl - 1]);

}while(hd < tl && invalid(q[hd], p[tl - 1])) tl--;

while(hd < tl && invalid(q[tl], p[hd])) hd++;

if(tl - hd <= 1) return false;

p[tl] = intersection(q[hd], q[tl]);

m = 0;

for(int i = hd; i <= tl; i++)

return true;

}const int board = 10000;

int n, m;

point p[20050];

plane l[20050];

double solve()

int main()

cout << setprecision(1) << solve() << endl;

return 0;

}

半平面交 學習筆記

這次講半平面交。應該是平面幾何基礎演算法的最後一節了 凸包,旋轉卡殼,半平面交 說幾句題外話,這些演算法都比較耐 keng 用 die 比如凸包好像可以用於來優化dp 好像是利用斜率 很多模型都可以用旋轉卡殼往上套,而半平面交 可以處理許多與平面幾何沒有半毛錢關係的題目,尤其是對於一些不等式組的解集...

半平面交 學習筆記

前置知識 向量的凸包應用 2.半平面交的基本概念 二 半平面交的性質 半平面是立體幾何的基本概念之一。一條直線將平面分為兩部分,其中的每一部分均稱為半平面。例如,若a是平面 上的一條直線,則將 上不屬於a的點按以下性質分為兩個集合 鏈結同乙個集合的兩點的線段不與a相交,鏈結不同集合的兩點的線段必與a...

半平面交學習小記

其實只是記乙個板子 lll 核心是多邊形內的乙個點集,點集內任意一點與多邊形邊上任意一點的連線都在多邊形內。你可以把多邊形想成乙個房間,在核心內任意乙個點放上乙個全方位360度無死角的攝像機,這個攝像機能夠看到房間的任意角落。現在給出乙個n邊形的所有頂點,求是否存在核 poj喜聞樂見地掛了,例題不知...