演算法導論學習筆記(五)計算幾何之尋找凸包

2021-07-22 08:49:41 字數 1349 閱讀 2539

定義:點集q的凸包是乙個最小的凸多邊形p,滿足q中的每個點都在p的邊界上或在p的內部。

通過排序所有點,選擇乙個一定是凸包中的點作為基點,再在剩餘點中按相對於基點的極角排序,最後依次遍歷所有點,將不符合凸多邊形定義的點去除,剩下的點集便是凸包中的點。

graham-scan( q)

q.sort( 0, 1, 2..., n-1) with

(pi.y==pj.y)? (pi.x#include const double accuracy = 0.0000001;

typedef struct point

vectorline;

vectorline operator- ( point a, point b)

bool cmpx( point a, point b )

double getdistance( point a, point b )

struct node

;void setnode(node &a, point source )

bool cmppoint( node a, node b )

bool cmpdegree( node a, node b )

int getcrossproduct( vectorline a, vectorline b )

bool check( point newpoint, point oldpoint, point sourcepoint )

int getconvexhull( node *nodes, int sizeofnodes, point *convexhull )

convexhull[sizeofstack++] = nodes[i].point;

}return sizeofstack;

}

將點設為有物理特性,利用一條可彎曲的射線,將一端放在乙個最左邊的點上,將射線方向設為180度,逆時針旋轉,所遇見的第乙個為下乙個凸包點,然後依次挑選,直至點為第乙個點時,所選出的點集為凸包。

jarvis( q)

q.sort( 0, 1, 2..., n-1) with

(pi.y==pj.y)? (pi.xlet nowpoint = 0 and nextpoint = -1

while nextpoint != 0

//以p0點為原點,建立極座標

nextpoint in q

//nextpoint為q中極角最小的點

nowpoint = nextpoint

演算法導論學習筆記(五)計算機幾何之最近點對

暴力搜尋所有點對的距離,時間複雜度為o n 2 在資料規模較為龐大的情況下,並不能很好的執行。以下將利用分治的方法,將時間複雜度降為o n lg n 2 1.將主問題按座標劃分成兩個子問題 以直線l x k為中心,使得兩邊的點數相同。2.當子問題求解完畢後,設 為已經求解出的最小距離,然後以 l1 ...

演算法導論之計算幾何學

所屬專欄 演算法導論專欄 計算幾何學是電腦科學的乙個分支,專門研究集合問題的解決的演算法。計算幾何學的問題一般輸入關於一組集合物件的描述,如一組點 一組線段 輸出是對問題的回答,如直線是否相交。三維空間和高維空間很難視覺化,這裡計算幾何學主要基於二維平面,輸入物件用一組點來表示,其中每個pi xi,...

學習筆記 計算幾何

高中數學必修二內容,基本理論見 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...