計算幾何基礎入門(1)

2022-08-13 20:33:17 字數 3262 閱讀 1909

平面最接近點對&&二維凸包

&&最小覆蓋圓  模板

首先要知道兩個基礎知識

叉積與基礎運算子過載

二維叉積可以用來判斷點與點的位置關係與面積  (三維叉積可算平面的法向量)

這些模板都是二維的  我想想看能不能化為三維的題 空間最小點對 三維凸包 最小覆蓋球

例題   p4894、 p3744、p2785

平面最接近點對模板講解

最容易想到的方法是n2暴力法  但一分析資料範圍就會發現肯定會t  於是我們有了下面乙個思路  先將點按x排序再運用歸併把數對最終分為左右然後在合併   那麼最短距離就變為了左右最短距離與跨越分界線的最短距離這三種情況      難點就只在跨越分界線的了    關鍵點就是能夠點的距離小於d的點的數量是很少的  我們的任務就是只找出並計算這些點  關鍵在**內有說明

#includeusing

namespace

std;

const

int maxn=1000001

;const

int inf=2

<<20

;int

n,temp[maxn];

struct points[maxn];

bool cmp(const point &a,const point&b )

bool cmps(const

int &a,const

int &b)

double min(double a,double b)

double dist(int i,int j) ///

求距離double merge(int left,int right) ///

只判斷x小於d&&y也小於d的點對

returnd;}

intmain()

二維凸包模板講解

經分析只要我們選最外層的點組合成圖形就是最短圍欄  這就是二維凸包   這時我們採用的方法是graham法  乙個經典演算法   關鍵就在於如何判斷乙個點是不是凸包的構成點   建議畫乙個凸包並看**分析   **注釋寫了關鍵

#includeusing

namespace

std;

intn;

struct

benp[

10005],s[10005

];double check(ben a1,ben a2,ben b1,ben b2)///

檢查叉積是否大於0,如果是a就逆時針轉到b

double d(ben p1,ben p2)///

兩點間距離

bool cmp(ben p1,ben p2)///

排序函式,這個函式別寫錯了,要不然功虧一簣

intmain()

}sort(p+2,p+1+n,cmp);///

系統快排 利用叉積排序

s[1]=p[1];///

最低點一定在凸包裡

int cnt=1

;

for(int i=2;i<=n;i++)///

s陣列儲存凸包端點

s[cnt+1]=p[1];///

最後乙個點回到凸包起點

double ans=0

;

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

ans+=d(s[i],s[i+1]);///

最小長度為邊長和

printf("

%.2lf\n

",ans);

return0;

}

最小覆蓋圓模板講解

這題的關鍵是  不斷向現在形成的圓加入新的點  如果這點不在此圓內時   那麼符合最小圓概念的話 這個新點它一定在符合的圓的邊界上   運用這個思路我們可以求出三個點    來求這個圓    由中垂線求圓心  中點直接/2  方向就是右轉90°   用向量來表示直線   

#include#define ll long long

using

namespace

std;

struct

vec///

過載+-*/

vec operator + (const vec& t) const

vec

operator - (const vec& t) const

vec

operator * (const

double& t) const

vec

operator / (const

double& t) const

const

double len2 () const

const

double len () const ///

向量模長

vec norm() const ///

標準向量

vec rotate_90_c () ///

向右轉90度

};double dot(const vec& a, const vec& b)

double crs(const vec& a, const vec& b) ///

叉積vec lin_lin_int(

const vec& p0, const vec& v0, const vec& p1, const vec&v1)

vec circle(

const vec& a, const vec& b, const vec& c)///

中垂線求圓心 直線用向量表示

intn;

vec pot[

100005

];int

main()}}

}}}printf(

"%.10lf\n%.10lf %.10lf\n

", sqrt(r2), o.x, o.y);

return0;

}

看到最後面的彩蛋  : 輕**   speak softly,love

計算幾何 幾何基礎

這章早在2017年寒假就在培訓的時候由來自清華的hta老師上過了 但是本蒟蒻那時候並不是懂的太多 所以這週ww老師又上了一遍 大概記錄一下 大概就跟高中必修4的平面向量差不多 有上過的應該都會 a x1,y1 b x2,y2 a b x1x2 y1y2 a b a b cos a,b 運用 若a與b...

計算幾何入門

以下內容由各位大神的部落格提取出來 向量。如果一條線段的端點是有次序之分的,我們把這種線段成為有向線段 directed segment 如果有向線段p1p2的起點p1在座標原點,我們可以把它稱為向量 vector p2。設二維向量p x1,y1 q x2 y2 則向量加法定義為 p q x1 x2...

計算幾何基礎 《演算法競賽入門經典》

includeusing namespace std const int n 1e3 struct point 建構函式,方便 編寫 struct polygon struct circle typedef point vector 程式上實現向量與點的結構體相同,一組 x,y 可以代表一點點或者乙...