【SDU Chart Team - Core】一些预置点函数

一些预置点函数

变换

相同坐标系下,由一个点到另一个点。

线性变换

给定一个 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 =ba=(xbxa,ybya),由于对称与直线方向无关,取x轴分量 ≥ 0 \ge 0 0的方向,得到新的向量 v → = ( d x , d y ) \overrightarrow{v}=(dx, dy) v =(dx,dy)

  1. 如果 d x = 0 dx=0 dx=0,则关于y轴对称。
    p ′ = ( 2 x a − x p , y p ) p'=(2x_a-x_p,y_p) p=(2xaxp,yp)

  2. 如果 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,2yayp)

  3. 否则,进行如下运算

    首先计算该直线的方程,易得:

    x d y − y d x + ( y a d x − x a d y ) = 0 xdy-ydx+(y_adx-x_ady)=0 xdyydx+(yadxxady)=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 xpdyypdx+(yadxxady)

    直线的垂直方向为:

    1. 点在直线上方,即 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 xpdyypdx+(yadxxady)<0,则为 ( 1 d y , − 1 d x ) (\frac{1}{dy}, -\frac{1}{dx}) (dy1,dx1)
    2. 反之,则为 ( − 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)2 dy1=xp±2dx2+dy2dx(xpdyypdx+(yadxxady))yp=yp2D(dx1)2+(dx1)2 dx1=yp2dx2+dy2dy(xpdyypdx+(yadxxady))

    化简之,令 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=xpdyypdx+(yadxxady),则:

    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=(xp2dx2+dy2edx,yp+2dx2+dy2edy)

中心对称

给定一个对称中心点 c c c,找到点关于该点的对称点。
p ′ = 2 c − p p'=2c-p p=2cp

中心缩放

给定一个缩放中心点 c c c,找到点关于该点以缩放比为 λ \lambda λ的缩放后的点。
p ′ = c + λ ( p − c ) p'=c+\lambda(p-c) p=c+λ(pc)

中心旋转

将点相对旋转中心点 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=(ninxi,ninyi)

多边形质心

设所有点依次连接为封闭多边形,则可以算出其多边形质心。

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=0n1(xiyi+1xi+1yi)px=6A1i=0n1(xi+xi+1)(xiyi+1xi+1yi)py=6A1i=0n1(yi+yi+1)(xiyi+1xi+1yi)

力平衡点

给定一组点,以及点处施加的力的大小,计算最后的力平衡点。

通过迭代的方式,反复向合力方向移动 η i \eta_i ηi,其中 η i = l o s s ( η i − 1 ) \eta_i=loss(\eta_{i-1}) ηi=loss(ηi1)。当某次迭代中求出的合力小于 1 e − 4 1e^{-4} 1e4时停止。

坐标系转换

将点从它所在的坐标系转换为另一个坐标系。详见《几种坐标系定义与坐标系转换》。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值