計算幾何學習筆記

2021-07-29 13:12:33 字數 3303 閱讀 5809

計算幾何是什麼東西?能吃嗎?

給定

n 個點(x

i,yi

),問(歐幾里得)距離最近的點對。

如果用樸素的兩兩枚舉,需要o(

n2) 的時間。考慮用分治法,先將點按照先

x 後

y排序。考慮對一段點(l

,r) 的處理。在**放一根平行於y軸的線,其左邊的答案為a, 右邊為b,設δ=

min(

a,b)

。考慮如果有跨這條線的兩點為答案,必然在長為2δ

,寬為δ 的方格裡。可以證明只有o(

凸包就是給定平面上若干個點和乙個巨大的包含所有點的細理想輕橡皮筋,當你一鬆手pi

a 的一生,橡皮筋縮成的形狀就是凸包。計算凸包乙個簡單的方法是gr

aham

掃瞄法,他可以在o(

nlgn)

的時間內求解

n 個點的凸包。

具體步驟是選取最左側的乙個點作為基準,對所有點按照極角排序,然後按照極角序丟進乙個凸殼的棧,如果違反凸性就刪除頂點元素。最後形成的就是乙個凸包。

hdu1392**。

(資料有誤,兩個點的時候要直接視作線段長)

#include 

using

namespace

std;

const

int maxn = 10005;

const

double eps = 1e-9, inf = 1e100;

struct p

p(double x, double y):x(x),y(y){}

friend

bool

operator

< (const p &a, const p &b)

} v[maxn];

int n;

double len(p a, p b)

double det(p a, p b)

double dot(p a, p b)

p line(const p &s, const p &t)

p k;

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

stack

stk;

double work()

else

stk.push(t2);

}stk.push(v[i]);}}

double ans = 0;

while (stk.size() > 1)

while (!stk.empty()) stk.pop();

return ans;

}int main()

printf("%.2f\n", work());

}return

0;}

考慮如何求解平面上的最遠點對?

首先最遠點對一定在凸包上,如果直接列舉凸包上的點,最壞情況下會退化至o(

n2)。

一種巧妙的方法是用一組平行線「卡」這個凸包:

列舉乙個點,運用叉積判斷遠近,直接暴力搞就好,可以證明是o(

n)。然而坑多如狗…

比如重點,算凸包的時候要刪去;

比如退化成線,要選乙個第二關鍵字,即當極角一樣時,要按照距離初始點遠近排序。

poj2187

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct p

p(long

long x, long

long y):x(x), y(y) {}

long

long

operator * (const p &a)

friend

bool

operator == (const p &a, const p &b)

void print()

} v[50005];

int n;

p k;

long

long ans = 0;

p line(const p &a, const p &b)

long

long len_power(const p &a)

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

stack

stk;

void work(vector

&vec)

else stk.push(t2);

}stk.push(v[i]);}}

while (!stk.empty()) vec.push_back(stk.top()), stk.pop();

for (int i = 0, j = 1; i < vec.size(); i++)

cout

<< ans << endl;

}vector

vec;

int main()

用的最多的貌似是辛普森積分。

就是當距離很小時,用二次函式擬合。∫b

af(x

)dx≈

b−a6

(f(a

)+4f

(a+b

2)+f

(b))

noi2005,月下檸檬樹,待做

玄學,待做。

計算幾何學習筆記

基礎部分 include using namespace std define type double define vector point define eps 1e 8 const double pi 3.14159265358979323 type deg2red type deg type...

計算幾何學習筆記

計算幾何基本採用向量來表示點 線 麵等基本元素,而非我們平時常用的解析式。向量的基礎運算法則 給定兩個向量 p x 1,y 1 q x 2,y 2 加法 p q x 1 x 2,y 1 y 2 減法 p q x 1 x 2,y 1 y 2 數乘 lambda p lambda x 1,lambda ...

計算幾何學習筆記

這部分沒啥好講的。點可以使用座標表示,向量可以使用點表示。這裡記錄一些我知道的基礎知識。對於向量 a x,y 其長度記為 a sqrt 對於兩個向量 a x 1,y 1 b x 2,y 2 他們的叉積是 a times b x 1 cdot y 2 x 2 cdot y 1 叉積的絕對值還等於以這兩...