學習筆記 立體計算幾何

2021-09-28 21:31:19 字數 3322 閱讀 2889

【基本知識】

向量運算:

模長:len

=x2+

y2+z

2len=\sqrt

len=x2

+y2+

z2​加減:對應座標加減,結果為乙個向量;

點積:依舊定義為a

⃗\vec

a到b⃗

\vec

b的投影,計算方式為將對應座標相乘後相加,結果為乙個值。如

( x1

,y1,

z1)⋅

(x2,

y2,z

2)=x

1x2+

y1y2

+z1z

2(x_1,y_1,z_1) \cdot(x_2,y_2,z_2)=x_1x_2+y_1y_2+z_1z_2

(x1​,y

1​,z

1​)⋅

(x2​

,y2​

,z2​

)=x1

​x2​

+y1​

y2​+

z1​z

2​。叉積:**叉積的結果是乙個向量。**方向可用「右手定則」~~(瞎編的名字)~~確定:食指指向乙個向量,中指指向另乙個,大拇指與中指、食指所在平面垂直。則大拇指的方向即為叉積結果的方向。

座標計算:

( x1

,y1,

z1)×

(x2,

y2,z

2)=(

y1z2

−y2z

1,z1

x2−x

1z2,

x1y2

−x2y

1)(x_1,y_1,z_1) \times (x_2,y_2,z_2)=(y_1z_2-y_2z_1,z_1x_2-x_1z_2,x_1y_2-x_2y_1)

(x1​,y

1​,z

1​)×

(x2​

,y2​

,z2​

)=(y

1​z2

​−y2

​z1​

,z1​

x2​−

x1​z

2​,x

1​y2

​−x2

​y1​

)平面的法向量:見向量叉積的定義。

基本操作:

·判斷點d是否在平面abc內:求平面abc的法向量n

⃗\vec

n,若n⃗⋅

ad→=

0\vec \cdot \overrightarrow=0

n⋅ad=0

,則d ∈平

面abc

d \in 平面abc

d∈平面ab

c。點d到平面abc距離:由向量點積的定義:dis

=n⃗⋅

ad→∣

n⃗∣dis=\frac \cdot \overrightarrow}|}

dis=∣n

∣n⋅a

d​演算法(持續更新):

求凸包。

step1:擾動

將每乙個點的座標加/減乙個足夠小的隨機值,使其不會引起誤差,並能保證不會出現四點共面的情況。

step2:記錄平面

由於最多三點在乙個平面上,故通過記錄平面上的三個點記錄乙個平面。

step3:構造

假如我們構造出了乙個凸包。現在嘗試擴充套件。

我們從待選點中拿乙個出來,記為p

pp。從p

pp向凸包作射線。

不難發現,這若干條射線一定與凸包交於若干個稜上。

將可見面刪去,並將p

pp加入凸包。這樣,我們就完成了一次擴充套件。

為保證正確性,需要對每乙個平面判斷是否可見,故時間複雜度為o(n

2)o(n^2)

o(n2)。

判斷某個點是否可見:用平面的法向量與p到平面上的任意一點做點積。若結

0>0

>

0(即夾角為銳角),則該平面可見;反之不可見。

#include

using

namespace std;

const

int mn =

2005

;const

double eps =

1e-10

;double

rand()

double

reps()

struct point

double

len(

) point operator-(

const point b)

const;}

point operator*(

const point b)

const;}

double

operator&(

const point b)

const

}p[mn]

;struct surf

doubles(

)}f[mn]

, c[mn]

;int n, cnt, vis[mn]

[mn]

;int

check

(surf f, point pp)

inline

void

convey()

, f[

++cnt]

=(surf)

;for

(int i =

4, tmp =

0; i <= n; i++

)for

(int j =

1; j <= cnt; j++

)for

(int k =

0; k <

3; k++);

}for

(int j =

1; j <= tmp; j++

) f[j]

= c[j]

; cnt = tmp, tmp =0;

}}intmain()

學習筆記 計算幾何

高中數學必修二內容,基本理論見 oiwiki。先上 struct node node double x,double y void input node friend operator node a,node b double friend operator node a,node b 點積 dou...

計算幾何學習筆記

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

計算幾何學習筆記

計算幾何是什麼東西?能吃嗎?給定 n 個點 x i,yi 問 歐幾里得 距離最近的點對。如果用樸素的兩兩枚舉,需要o n2 的時間。考慮用分治法,先將點按照先 x 後 y排序。考慮對一段點 l r 的處理。在 放一根平行於y軸的線,其左邊的答案為a,右邊為b,設 min a,b 考慮如果有跨這條線的...