一些预置点函数
变换
相同坐标系下,由一个点到另一个点。
线性变换
给定一个
2
×
2
2\times 2
2×2的方阵
M
M
M,然后对点进行该变换。
p
′
=
M
p
p'=Mp
p′=Mp
直线对称
给定两个点 a , b a,b a,b定一条直线,然后找到点相对于该直线的对称点。
首先得到 a b → = b − a = ( x b − x a , y b − y a ) \overrightarrow{ab}=b-a=(x_b-x_a,y_b-y_a) ab=b−a=(xb−xa,yb−ya),由于对称与直线方向无关,取x轴分量 ≥ 0 \ge 0 ≥0的方向,得到新的向量 v → = ( d x , d y ) \overrightarrow{v}=(dx, dy) v=(dx,dy)。
-
如果 d x = 0 dx=0 dx=0,则关于y轴对称。
p ′ = ( 2 x a − x p , y p ) p'=(2x_a-x_p,y_p) p′=(2xa−xp,yp) -
如果 d y = 0 dy=0 dy=0,则关于x轴对称。
p ′ = ( x p , 2 y a − y p ) p'=(x_p,2y_a-y_p) p′=(xp,2ya−yp) -
否则,进行如下运算
首先计算该直线的方程,易得:
x d y − y d x + ( y a d x − x a d y ) = 0 xdy-ydx+(y_adx-x_ady)=0 xdy−ydx+(yadx−xady)=0
点到直线的距离为:
D = ∣ x p d y − y p d x + ( y a d x − x a d y ) ∣ d x 2 + d y 2 D=\frac{|x_pdy-y_pdx+(y_adx-x_ady)|}{\sqrt{dx^2+dy^2}} D=dx2+dy2∣xpdy−ypdx+(yadx−xady)∣
直线的垂直方向为:
- 点在直线上方,即 x p d y − y p d x + ( y a d x − x a d y ) < 0 x_pdy-y_pdx+(y_adx-x_ady)<0 xpdy−ypdx+(yadx−xady)<0,则为 ( 1 d y , − 1 d x ) (\frac{1}{dy}, -\frac{1}{dx}) (dy1,−dx1)
- 反之,则为 ( − 1 d y , 1 d x ) (-\frac{1}{dy}, \frac{1}{dx}) (−dy1,dx1)
新的点的位置:
x p ′ = x p ± 2 D 1 d y ( 1 d x ) 2 + ( 1 d x ) 2 = x p ± 2 d x ( x p d y − y p d x + ( y a d x − x a d y ) ) d x 2 + d y 2 y p ′ = y p ∓ 2 D 1 d x ( 1 d x ) 2 + ( 1 d x ) 2 = y p ∓ 2 d y ( x p d y − y p d x + ( y a d x − x a d y ) ) d x 2 + d y 2 \begin{array}{ll}x_{p'}&=x_p±2D\frac{\frac{1}{dy}}{\sqrt{(\frac{1}{dx})^2+(\frac{1}{dx})^2}}\\&=x_p±2\frac{dx(x_pdy-y_pdx+(y_adx-x_ady))}{dx^2+dy^2}&\end{array}\\\begin{array}{ll}y_{p'}&=y_p\mp2D\frac{\frac{1}{dx}}{\sqrt{(\frac{1}{dx})^2+(\frac{1}{dx})^2}}\\&=y_p\mp2\frac{dy(x_pdy-y_pdx+(y_adx-x_ady))}{dx^2+dy^2}&\end{array} xp′=xp±2D(dx1)2+(dx1)2dy1=xp±2dx2+dy2dx(xpdy−ypdx+(yadx−xady))yp′=yp∓2D(dx1)2+(dx1)2dx1=yp∓2dx2+dy2dy(xpdy−ypdx+(yadx−xady))
化简之,令 e = x p d y − y p d x + ( y a d x − x a d y ) e=x_pdy-y_pdx+(y_adx-x_ady) e=xpdy−ypdx+(yadx−xady),则:
p ′ = ( x p − 2 e d x d x 2 + d y 2 , y p + 2 e d y d x 2 + d y 2 ) p'=(x_p-2\frac{edx}{dx^2+dy^2}, y_p+2\frac{edy}{dx^2+dy^2}) p′=(xp−2dx2+dy2edx,yp+2dx2+dy2edy)
中心对称
给定一个对称中心点
c
c
c,找到点关于该点的对称点。
p
′
=
2
c
−
p
p'=2c-p
p′=2c−p
中心缩放
给定一个缩放中心点
c
c
c,找到点关于该点以缩放比为
λ
\lambda
λ的缩放后的点。
p
′
=
c
+
λ
(
p
−
c
)
p'=c+\lambda(p-c)
p′=c+λ(p−c)
中心旋转
将点相对旋转中心点 c c c顺时针旋转 θ \theta θ弧度。相当于进行如下线性变换:
M = ( cos θ sin θ − sin θ cos θ ) M=\left(\begin{matrix}\cos{\theta}&\sin{\theta}\\-\sin{\theta}&\cos{\theta}\end{matrix}\right) M=(cosθ−sinθsinθcosθ)
中心
相同坐标系下的若干个点,计算其某个中心。
几何中心
找到所有点的几何中心,通过算术平均。
p ′ = ( ∑ i n x i n , ∑ i n y i n ) p' = (\frac{\sum_i^n x_i}{n}, \frac{\sum_i^n y_i}{n}) p′=(n∑inxi,n∑inyi)
多边形质心
设所有点依次连接为封闭多边形,则可以算出其多边形质心。
A = 1 2 ∑ i = 0 n − 1 ( x i y i + 1 − x i + 1 y i ) p x = 1 6 A ∑ i = 0 n − 1 ( x i + x i + 1 ) ( x i y i + 1 − x i + 1 y i ) p y = 1 6 A ∑ i = 0 n − 1 ( y i + y i + 1 ) ( x i y i + 1 − x i + 1 y i ) A=\frac{1}{2}\sum_{i=0}^{n-1}(x_iy_{i+1}-x_{i+1}y_i)\\p_x = \frac{1}{6A}\sum_{i=0}^{n-1}(x_i+x_{i+1})(x_iy_{i+1}-x_{i+1}y_i)\\p_y = \frac{1}{6A}\sum_{i=0}^{n-1}(y_i+y_{i+1})(x_iy_{i+1}-x_{i+1}y_i) A=21i=0∑n−1(xiyi+1−xi+1yi)px=6A1i=0∑n−1(xi+xi+1)(xiyi+1−xi+1yi)py=6A1i=0∑n−1(yi+yi+1)(xiyi+1−xi+1yi)
力平衡点
给定一组点,以及点处施加的力的大小,计算最后的力平衡点。
通过迭代的方式,反复向合力方向移动 η i \eta_i ηi,其中 η i = l o s s ( η i − 1 ) \eta_i=loss(\eta_{i-1}) ηi=loss(ηi−1)。当某次迭代中求出的合力小于 1 e − 4 1e^{-4} 1e−4时停止。
坐标系转换
将点从它所在的坐标系转换为另一个坐标系。详见《几种坐标系定义与坐标系转换》。