计算几何专题笔记

7 篇文章 0 订阅
5 篇文章 0 订阅

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) =(x1x2,y1y2)
其中向量的加减法满足结合律和交换律,即:
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 =(x1x2+y1y2)=abcosθ
证明:
在这里插入图片描述
如图,根据余弦定理可得:
c 2 = a 2 + b 2 − 2 ∗ ∣ a ∣ ∣ b ∣ cos ⁡ θ c^2=a^2+b^2-2*|a||b| \cos \theta c2=a2+b22abcosθ
又因为 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 (ba)2=a2+b22abcosθ
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+b22a b =a2+b2+2abcosθ
即可得出: a → ⋅ b → = ∣ a ∣ ∣ b ∣ cos ⁡ θ \overrightarrow{a} \cdot \overrightarrow{b}=|a||b| \cos \theta a b =abcosθ
(可用于求旋转角度)

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 =x1y2x2y1=xysinθ
(在二维中是一个数,在三维上是一个法向量)。
对于任意的向量 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) (xcosθysinθ,xsinθ+ycosθ)
如图:在这里插入图片描述
如图,设向量 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=piO
则多边形的面积为:
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=21i=1nvi×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=(x1x2)2+(y1y2)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=(x1x2)2+(y1y2)2+(z1z2)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=1n(x1ix2i)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)=x1x2+y1y2
性质:
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(x1x2,y1y2)

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(xy,x+y,xy,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(xy,x+y,xy,x+y)=max(x+y,xy)
观察一下化简后的式子,发现其实就是点 ( x + y , x − y ) (x+y,x-y) (x+y,xy) 的切比雪夫距离,即:
( x , y ) (x,y) (x,y)的曼哈顿距离与点 ( x + y , x − y ) (x+y,x-y) (x+y,xy)的切比雪夫距离相等。

再看看切比雪夫转化为曼哈顿的:
同样,点 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,ab)的形式,就能转换为点 ( 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+2xy y = x + y 2 − x − y 2 y=\frac {x+y}{2}-\frac {x-y}{2} y=2x+y2xy
所以结论为:
( x , y ) (x,y) (x,y)的切比雪夫距离与点 ( x + y 2 , x − y 2 ) (\frac{x+y}{2},\frac{x-y}{2}) (2x+y,2xy)的曼哈顿距离相等。

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}) (P1Q1)(设为 a a a)和向量 ( P 2 − Q 1 ) (P_{2}-Q_{1}) (P2Q1) (设为 b b b)位于向量 ( Q 2 − Q 1 ) (Q_{2}-Q_{1}) (Q2Q1) (设为 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+C0
这条直线的右半平面为: A x + B y + C ≤ 0 Ax+By+C \le 0 Ax+By+C0

4.4半平面交
定义:多个半平面的交集称为半平面交。
一般情况下,半平面交是有限的,多用于多个多边形的相交面积。
求半面交:S&I算法
1.将向量按极角排序。
2.可以证明,半平面交一定是一个凸多边形,所以要维护一个凸壳,每次加入一个向量,因为只会影响到先加入的边和最后加入的边,所以维护单调队列就可以了。
3.最后,根据三角剖分求凸包面积,即为交集的面积。
具体证明:https://oiwiki.org/geometry/half-plane/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值