筆記篇 最良心的計算幾何學習筆記(六)

2022-07-22 05:39:13 字數 2321 閱讀 9965

emmmm學完旋轉卡殼感覺自己已經是個廢人了..

修整了乙個週末, 回來接著跟計算幾何勢力硬幹... (這個週末是不是有點長?)

今天就講講半平面交吧.

請自己回顧必修五 線性規劃相關知識...

什麼是半平面?

就是一條直線一側的點構成的集合..

用解析幾何的觀點來看就是滿足\(ax+by+c<0\)這個不等式的點的集合.

那麼半平面交自然就是許多這樣的集合的交集咯~

最後就很像線性規劃做出來的可行域一樣...

半平面交可以長這樣

這樣

甚至這樣

也就是說, 半平面交的結果可能是無界的一大片, 可能是乙個有界的多邊形, 也可能是點、線段、直線(沒圖╮(╯_╰)╭), 甚至空集..

先來道不那麼標準的板子題:戳這裡..

這個很顯然就是要求朝上的無界的一片的那種.. md就是個下凸殼啊...

所以我們按照凸殼的方式試著思考一下.

我們先將直線按斜率排序(都按斜截式給你了顯然不會不存在....) 如果斜率一樣截距小的可以直接不要了(肯定會被擋住..)

維護乙個棧, 先將第一條直線壓入, 這條直線肯定能露出來(誰讓斜率最大了呢)

然後我們考慮新加入的直線對前面的直線的影響.

我們可以看到,當新加入一條斜率比較小的直線(綠色或黃色, 按理說應該是平行的, 如果看著不大平行就湊合看吧)

所以出現了綠色的情況我們就把紅色退棧. 然後繼續判斷.

是不跟graham掃瞄法乙個樣紙?

時間複雜度\(o(nlogn)\) 複雜度仍然卡在排序上. 這是整數而且斜率極差不超過1e6所以可以很方便的用基數排序降到\(o(n)\)虐場.. 然而窩還是用sort 因為省事...

現在唯一的問題就是判斷直線在點上面了(根據樣例可以得知交點乙個點是不算子線段的, 也要算在上面).. 但這就是解析幾何的問題了.. (其實可以用類似於方向向量的方法解, 只是我不想再寫叉積了(想起被叉積支配的恐懼..))

我們令前兩條直線分別為\(y=k_1x+b_1, y=k_2x+b_2\), 新加入的直線為\(=k_3x+b_3\)

聯立得到前兩條直線交點橫座標\(x=\frac\)

那麼根據代入法我們可以得到

\[\frac*k_1+b_1\leqslant\frac*k_3+b_3

\]其實這樣已經可以做了, 而且題目座標都是整數精度問題也不大, 但是我還是想找乙個優美的形式...

由於座標排過序, 所以\(k_1-k_2>0\), 我們都移到左邊, 然後兩邊同時乘\(k_1-k_2\)(乘正數不等號不變號), 就能得到

\[(b_2-b_1)(k_1-k_3)+(k_1-k_2)(b_1-b_3)\leqslant0

\]這樣就沒有分式, 顯得更為有優美一些(其實是閒的(卡精度卡怕了))

下面貼上1a**:

#include #include #include const double eps=1e-9;

inline int dcmp(const double &a)

inline bool cmp2(const line &a,const line &b)

}int main()

inline bool cmpa(const line &a,const line &b)

inline vec getlinesintersect(const line &a,const line &b)

inline bool pd(const line &a,const line &b,const line &c)

void halfplaneintersection(){

int i,j; vec t;

for(i=0,j=0;ibt&&pd(dq[tp],dq[tp-1],p[i])) --tp;

while(btbt&&pd(dq[tp],dq[tp-1],dq[bt])) --tp;

while(bt其實想清楚的話也不是很難, 但是真的細啊ovo

大約就這樣吧?

計算幾何學習筆記

基礎部分 include using namespace std define type double define vector point define eps 1e 8 const double pi 3.14159265358979323 type deg2red type deg type...

計算幾何學習筆記

計算幾何是什麼東西?能吃嗎?給定 n 個點 x i,yi 問 歐幾里得 距離最近的點對。如果用樸素的兩兩枚舉,需要o n2 的時間。考慮用分治法,先將點按照先 x 後 y排序。考慮對一段點 l r 的處理。在 放一根平行於y軸的線,其左邊的答案為a,右邊為b,設 min a,b 考慮如果有跨這條線的...

計算幾何學習筆記

計算幾何基本採用向量來表示點 線 麵等基本元素,而非我們平時常用的解析式。向量的基礎運算法則 給定兩個向量 p x 1,y 1 q x 2,y 2 加法 p q x 1 x 2,y 1 y 2 減法 p q x 1 x 2,y 1 y 2 數乘 lambda p lambda x 1,lambda ...