點的內包:判斷點是否在多邊形內。
輸入
乙個多邊形點的序列
問題數各個問題的點的資訊
輸出 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 極...