1.向量
1.1向量加减法
(
x
1
,
y
1
)
→
+
(
x
2
,
y
2
)
→
=
(
x
1
+
x
2
,
y
1
+
y
2
)
→
\overrightarrow{(x_{1},y_{1})}+ \overrightarrow{(x_{2},y_{2})}= \overrightarrow{(x_{1}+x_{2},y_{1}+y_{2})}
(x1,y1)+(x2,y2)=(x1+x2,y1+y2)。
(
x
1
,
y
1
)
→
−
(
x
2
,
y
2
)
→
=
(
x
1
−
x
2
,
y
1
−
y
2
)
→
\overrightarrow{(x_{1},y_{1})}-\overrightarrow{(x_{2},y_{2})}=\overrightarrow{(x_{1}-x_{2},y_{1}-y_{2})}
(x1,y1)−(x2,y2)=(x1−x2,y1−y2)。
其中向量的加减法满足结合律和交换律,即:
a
→
+
b
→
+
c
→
=
a
→
+
c
→
+
b
→
\overrightarrow{a} +\overrightarrow{b}+\overrightarrow{c}=\overrightarrow{a}+\overrightarrow{c}+\overrightarrow{b}
a+b+c=a+c+b
a
→
+
b
→
+
c
→
=
a
→
+
(
b
→
+
c
→
)
\overrightarrow{a} +\overrightarrow{b}+\overrightarrow{c}=\overrightarrow{a}+(\overrightarrow{b}+\overrightarrow{c})
a+b+c=a+(b+c)
1.2点积
定义:
a
→
⋅
b
→
=
(
x
1
∗
x
2
+
y
1
∗
y
2
)
=
∣
a
∣
∣
b
∣
cos
θ
\overrightarrow{a} \cdot \overrightarrow{b}=(x_{1}*x_{2}+y_{1}*y_{2})=|a||b|\cos \theta
a⋅b=(x1∗x2+y1∗y2)=∣a∣∣b∣cosθ 。
证明:
如图,根据余弦定理可得:
c
2
=
a
2
+
b
2
−
2
∗
∣
a
∣
∣
b
∣
cos
θ
c^2=a^2+b^2-2*|a||b| \cos \theta
c2=a2+b2−2∗∣a∣∣b∣cosθ
又因为
c
→
=
b
→
−
a
→
\overrightarrow{c}=\overrightarrow{b}-\overrightarrow{a}
c=b−a。
将式子拆开:
(
b
−
a
)
2
=
a
2
+
b
2
−
2
∗
∣
a
∣
∣
b
∣
cos
θ
(b-a)^2=a^2+b^2-2*|a||b| \cos \theta
(b−a)2=a2+b2−2∗∣a∣∣b∣cosθ
a
2
+
b
2
−
2
∗
a
→
⋅
b
→
=
a
2
+
b
2
+
2
∗
∣
a
∣
∣
b
∣
cos
θ
a^2+b^2-2*\overrightarrow{a} \cdot \overrightarrow{b}=a^2+b^2+2*|a||b| \cos \theta
a2+b2−2∗a⋅b=a2+b2+2∗∣a∣∣b∣cosθ
即可得出:
a
→
⋅
b
→
=
∣
a
∣
∣
b
∣
cos
θ
\overrightarrow{a} \cdot \overrightarrow{b}=|a||b| \cos \theta
a⋅b=∣a∣∣b∣cosθ
(可用于求旋转角度)
1.3叉积
定义:
x
→
×
y
→
=
x
1
∗
y
2
−
x
2
∗
y
1
=
∣
x
∣
∣
y
∣
sin
θ
\overrightarrow{x} \times \overrightarrow{y}=x1*y2-x2*y1=|x||y| \sin \theta
x×y=x1∗y2−x2∗y1=∣x∣∣y∣sinθ
(在二维中是一个数,在三维上是一个法向量)。
对于任意的向量
a
a
a 都有:
a
×
0
=
0
×
a
=
0
a \times 0=0 \times a=0
a×0=0×a=0,
a
×
a
=
0
a \times a=0
a×a=0 。
叉积在二维平面上的几何意义:以向量
a
a
a 和向量
b
b
b 构成的平行四边形的面积。
(可用于求面积)
1.4向量旋转
向量
(
x
,
y
)
(x,y)
(x,y) 逆时针旋转
θ
\theta
θ ,变为
(
x
∗
cos
θ
−
y
∗
sin
θ
,
x
∗
sin
θ
+
y
∗
cos
θ
)
(x* \cos \theta-y* \sin \theta,x* \sin \theta+y* \cos \theta)
(x∗cosθ−y∗sinθ,x∗sinθ+y∗cosθ) 。
如图:
如图,设向量
a
a
a 与
x
x
x 轴夹角为
θ
\theta
θ ,向量
b
b
b 与 向量
a
a
a 的夹角为
α
\alpha
α ,且
∣
a
∣
=
∣
b
∣
=
l
|a|=|b|=l
∣a∣=∣b∣=l 。(可理解为向量
b
b
b 为向量
a
a
a 逆时针旋转
θ
\theta
θ 而得来)。
则:
b
→
=
(
l
cos
(
θ
+
α
)
,
l
sin
(
θ
+
α
)
)
\overrightarrow{b}=(l \cos(\theta + \alpha),l \sin (\theta + \alpha))
b=(lcos(θ+α),lsin(θ+α))
a
→
=
(
l
cos
θ
,
l
sin
θ
)
\overrightarrow{a}=(l \cos \theta,l \sin \theta)
a=(lcosθ,lsinθ)
利用三角函数的恒等变换将向量
b
b
b 改变形式:
b
=
(
l
(
cos
θ
cos
α
−
sin
θ
sin
α
)
,
l
(
sin
θ
cos
α
+
cos
θ
sin
α
)
)
b=(l (\cos \theta \cos \alpha- \sin \theta \sin \alpha),l(\sin \theta \cos \alpha + \cos \theta \sin \alpha))
b=(l(cosθcosα−sinθsinα),l(sinθcosα+cosθsinα))
b
=
(
l
cos
θ
cos
α
−
l
sin
θ
sin
α
,
l
sin
θ
cos
α
+
l
cos
θ
sin
α
)
b=(l \cos \theta \cos \alpha -l \sin \theta \sin \alpha ,l \sin \theta \cos \alpha + l \cos \theta \sin \alpha )
b=(lcosθcosα−lsinθsinα,lsinθcosα+lcosθsinα)
将坐标
(
x
,
y
)
(x,y)
(x,y) 代回:
b
=
(
x
cos
α
−
y
sin
α
,
x
sin
α
+
y
cos
α
)
b=(x \cos \alpha - y \sin \alpha ,x \sin \alpha +y \cos \alpha)
b=(xcosα−ysinα,xsinα+ycosα)
1.5多边形面积
定义:对于一个多边形的点,按照逆时针记为
p
1
p_{1}
p1 到
p
n
p_{n}
pn ,设一个点
O
O
O 为辅助点,设向量
v
i
=
p
i
−
O
v_{i}=p_{i}-O
vi=pi−O
则多边形的面积为:
S
=
1
2
∣
∑
i
=
1
n
v
i
×
v
(
i
m
o
d
n
)
+
1
∣
S= \frac12 |\sum_{i=1}^n v_{i} \times v_{(i\mod n)+1}|
S=21∣i=1∑nvi×v(imodn)+1∣
根据叉积的几何意义即可完成。
2.距离
2.1欧式距离
定义:点
A
A
A和点
B
B
B的直线距离,设点
A
A
A为
(
x
1
,
y
1
)
(x_{1},y_{1})
(x1,y1),点
B
B
B为
(
x
2
,
y
2
)
(x_{2},y_{2})
(x2,y2):
二维上:
∣
A
B
∣
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
|AB|=\sqrt{(x_{1}-x_{2})^2+(y_{1}-y_{2})^2}
∣AB∣=(x1−x2)2+(y1−y2)2
三维上:
∣
A
B
∣
=
(
x
1
−
x
2
)
2
+
(
y
1
−
y
2
)
2
+
(
z
1
−
z
2
)
2
|AB|=\sqrt{(x_{1}-x_{2})^2+(y_{1}-y_{2})^2+(z_{1}-z_{2})^2}
∣AB∣=(x1−x2)2+(y1−y2)2+(z1−z2)2
n
n
n 维上
∣
A
B
∣
=
∑
i
=
1
n
(
x
1
i
−
x
2
i
)
2
|AB|= \sqrt{\sum_{i=1}^n (x1_{i}-x2_{i})^2}
∣AB∣=i=1∑n(x1i−x2i)2
2.2曼哈顿距离
定义:设点
A
A
A 为
(
x
1
,
y
1
)
(x1,y1)
(x1,y1), 设点
B
B
B 为
(
x
2
,
y
2
)
(x2,y2)
(x2,y2) ,设
d
(
x
,
y
)
d(x,y)
d(x,y) 为点
x
x
x 到点
y
y
y 的曼哈顿距离,则:
d
(
x
,
y
)
=
∣
x
1
−
x
2
∣
+
∣
y
1
−
y
2
∣
d(x,y)=|x1-x2|+|y1-y2|
d(x,y)=∣x1−x2∣+∣y1−y2∣
性质:
1:非负性。
2:
d
(
i
,
i
)
=
0
d(i,i)=0
d(i,i)=0
3:对称性:
d
(
i
,
j
)
=
d
(
j
,
i
)
d(i,j)=d(j,i)
d(i,j)=d(j,i)
4:三角不等式:
d
(
i
,
j
)
≤
d
(
i
,
k
)
+
d
(
k
,
j
)
d(i,j) \le d(i,k)+d(k,j)
d(i,j)≤d(i,k)+d(k,j)
2.3切比雪夫距离
定义:设点
A
A
A 为
(
x
1
,
y
1
)
(x1,y1)
(x1,y1),设点
B
B
B 为
(
x
2
,
y
2
)
(x2,y2)
(x2,y2) ,则:
d
(
x
,
y
)
=
max
(
∣
x
1
−
x
2
∣
,
∣
y
1
−
y
2
∣
)
d(x,y)=\max(|x1-x2|,|y1-y2|)
d(x,y)=max(∣x1−x2∣,∣y1−y2∣)
2.4切比雪夫和曼哈顿的转换
设点
A
A
A 的坐标为
(
x
,
y
)
(x,y)
(x,y),则:
点
A
A
A 的曼哈顿距离为
∣
x
∣
+
∣
y
∣
|x|+|y|
∣x∣+∣y∣,即为
max
(
x
−
y
,
x
+
y
,
−
x
−
y
,
−
x
+
y
)
\max(x-y,x+y,-x-y,-x+y)
max(x−y,x+y,−x−y,−x+y)
其中
max
(
x
−
y
,
x
+
y
,
−
x
−
y
,
−
x
+
y
)
=
max
(
∣
x
+
y
∣
,
∣
x
−
y
∣
)
\max(x-y,x+y,-x-y,-x+y)=\max(|x+y|,|x-y|)
max(x−y,x+y,−x−y,−x+y)=max(∣x+y∣,∣x−y∣)
观察一下化简后的式子,发现其实就是点
(
x
+
y
,
x
−
y
)
(x+y,x-y)
(x+y,x−y) 的切比雪夫距离,即:
点
(
x
,
y
)
(x,y)
(x,y)的曼哈顿距离与点
(
x
+
y
,
x
−
y
)
(x+y,x-y)
(x+y,x−y)的切比雪夫距离相等。
再看看切比雪夫转化为曼哈顿的:
同样,点
A
A
A的切比雪夫距离为
max
(
∣
x
∣
,
∣
y
∣
)
\max(|x|,|y|)
max(∣x∣,∣y∣),尝试能否变换成
max
(
∣
a
+
b
∣
,
∣
a
−
b
∣
)
\max(|a+b|,|a-b|)
max(∣a+b∣,∣a−b∣)的形式,就能转换为点
(
a
,
b
)
(a,b)
(a,b)了!
可以发现:
x
=
x
+
y
2
+
x
−
y
2
x=\frac {x+y}{2}+\frac{x-y}{2}
x=2x+y+2x−y,
y
=
x
+
y
2
−
x
−
y
2
y=\frac {x+y}{2}-\frac {x-y}{2}
y=2x+y−2x−y
所以结论为:
点
(
x
,
y
)
(x,y)
(x,y)的切比雪夫距离与点
(
x
+
y
2
,
x
−
y
2
)
(\frac{x+y}{2},\frac{x-y}{2})
(2x+y,2x−y)的曼哈顿距离相等。
3.判断
3.1判断两线段是否相交
设有两条线段
P
1
P
2
P_{1}P_{2}
P1P2和
Q
1
Q
2
Q_{1}Q_{2}
Q1Q2,若两条线段相交,则向量
(
P
1
−
Q
1
)
(P_{1}-Q_{1})
(P1−Q1)(设为
a
a
a)和向量
(
P
2
−
Q
1
)
(P_{2}-Q_{1})
(P2−Q1) (设为
b
b
b)位于向量
(
Q
2
−
Q
1
)
(Q_{2}-Q_{1})
(Q2−Q1) (设为
c
c
c)的两侧,则从向量
c
c
c 旋转到向量
a
a
a 和旋转到
b
b
b 的方向是相反的,如图:
所以可以判断两条线段相交的必要条件为:
(
c
×
a
)
∗
(
c
×
b
)
<
0
(c \times a)*(c \times b) <0
(c×a)∗(c×b)<0
3.2判断点是否在多边形内
可以向左边作一条射线,通过判断出射线与多边形相交的点的个数,判断点是否在多边形内,若点数为奇数,则证明此点在多边形内部,否则在多边形外部。
但为了防止出现如与顶点相交,与边重合的情况,在此要声明:
1.若点在多边形边上,直接判断合法。
2.若点与多边形的其中一条边重合,只看作为
1
1
1 个点。
3.若点与多边形的顶点相交时,判断其是否为所属边的纵坐标的较大值,若是,则计数,否则忽略掉(防止凹边形影响答案)。
3.3判断线段是否在多边形内
1.先判断两个端点是否都在多边形内部,若有一个或以上不在,则证明不在。
2.记录下线段与多边形的交点,若线段上相邻的交点和端点的中点都在多边形内部,则证明合法。
3.4计算点到线段的距离最短的点
1.若线段平行与坐标轴:
作与线段对于直线的垂线,若垂足在线段上,输出垂足,否则输出线段端点与垂足距离较小的那个点。
2.若线段与坐标轴不平行:
求出线段对应的直线的解析式,求出垂线的斜率,根据点斜式,求出过点的垂直与线段对应的直线的垂足,若垂足在线段上,则输出垂足,否则输出线段端点和垂足距离较小的那个点的坐标
4.凸包
4.1凸包求解
算法:Graham扫描法
将左下的点移到原点,按照逆时针顺序将所有的点排序,然后按照用栈判断。
设栈顶点为
A
A
A ,栈顶下一层的点为
B
B
B, 当前枚举到的点为
C
C
C ,则若向量
A
B
AB
AB 旋转到向量
B
C
BC
BC 为顺时针或三点共线,则将点
A
A
A 弹出,直到符合条件为止。
则枚举完后栈中剩余的节点即为凸包的顶点。
4.2旋转卡壳
倘若要求凸包的直径:
每次枚举凸包的相邻的两个点
A
A
A,
B
B
B ,再枚举其他的点(设为点
C
C
C),可以根据叉积求出三角形
A
B
C
ABC
ABC 的面积,其中面积最大即为此点与线段
A
B
AB
AB 的直线距离最大。
我们发现面积都为先单增后单减,所以记录当前的答案,下次枚举相邻点时直接从当前答案枚举就可以了。
4.3半平面
定义:一条直线(线段)和直线(线段)左侧(右侧)的点集为半平面。
若一条直线的解析式为
A
x
+
B
y
+
C
=
0
Ax+By+C=0
Ax+By+C=0 ,则:
这条直线的左半平面为:
A
x
+
B
y
+
C
≥
0
Ax+By+C \ge 0
Ax+By+C≥0
这条直线的右半平面为:
A
x
+
B
y
+
C
≤
0
Ax+By+C \le 0
Ax+By+C≤0
4.4半平面交
定义:多个半平面的交集称为半平面交。
一般情况下,半平面交是有限的,多用于多个多边形的相交面积。
求半面交:S&I算法
1.将向量按极角排序。
2.可以证明,半平面交一定是一个凸多边形,所以要维护一个凸壳,每次加入一个向量,因为只会影响到先加入的边和最后加入的边,所以维护单调队列就可以了。
3.最后,根据三角剖分求凸包面积,即为交集的面积。
具体证明:https://oiwiki.org/geometry/half-plane/