0%

总结 计算几何基础

记录一些计算几何相关的知识。

推荐学习资料:wjyyy 的博客

向量

向量的长度,\(\vec{a}=(x,y),|\vec{a}|=\sqrt{x^2+y^2}\)

加减

几何意义为两个向量 \(\vec{a},\vec{b}\) (线段)首尾相接,\(\vec{a}\) 的头指向 \(\vec{b}\) 的尾即 \(\vec{a}+\vec{b}\)

对于 \(\vec{a}=(x_1,y_1),\vec{b}=(x_2,y_2)\)\(\vec{a}+\vec{b}=(x_1+y_1,x_2+y_2)\)

数乘

对向量缩放。对于 \(\vec{a}=(x,y)\)\(\lambda\vec{a}=(\lambda x,\lambda y)\)

点积(数量积、内积)

几何意义为向量 \(\vec{a}\) 在向量 \(\vec{b}\) 上的投影再乘上向量 \(\vec{b}\) 的模长。

点积是一个数量,设 \(\theta\)\(\vec{a},\vec{b}\) 的夹角,\(\vec{a}\cdot \vec{b}=|\vec{a}||\vec{b}|\cos\theta\)

对于 \(\vec{a}=(x_1,y_1),\vec{b}=(x_2,y_2)\)\(\vec{a}\cdot\vec{b}=x_1x_2+x_2y_2\)

点积满足交换律。

叉积(外积)

几何意义为两个向量平行四边形法围成的有向面积。

叉积是一个数量,设 \(\theta\)\(\vec{a},\vec{b}\) 的夹角,\(\vec{a}\cdot \vec{b}=|\vec{a}||\vec{b}|\sin\theta\)

对于 \(\vec{a}=(x_1,y_1),\vec{b}=(x_2,y_2)\)\(\vec{a}\cdot\vec{b}=x_1y_2-x_2y_1\)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct Vector {
double x, y;
Vector(const double &_x = 0, const double &_y = 0): x(_x), y(_y) {}
friend const Vector operator +(const Vector &a, const Vector &b) {
return Vector(a.x + b.x, a.y + b.y);
}
friend const Vector operator -(const Vector &a, const Vector &b) {
return Vector(a.x - b.x, a.y - b.y);
}
friend const Vector operator *(const Vector &a, const double &k) {
return Vector(a.x * k, a.y * k);
}
friend const Vector operator /(const Vector &a, const double &k) {
return Vector(a.x / k, a.y / k);
}
friend const double cross(const Vector &a, const Vector &b) {
return a.x * b.y - a.y * b.x;
}
friend const double dot(const Vector &a, const Vector &b) {
return a.x * b.x + a.y * b.y;
}
double len2() const {
return x * x + y * y;
}
double len() const {
return sqrt(len2());
}
Vector norm() const { // 求单位向量
return *this / len();
}
Vector rotate() const { // 顺时针旋转90度
return Vector(y, -x);
}
};