凸包之Jarvis步進法

2021-08-04 11:47:13 字數 1093 閱讀 8331

jarvis步進法:

概述:也可稱為卷包裹法,思路是先找到乙個在凸包上的點,然後卷過去,由於每次確定凸包上的乙個點需要遍歷所有的點,因此時間複雜度為o(n*h),其中n為全部點的數目,h為凸包上的點數目;

適用性:從時間複雜度可以看出此方法適用點的數目不易過多,建議適用graham掃瞄法;

方法和步驟:(下述採用固定兩點的方式)

(1)找到位於最低最左邊的點p0,最高最右邊的點pk,則此兩點必為凸包上的點;

(2)對逆時針方向排列的頂點序列按p0pk構造右鏈,左鏈;

(3)右鏈構造:設定乙個棧,先將p0入棧,對其他的點依據相對於棧頂元素的最小極角,並距離最遠的點入棧,左鏈同理;

(4)核心:如何求相對於棧頂元素的最小極角?

設pk為最高點,p0位棧頂元素;

只要棧頂元素不是pk,迴圈做以下工作:

pm=pk;

for(int i=0;iif((p[top]p[i]×p[top]pm>0)||(p[top]p[i]與p[top]pm共線)&&(|p[top]p[i]|>|p[top]pm|)

pm=p[i];

經過上述一次遍歷,得到的pm為相對於當前p[top]的具有最小極角的頂點,即右鏈中連線p[top]的下乙個凸包的頂點;

左鏈同上述操作同理;

**:(&&優先順序高於||)

#include #include using namespace std;

struct point

;point point[100],pk;

int n,top,k,stack[100];

int det(point a,point b,point c)

int dis(point a,point b)

void jarvis(int n,int flag)

} top++;

stack[top]=m; }

if(flag==1)

if(flag==0)

}int main() }

jarvis(n,1);//右鏈

jarvis(n,0);//左鏈

return 0;

}

平面凸包 Jarvis

覆蓋平面上n個點的最小凸多邊形 形象來講就是平面上有n個柱子,把一根封閉的彈性繩套上這些柱子,繩子繃緊以後形成的多邊形就是我們要求的凸包.1.斜率逼近法,不好寫而且很慢,不予介紹。2.jarvis演算法 3.graham演算法 第三個是基於對第二個的優化。本文主要介紹jarvis演算法,graham...

凸包問題之GrahamScan法

grahamscan法 當沿著convex hull逆時針漫遊時,總是向左轉 在極座標系下按照極角大小排列,然後逆時針方向漫遊點集,去除非conves hull頂點 非左轉點 實現 如下 include include include define max size 10001 struct poi...

凸包問題(蠻力法)

蠻力法求解凸包問題的基本思想 對於由n個點構成的集合s中的兩個點pi和pj,當且僅當該集合中的其他點都位於穿過這兩點的直線的同一邊時 假定不存在三點同線的情況 它們的連線是該集合凸包邊界的一部分。對每一對頂點都檢驗一遍後,滿足條件的線段構成了該凸包的邊界。在平面上,穿過兩個點 x1,y1 和 x2,...