【基本知識】
向量運算:
模長: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+
z1z
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
1z2
−y2
z1
,z1
x2−
x1z
2,x
1y2
−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 考慮如果有跨這條線的...