1. 程式人生 > >計算幾何入門 1:凸包的概念

計算幾何入門 1:凸包的概念

一、什麼是計算幾何:

計算幾何學(computational geometry)發展於二十世紀七十年代末,是一個正在飛速發展的新型學科。作為一個計算機演算法類學科的分支,計算幾何討論更多的是計算而非幾何,幾何只是它的表現形式,核心還是演算法。現代意義上的計算幾何起源於1978年M.I.Shamos的博士論文,是計算機圖形學、CAD、人工智慧等多領域理論基礎。計算幾何可以簡單理解為“演算法設計與分析”課程的一個分支,是一個融入離散幾何、組合幾何,用幾何的思想來解決問題的學科。

二、預備知識:

  • 語言:C/C++
  • 資料結構與演算法:大O表示法,簡單的複雜度分析方法,基礎排序、查詢等演算法
  • 數學:基本的高等數學、線性代數、概率論知識,離散數學基礎

三、基本概念:凸包

計算幾何領域幾乎所有的問題都可以“歸約”為凸包問題,因此學習凸包問題對整個計算幾何體系至關重要。

凸包(Convex Hull)定義為:

平面的一個子集S被稱為是“凸”的,當且僅當對於任意兩點p,s∈S,線段ps都完全屬於S。(平面凸包定義)

如下圖所示:


上圖左邊集合中任意兩點組成的線段都屬於該集合,因此是一個凸集,而右邊集合則不是。

集合S的凸包CH(S),就是包含S的最小凸集——即包含S的所有凸集的交。

舉個形象的例子來直觀理解凸包。假設一個板子上有許多釘子,你撐開一個橡皮筋要去套住它們:


當你鬆手的時候橡皮筋就會變成這種狀態:


橡皮筋的狀態就可以看作所謂的“凸包”。它的範圍是由“外部”的一些釘子來決定的,而“內部”的釘子並不起作用。當然內部與外部都是相對而言的,若某個釘子能移動位置,就可能使某些點“起作用”,也可能使某些點失去“作用”:


1、凸包應用舉例

畫家繪畫時經常會將幾種顏料按比例混合,以得到想要的某種顏色。而所有顏色都能由紅、綠、藍三種基色混合得到(實際上是色光三原色而非美術),簡化起見我們只考慮紅色(R)和綠色(G)兩種顏色,每種顏色可以看成紅色和綠色的函式:C = (R, G)

例如某種顏色可以表示為 X = (10%, 35%),另一種顏色為 Y = (16%, 20%)。假設我們需要的顏色為U = (12%, 30%),怎樣的X和Y的比例能“勾兌”得到U呢?

答案是:兩份的X加上一份的Y即可得到U,即 X:Y = 2:1。

試探性的湊出一個比值顯然有些麻煩,更大的問題在於很多時候答案是湊不出來的。例如 V = (13%, 22%)

,無論如何是無法通過X和Y的混合得到的。此時我們可以加入另一種顏色Z = (7%, 15%),這三種顏色能否勾兌出U呢?答案是 X:Y:Z = 1:3:1。

現在的問題就能歸結為:

  • 給定某些顏色X, Y, Z...能否通過他們勾兌出特定顏色U
  • 若能勾兌,如何計算原料比例
這就能用凸包來解決了。

凸包是一種幾何模型,而幾何最基礎的概念就是空間,我們將顏色的歐氏空間定義為一種“顏色空間”。我們將每一種顏色都對應到顏色空間的一個

上述顏色X,Y,Z、U和V用點表示為:

X = (10, 35), Y = (16, 20), Z = (7, 15)                  U = (12, 30), V = (13, 22)

橫軸表示紅色分量數值,縱軸表示綠色分量數值,將這些點在影象上表示為:


觀察U和V的位置,我們發現:

U線上段XY上,並且 XU:UY = 1:2,是勾兌比例的反比,並且U的勾兌不需要X和Y之外的顏色參與(可以考慮極端情況,U線上段XY的端點上,只需要一種顏色即可);

