計算幾何學 3

2021-09-25 09:08:41 字數 1983 閱讀 2052

點的內包:判斷點是否在多邊形內。

輸入

乙個多邊形點的序列

問題數各個問題的點的資訊

輸出 2代表在圈內

1代表在圈上

0代表在圈外

只要檢查一p為端點且平行於x的射線與多邊形g的邊的相交次數,我們就能判斷給定的點p是否內包與多邊形g。對於構成多邊形各邊的線段設如果a和b外積大小為0且內積小於等於0,則點p位於接著我們調整a,b的值使y小的為a,大的為b。在這個狀態下,如果a和b外積的大小為正且a,b位於射線兩側,則可確定相交。這裡要注意設定邊界條件,避免射線與

//點的內包

int contains(polygon g,point p)

return (x?2:0);

}

凸包:包含點集合p中所有點的最小凸多邊形。

輸入

一系列的點序列

輸出 逆時針輸出凸包

人們已經研究出了數個求凸包的演算法。這裡我們將要學習的是相對容易掌握的安德魯演算法(andrew's algorithm)。

按照下述流程建立凸包的下部

polygon andrewscan(polygon s)

u.push_back(s[i]);

} //構建凸包下部

for(int i=s.size()-3;i>=0;i--)

l.push_back(s[i]);

} //順時針方向生成凸包的點的序列

reverse(l.begin(),l.end());

for(int i=u.size()-2;i>=1;i--)

l.push_back(u[i]);

return l;

}

線段相交問題給出n條平行於x軸或者y軸的線段,請輸出其交點數

基本思路:

與軸平行的線段相交問題(曼哈頓幾何)可以通過平面掃瞄(sweep)高效求解。平面掃瞄演算法的思路是將一條與x軸(或者y軸)平行的直線向上(向右)平行移動,在移動過程中尋找交點。這條直線稱為掃瞄線。

掃瞄線並不是按照固定的間隔逐行掃瞄,而是在每次遇到線段上的端點時停止移動,然後檢查該位置上的線段交點數。因此我們需要先將輸入的線段端點按照y值排序,讓掃瞄線向y軸正方向移動。

再掃瞄過程中,演算法會將掃瞄線穿過的垂直線段(與y軸平行)臨時記錄下來,等到掃瞄線與水平線段(平行於x軸)重疊時,檢查在水平線段範圍內的交點數。

為提高效率,我們可以應用二叉搜尋樹來儲存掃瞄線穿過的垂直線段。

#define bottom 0

#define left 1

#define right 2

#define top 3

class endpoint

endpoint(point p,int seg,int st):p(p),seg(seg),st(st)

bool operator < (const endpoint &ep) constelse if(s[i].p1.y>s[i].p2.y)

swap(s[i].p1,s[i].p2);

if(s[i].p1.y==s[i].p2.y)

else }

sort(ep,ep+(2*n));

setbt;

bt.insert(1000000001);

int cnt=0;

for(int i=0;i<2*n;i++)

} return cnt;

}

計算幾何學簡單的模板

一些定義 include include include include include using namespace std define maxn 1200 define eps 1e 8 struct point po maxn struct line typedef point vecto...

演算法導論之計算幾何學

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

我的計算幾何學題目分類

uva11646 sdutoj2603 poj1269 poj1410 poj1328 貪心 uva12304 三角 圓基本關係 poj1556 線段相交 最短路 poj2966 凸包 最短路 poj2031 最小生成樹 poj2318 poj2398 二分 hdu1086 基礎 poj2007 極...