我的計算幾何 總結

2021-07-16 07:15:53 字數 2753 閱讀 7591

與點,線,多邊形,圓形等各種幾何圖形相關的演算法稱為計算幾何演算法。

計算幾何已經稱為3d圖形,cad,機械人等多中領域的計基礎,在程式設計競賽中也常常出現有關的問題。

計算幾何包含很多的內容,涉及範圍很廣。但是,在競賽中出現的題目大多集中於基礎性的問題上。而解決這些問題的關鍵是,把本科線性代數和高中幾何學的知識轉換成**。因此,這篇部落格的主要內容是如何將基礎數學理論轉化為簡潔而無異常的**形式。

向量最直觀的表現形式為帶有方向的箭頭。向量有長度和方向兩個因素構成,所以箭頭的起點並不重要。因此,可以將向量的起點定義為座標空間的原點,那麼就可以將向量表示成箭頭的終位置(x,y)。經過這樣的處理後,就能把向量變成帶有兩個成員變數的類。

以下的**實現了這種方法的vector2類函式。並且實現了多種運算子的過載。

const

double pi = 2.0 * acos(0.0);

struct vector2

// 比較兩個向量

bool

operator == (const vector2& rhs) const

bool

operator

< (const vector2& rhs) const

//向量之間的加減

vector2 operator + (const vector2& rhs) const

vector2 operator - (const vector2& rhs) const

//向量乘實數

vector2 operator * (double rhs) const

//返回向量的長度

double norm()

//返回單位向量

vector2 normalize()

//返回從x軸正方向逆時針到達當前向量的角度

double polar() const

//點乘

double dot(vector2& rhs) const

//叉乘

double cross(const vector2& rhs) const

};

我們將把線段表示成以這兩個端點為終點的兩個向量。

將直線表示成包含於該直線的任意一條線段。

這表示的最直接的好處,是可以和已有的向量建立起聯絡,可以使用現成的函式。

這兩者在計算幾何中很常用,都有著各自的幾何含義。
定義

用處定義

略。。。

用處

//原點向量在向量a的逆時針上,返回正數;順時針 返回負數;平行 返回 0;

double ccw(vector2 a, vector2 b)

//把點p視為基準點時,返回值情況同上;

double ccw(vector2 p, vector2 a, vector2 b)

確認直線之間是否相交在幾何題中很常見,但是,編寫這樣的**卻不太容易,以為要考慮各種特殊的情況。

表示相交直線的最好方式為,將直線表示成乙個點和乙個方向向量。

《因為不知道向量符號咋打的, 所以 下文中兩個相同字元的視為向量符號加上單個字元》

例如:求解直線l1: aa + p * bb ; 直線 l2: cc + q * dd;

可得: aax + p * bbx = ccx + q * ddx; aay + p * bby = ccy + q * ddy;

所以:p=(

ccx−

aax)

ddy−

(ccy

−aay

)ddy

bbx∗

ddy−

bby∗

ddx

化簡得:p=

(cc−

aa)×

ddbb

×dd

最後將p的值 帶入直線l1 中即可。實現**:

//計算兩個直線(a,b)和直線(c,d)的交點

double lineintersection(vector2 a, vector2 b, vector2 c, vector2 d, vector2& x)

自己畫一下圖,很好理解的。

//線段(a,b)和線段(c,d) 是否有交點。

bool segmentintersection(vector2 a, vector2 b, vector2 c, vector2 d)

return ab <= 0 && cd <= 0

; }

先上張

這裡寫描述

先來了解一下,什麼是凸包。

點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。

有人把這些點看成在木板上的釘子,而凸包就是乙個橡皮筋套住所有釘子是的輪廓。

求解凸包的簡單方法是卷包裹法。

卷包裹演算法從乙個必然在凸包上的點開始向著乙個方向依次選擇最外側的點

很容易理解對不對。上**:

//凸包(卷包裹法)

typedef

vector

polygon;

polygon giftwrap(const

vector

& points)

if(next == pivot) break;

hull.push_back(next);

}}

計算幾何總結

hdu1392 surround the trees 凸包模版題 poj 1228 grandpa s estate 穩定凸包 poj2187 beauty contest 旋轉卡殼,求凸包中任意兩點的距離 hdu2036 改革春風吹滿地 多邊形面積模版題 hdu 2892 area 凸多邊形與圓的...

計算幾何公式總結

一.注意 1.注意捨入方式 0.5的捨入方向 防止輸出 0.2.幾何題注意多測試不對稱資料.3.整數幾何注意xmult和dmult是否會出界 符點幾何注意eps的使用.4.避免使用斜率 注意除數是否會為0.5.公式一定要化簡後再代入.6.判斷同乙個2 pi域內 兩角度差應該是 abs a1 a2 p...

計算幾何 模板總結

計算幾何終極模板 總結 pragma comment linker,stack 102400000,102400000 include bits stdc h define pb push back define ls l,m,now 1 define rs m 1,r,now 1 1 define...