而V並不在線段XY上,但是在X, Y, Z縮圈定的範圍內,所以V能被這三種顏色勾兌出來,而V到三個原料點距離的反比正好也是勾兌比例1:3:1;

2、凸包的數學推導

上述發現有著更嚴格的推導證明其正確性,推導的理論基礎正是凸包:

對於二維空間中點集 S = {p1, p2, ... , pn},p能被其他點的線性組合表示出來:

p = [p1, p2, ... , pn]λ = λ1p1 + λ2p2 + ... + λnpn

其中λ為一個向量,由n個分量組成,即各點的係數(相當於勾兌比例)。其中有些組合(相當於勾兌方案)被稱為凸組合(convex combination),具體來講就是λ要滿足:

λ1 + λ2 + ... + λn = 1,並且min{λ1, λ2, ... ,λn} ≥ 0

即各點係數非負(相當於所用顏料量不可能是負的)且總和為1。

如果我們新加入的顏色Z落線上段XY上,顯然Z本身就能通過X和Y來勾兌,新加入Z對於勾兌出V是毫無幫助的。這種關係被稱為:凸相關。當Z與X, Y不是凸相關的時候就會組成上圖所示的三角形平面區域,區域內的所有顏色都能被X, Y和Z勾兌出來。若繼續加入一個新的點,並且這個點與X, Y, Z凸無關,就能改變這個區域:


這和一開始我們加入新的釘子本質是一樣的,點相當於釘子,而橡皮筋圈定的範圍就是凸包。

本文是學堂線上課程《計算幾何》的筆記,參考資料:《計算幾何——演算法與應用》Mark de Berg等著,鄧俊輝譯;《計算幾何——演算法設計與分析》 周培德著

相關推薦

計算幾何入門 1概念

一、什麼是計算幾何: 計算幾何學(computational geometry)發展於二十世紀七十年代末,是一個正在飛速發展的新型學科。作為一個計算機演算法類學科的分支,計算幾何討論更多的是計算而非幾何,幾何只是它的表現形式,核心還是演算法。現代意義上的計算幾何起源於197

計算幾何入門 5構造演算法下界

從極點法的O(n^4)複雜度,到極邊法的O(n^3),再到增量構造法和Jarvis March的O(n^2),我們經歷了將特定問題演算法不斷優化、降低複雜度的過程。那麼還有比O(n^2)更高效的演算法嗎?凸包構造演算法的下界是什麼?推廣到一般情況,在計算模型固定的情況下特定

計算幾何入門 3的構造——增量構造法

