平面凸包 Jarvis

2021-08-15 05:33:36 字數 1014 閱讀 4299

覆蓋平面上n個點的最小凸多邊形

形象來講就是平面上有n個柱子,把一根封閉的彈性繩套上這些柱子,繩子繃緊以後形成的多邊形就是我們要求的凸包.

1.斜率逼近法,不好寫而且很慢,不予介紹。

2.jarvis演算法

3.graham演算法

第三個是基於對第二個的優化。

本文主要介紹jarvis演算法,graham演算法下篇文章再議。

找一條直線l過其中一點a,且其他點都在l的同側(這樣的直線顯然存在),則a為所求凸包的乙個點。

讓l以a為軸點向同乙個方向不斷選擇(預設順時針),直至l碰到除a以外的第乙個點,記為b。若同時碰到多個點b,則求距離最遠的。再以b為軸點旋轉,重複上述過程,直至找回到a點即求出了凸包,期間找到的點即為凸包上的點。

然而我們在計算機上並不可以實現直線的選擇,因此不可以直接套用數學構造法。但是我們可以通過掃瞄點來達到相同的目的。

#include 

#include

#include

#include

const

double eps=1e-10;

int n;

struct point;}

};point d[100051];

int stk[100051];

double

operator * (point p1,point p2)

double distance(point p1,point p2)

bool judgeleft(point p0,point p1,point p2)//判斷同側

int main()

while(stk[top]!=fis);

top--;

printf("%d\n",top);

for(int i=1;i<=top;i++)

printf("%.2lf %.2lf\n",d[stk[i]].x,d[stk[i]].y);

return

0;}

凸包之Jarvis步進法

jarvis步進法 概述 也可稱為卷包裹法,思路是先找到乙個在凸包上的點,然後卷過去,由於每次確定凸包上的乙個點需要遍歷所有的點,因此時間複雜度為o n h 其中n為全部點的數目,h為凸包上的點數目 適用性 從時間複雜度可以看出此方法適用點的數目不易過多,建議適用graham掃瞄法 方法和步驟 下述...

平面凸包 學習筆記

什麼是平面凸包?平面凸包 以下簡稱 凸包 是指覆蓋平面上n個點的最小凸多邊形。形象來說就是把n個點看成n根柱子,用橡皮筋去緊框住這n根柱子,最後形成的拉緊的多邊形就是要求的凸包。怎麼求平面凸包?1.jarvis演算法 首先我們需要了解凸包的數學構造法 找一條直線l過其中一點 記為a 並且其他所有點都...

平面點集的凸包問題

平面點集的凸包可理解為包含所有點的最小凸多邊形 點可以在多邊形邊上或在其內 這裡給出一種求解方法。先找所有點中 y 座標最大最小的點pmax pmin,所找點必定是凸包上的點 找距離直線pmaxpmin兩側最遠的點p1,p0,構成初始三角形 再對每個三角形新生成的邊 和 繼續找與改變對應頂點 不在同...