凸包
對於一組點,能將所有點包含在內的最小的凸多邊形就是所謂的凸包。這個凸包是有該組點中的若干點組成的。可以想象這些點是一塊板上釘的釘子,用乙個彈性很好的橡皮筋箍住所有的點,那麼這條橡皮筋所形成的多邊形就是凸包。有很多種不同的演算法可以計算凸包,本文中,我們將討論其中一種演算法,該演算法在大多數情況下的效能足夠好,但是比起其他一些演算法還是相當慢的。
首先,我們可以遍歷所有點,找到最左邊的點(x最小),如果有兩個以上的點的x相同,那麼我們取最高的那個點(y最大)。顯然該點必然是凸包上的乙個點,我們就設該點p為起點。現在我們以順時針方向遍歷所有的點。這裡我們要使用叉乘運算元。如何確定哪乙個點是下乙個點呢?我們可以任選乙個未用的點n作為下乙個點,然後遍歷所有其他未用的點,假設是x。如果(x-p) x (n-p) 是負的,我們將x設為新的下乙個點n。在我們遍歷所有點後,得到的點n就是凸包上的下乙個點。下面的圖示表明了該演算法的步驟:
接著同樣的方法我們可以找到凸包的下乙個點,直到我們返回起點。
這裡我們是使用叉乘尋找順時針的下乙個點是很容易理解的。不過在有幾點共線的時候,事情稍稍有點複雜。假設不考慮共線的情況,**很簡單:
convexhull(point x)}}
p = n;
used[p] = true;
}while(start!=p);
}
(譯註:該演算法複雜度為o(n^2),有更好的演算法,複雜度為o(nlogn),參見維基:
多邊形內點
給出乙個任意多邊形的頂點和乙個點,測試該點是否在多邊形內、外或邊上。
這個問題可以簡單使用線-線交點和點-線距離的演算法。
首先我們可以使用點-線距離來測試該點是否在邊上。如果該點到任意一條邊的距離為0,那麼顯然是在邊上。
然後,我們要檢測該點是否在多邊形內部。想象一下以該點為起點,向任意方向畫一條射線,每一次該射線和邊相交,該射線就由多邊形內部穿越到外部或相反。這樣,如果該點在多變形內部,該射線必然和邊相交奇數次。技術上我們不需要真的畫一條無限長的射線,我們只要有一足夠長的線段即可。如果另一端點沒有選好,你有時會陷入困境,例如線段兩點均在多邊形內部或和某一條邊重合。簡單但是齷齪的做法是用乙個足夠大隨機數作為線段的另乙個端點,這個方法雖然不優美且不安全,但是在實踐中它管用。這線段和某一條邊重合的概率是如此之小以至於你可以拍胸脯說可以得到正確的解答。如果你還是不放心,你可以選幾個隨機點,然後返回最普遍的答案。
string testpoint(verts, x, y){
int n = lengthof(verts);
int cnt = 0;
double x2 = random()*1000+1000;
double y2 = random()*1000+1000;
for(int i = 0; i
CGAL 計算機幾何演算法庫
cgal開源專案是乙個c 庫,提供了高效和可靠的幾何演算法。cgal應用於各種需要計算機幾何的領域,比如 計算機圖形學,科學視覺化,計算機輔助設計與建模,地理資訊系統,分子生物學,醫學影像學,機械人運動規劃,網格生成和數值方法 更多詳情參見projects using cgal。cgal提供了一些資...
CGAL 計算機幾何演算法庫
cgal開源專案是乙個c 庫,提供了高效和可靠的幾何演算法。cgal應用於各種需要計算機幾何的領域,比如 計算機圖形學,科學視覺化,計算機輔助設計與建模,地理資訊系統,分子生物學,醫學影像學,機械人運動規劃,網格生成和數值方法 更多詳情參見projects using cgal。cgal提供了一些資...
計算機 計算機基礎整理
大學四年浪費的代價。半夜整理東西 cpu 其功能主要是解釋計算機指令以及處理計算機軟體中的資料。cpu由運算器 控制器和暫存器及實現它們之間聯絡的資料 控制及狀態的匯流排構成。差不多所有的cpu的運作原理可分為四個階段 提取 fetch 解碼 decode 執行 execute 和寫回 writeb...