半平面交 學習筆記

2021-08-03 17:01:22 字數 1241 閱讀 6354

這次講半平面交。應該是平面幾何基礎演算法的最後一節了(凸包,旋轉卡殼,半平面交)。

說幾句題外話,這些演算法都比較耐(keng)用(die),比如凸包好像可以用於來優化dp(好像是利用斜率),很多模型都可以用旋轉卡殼往上套,而半平面交……可以處理許多與平面幾何沒有半毛錢關係的題目,尤其是對於一些不等式組的解集的存在,但是菜雞fhj現在只會用模板解決單純的半平面交的問題。

首先要先定義有向直線,那麼它所對應的半平面就是其有向直線的左半邊。而半平面交就是若干個半平面的公共部分,先給出定義:

//有向線段的定義,它的左邊就是半平面

struct hdata //初始化,否則會發生錯誤

hdata (fdata pi,fdata vi) //方便賦值

bool

operator

< (const hdata& b) const

}ch[1505],p[1505];

struct hdata

hdata (fdata pi,fdata vi)

bool

operator

< (const hdata& b) const

fdata operator - (const fdata a,const fdata b)

fdata operator * (const fdata a,const

double b)

double cross(fdata a,fdata b)

double gets(fdata a,fdata b,fdata c)

bool pd_lft(fdata p,hdata l) //判斷點是否在有向線段左邊

fdata getj(hdata a,hdata b) //求兩直線交點

void _init()

double getts() //求半平面的交的面積

void _solve() //主程式,求半平面交

//極角相同的,保留在裡面的

if (hed1]=getj(que[til-1],que[til]);

}while (hed1],que[hed])) til--;

if (til-hed<=1)

p[til]=getj(que[til],que[hed]);

m=til-hed+1;

printf("%0.2lf\n",getts());

}int main()

return

0;}

半平面交 學習筆記

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

半平面交學習筆記

參考 演算法合集之 半平面交的新演算法及其實用價值 問題簡介 給出多個如 ax by c ge 0 的限制 接下來都以 ax by c ge 0 為例 求解 x,y 的集合 可以轉化為多個直線在平面上圍成的凸包 將所有直線按角度排序,角度相同的保留下需要的乙個 如圖 用乙個雙端佇列儲存當前半平面交,...

半平面交學習小記

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