目錄記錄一些東西。
板子丟在這裡
採用求一次上凸包然後求一次下凸包在拼起來實現。
\(type = 0\) 是下凸包, 反之是上凸包。
採用旋轉卡殼實現。每次就看移動指標以後面積會不會變大就好了。inline void graham(vector&vec, int type)
sort(vec.begin(), vec.end());
vectorrec; rec.pb(* vec.begin()); int sz = 0;
for(int i = 1; i < vec.size(); i ++)
swap(vec, rec);
}inline void graham_full(vector&vec)
用三角形面積然後定比分點實現。inline double convdiameter(vectorvec)
vec.pb(vec[0]);
int j = 2, n = vec.size() - 1;
double res = 0;
for(int i = 0; i < vec.size() - 1; i ++)
return res;
}
inline vec2 intersection(const line &l1, const line &l2)
把直線按照極角排序,平行的保留內側在前, 注意排序判斷是否在內側的時候使用嚴格大於,從頭開始加, 如果隊頭或者隊尾的兩條直線交點在當前直線右側則彈出, 如果最後隊尾兩條直線交點在隊頭直線右側則彈出隊尾。
直線是逆時針存的。
要求 \(v1, v2\) 是凸包且極角排序完畢。inline void hpi(vector&lv)
else return a.se < b.se;
} );
for(int i = 0; i < lv.size(); i ++) lv[i] = sorted[i].fi;
dequeq;
q.push_back(lv[0]);
for(int i = 1; i < lv.size(); i ++) if(! parallel(lv[i], lv[i - 1]))
while(q.size() > 1)
q.push_back(lv[i]);
} while(q.size() > 1)
lv = vector(q.size());
for(int i = 0; i < q.size(); i ++) lv[i] = q[i];
}
把所有邊拿下來歸併即可。注意最後彈出乙個初始點。
積分公式 : \((r - l) \times (f(l) + f(r) + 4f(m)) \times \frac\)inline vectorminkowski(vectorv1, vectorv2)
while(p1 < s1.size()) hull[cnt] = hull[cnt - 1] + s1[p1 ++], cnt ++;
while(p2 < s2.size()) hull[cnt] = hull[cnt - 1] + s2[p2 ++], cnt ++;
hull.pop_back();
return hull;
}
把乙個圓放到圓心, 另外乙個旋轉到水平, 解方程以後轉回去。db calc(db l, db r)
db simpson(db l, db r, int dep)
使用最小左轉法。把所有邊拆為兩條有向邊, 然後在每個點上極角排序, 每次乙個邊在終點找反向邊然後看極角序在反向邊前面的一條邊記為 \(nxt\) , 然後跳 \(nxt\) 編號, 根據面積正負判斷是否是無界域。
使用 \(set\) 直接維護, 具體見 [scoi2012]blinker 的噩夢 。void build()
for(int i = 2; i <= tot; i ++) if(! pos[i])
for(int i = 2; i <= tot; i ++) ) ;
}}
學習筆記 計算幾何
高中數學必修二內容,基本理論見 oiwiki。先上 struct node node double x,double y void input node friend operator node a,node b double friend operator node a,node b 點積 dou...
計算幾何學習筆記
基礎部分 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 考慮如果有跨這條線的...