極點法和極邊法的複雜度分別為O(n^4)和O(n^3),當點集S的規模稍大時就難以適用了。為了滿足實際需要必須尋找更高效的演算法來構造凸包。 一、減治 在引入新演算法之前首先來回顧一下經典的演算法思想:減治(decrease and conquer),注意不是分治(divi

2017ACM/ICPC亞洲區沈陽站 C Hdu-6219 Empty Convex Polygons 計算幾何 最大空

sort get 沈陽 for mes c++ 幾何 targe oid 題面 題意:給你一堆點,求一個最大面積的空凸包,裏面沒有點. 題解:紅書板子,照抄完事,因為題目給的都是整點,所以最後答案一定是.5或者.0結尾,不用對答案多做處理 1 #inc

計算幾何_三維

1.hdoj3662 3D Convex Hull   傳送:http://acm.hdu.edu.cn/showproblem.php?pid=3662 題意:給出空間n個點,問凸包表面的多邊形個數。 分析:rt。 1 #include<bits/stdc+

計算幾何旋轉卡殼求直接原理詳解

先提一下最基本最暴力的求凸包直徑的方法吧—列舉。。。好吧。。很多問題都可以用 列舉 這個“萬能”的方法來解決,過程很簡單方便是肯定的,不過在效率上就要差很遠了。 要求一個點集的直徑,即使先計算出這個點集的凸包,然後再列舉凸包上的點對,這樣來求點集直徑的話依然會在凸包上點的數

計算幾何 graham 最大

凸包的嚴格凸多邊形 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit users: 39, Accepted users: 35 Problem 11326

計算幾何_三維(3d convex hull)

const double eps = 1e-8; typedef list<int>::iterator liit; inline int sign(double d){ if(d < -eps) return -1; return (d > e

計算幾何 學習筆記 --- Graham 掃描法

 凸包 (只針對二維平面內的凸包) 一、定義 簡單的說,在一個二維平面內有n個點的集合S,現在要你選擇一個點集C,C中的點構成一個凸多邊形G,使得S集合的所有點要麼在G內,要麼在G上,並且保證這個凸多邊

poj 2187 計算幾何入門

連結:http://poj.org/problem?id=2187 題意: 有n個牧場,給定每個牧場的位置,位置互不相同,計算距離最遠的兩個牧場的之間的距離。 思路: 如果某個點在另外三個點組成的三角形的內部,那麼他就不屬於最遠點對。所以最後要考慮的就是

計算幾何(一)問題(Convex Hull)

### 引言 首先介紹下什麼是凸包?如下圖: ![](https://gitee.com//riotian/blogimage/raw/master/img/20200921200555.png) 在一個二維座標系中,有若干點雜亂排列著,將最外層的點連線起來構成的凸多邊型,它能包含給定的所有的點,這個多

nodejs零基礎詳細教程1安裝+基礎概念

img res 安裝過程 pkg 實時 linkedin 圖標 過程 好的 第一章 建議學習時間2小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏輯

Git(1)思想及概念

.com 永久 導致 回來 運算 image 提交 簡單的 設計 Git與其他版本控制軟件的差異及思想 直接記錄快照,而非差異比較 Git不保存這些前後變化的差異數據。實際上,Git 更像是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一

webpackt入門1webpack介紹&webpack安裝&使用webpack打包

github 輸出 rip 除了 原創 ini com lec 轉換成 本篇博客不是原創,簡書的zhangwang寫的,原文太長,我這裏只是提取了一部分。 原文地址:入門webpack,看這篇就夠了 一、Webpack解決了什麽問題 問題

BZOJ 1185 [HNOI2007]最小矩形覆蓋 + 旋轉卡殼

read font return iostream operator 投影 class mod 平面 題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 題意:   給出二維平面上的n個點,問你將所有點覆

無人駕駛入門1無人駕駛概覽

融合 起點 分別是 tail load 機器人 intro rap 發送 最近給大家分享了《百度Apollo無人駕駛入門課程下載》,我也學習了一些,把我做的筆記分享給大家。 第一課:無人駕駛概覽 課程主要介紹了無人駕駛車的關鍵部分以及Apollo的架構,帶大家入門無人駕

Appium基礎總結1獲取名和Activity

主要通過cmd命令:aapt來獲取包名和Activity 1.安裝android build-tools SDK安裝目錄雙擊Manager.exe,勾選Build-tools 2.PATH配置環境變數 將SDK安裝目錄下的\Android\android-sdk\build-tools\24.0.0;新增到

數學演算法詳解

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define PI 3.1415926535 using nam

Spark入門——1RDD及程式設計介面

     RDD是Spark的核心,也是整個Spark的架構基礎。spark與mapreduce相比,前者提供了更加豐富的程式設計介面給程式猿們。所以下面主要說明RDD的基本概念,以及其重要介面。 RDD包含4大操作:                1,建立操作:

SSIS實踐入門1我的第一個SSIS程式開發

深圳,和你見面已經有23天的時間了,第10天敲定了我人生中的第三份工作,雖說不是和想象中的工作那麼好,但是我感覺我已經提前進入了備戰狀態,接下來我希望自己在你的領土可以有所發展,深圳,一個人多的城市,一個快節奏的城市.       永遠不要想著讓環境適應你,當你又一次孤身一人