OI計算幾何 簡單學習筆記

2022-03-03 17:51:40 字數 1678 閱讀 3644

學習平面幾何,首先我們要會熟練地應用向量,其次也要知道一些基本的幾何知識。(其實看看數學課本就可以了吧)

因為是看的藍書,所以很多東西做了引用。(update:還參考了趙和旭dalao的講義)

下面先介紹一些常用的操作:

struct point

};

typedef point vec
inline int dcmp(double x)

inline double length(vec a)
inline double angle(vec a,vec b)
對於\(\vec a\)和\(\vec b\),集合上的定義為:\(\vec a\times \vec b\times sin \theta\) ,代數的計算方法則為\(ax*by-ay*bx\)。

它的幾何意義表示這兩個向量形成的平行四邊形的面積。

inline double cross(vec a,vec b)
因為叉積在數值上可以表示向量a,b圍成的平行四邊形的面積,所以我們可以通過叉積來計算三個點圍成的三角形的面積——

inline double area(point a,point b,point c)
除此之外還有一些應用:

公式為\(x_=xcosa-ysina\),\(y_=xsina+ycosa\),其中a為逆時針旋轉的角的弧度值。

inline vec rotate(vec x,double a)

inline point getline_intersection(point p,vec v,point q,vec w)

其實數學上有個公式叫做\(\frac}\),但是這個需要直線的表示式,我們可以利用叉積來更方便地進行計算。( 也就是用平行四邊形的面積除以底)

inline double distance(point p,point a,point b)//a,b組成的是邊

其實就是從乙個頂點開始,將多邊形劃分成若干個三角形進行計算。(從p0開始劃分)

inline double area(point* p,int n)

}

關鍵**:(我這裡使用的是極角排序)

inline void solve(node x)

tmp=get_nxt(nxt);

while(cross(x-(*nxt),(*nxt)-(*tmp))<=0)

return;

}

就是從某乙個判定點出發,任意引出一條射線。如果和邊界相交奇數次,說明點在多邊形內。如果相交偶數次,說明點在多邊形外。注意射線如果在端點處和多邊形相交,或者穿過一條完整的邊,則需要重新引出一條射線qaq

我們把多邊形的每條邊的轉角加起來,如果是360度,說明在多邊形內。如果是0度,說明在多邊形外。如果是180度,說明在多邊形的邊界上。優化的操作如下:假想有一條向右的射線,統計多邊形穿過這條射線正反多少次,把這個數基座繞數,逆時針穿過時+1,順時針穿過時-1.

咕咕咕

學習筆記 計算幾何

高中數學必修二內容,基本理論見 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 考慮如果有跨這條線的...