计算机图形学——二维坐标点的齐次矩阵变换(关于直线对称)
本文介绍了矩阵运算在平移、旋转和对称变换中的应用。首先定义了矩阵的基本概念及其乘法方法,接着通过齐次坐标表示点的位移。平移矩阵 M_1 用于在X轴和Y轴上移动点坐标。旋转矩阵 M_2 则利用极坐标推导得到,用于计算点的旋转后坐标。对称矩阵 M_3 描述了点关于X轴的对称。最后,通过平移、旋转和对称的组合,实现了点关于任意直线(y=mx+b)的对称点计算,得出了一系列矩阵变换公式和最终的坐标表达式。
前期知识
矩阵的乘法:左侧矩阵的iii行向量乘右侧矩阵的jjj列向量,依次对应,相乘后相加,得到的结果为矩阵第iii行,第jjj列的元素。
什么是齐次矩阵:行列相等。
矩阵的转置:行变列,列变行。角标TTT表示矩阵的转置。
简单的平移、旋转、对称
一个点的坐标为(x,y)(x,y)(x,y),使用矩阵中的列向量表示为M=(x,y,1)M=(x,y,1)M=(x,y,1)TTT。
- 平移
假设该点在X轴方向上移动dx距离,在Y轴方向上移动dy距离。
根据矩阵乘法的特点,可以写出2x2的平移矩阵为:M1=[10dx01dy001]M_{1}=\left[ \begin{array}{ll} 1&0&dx\\ 0&1&dy\\ 0&0&1 \end{array}\right]M1=
100010dxdy1
。
计算M1∗MM_{1}*MM1∗M为M′=[10dx01dy001]∗[xy1]=[x+dxy+dy1]M'=\left[ \begin{array}{ll} 1&0&dx\\ 0&1&dy\\ 0&0&1 \end{array}\right]*\left[ \begin{array}{ll} x\\ y\\ 1 \end{array}\right]=\left[ \begin{array}{ll} x+dx\\ y+dy\\1 \end{array}\right]M′= 100010dxdy1 ∗ xy1 = x+dxy+dy1
可得平移后的坐标为(x+dx,y+dy)(x+dx,y+dy)(x+dx,y+dy)。
- 旋转
旋转使用极坐标进行推导,得出2*2的旋转矩阵。ααα为点向量与X正半轴的夹角,θθθ为顺时针旋转的角度。
{x=rcos(α−θ)y=rsin(α−θ)⇒{x=rcosαcosθ+rsinαsinθy=rsinαcosθ−rcosαsinθ⇒{x=xcosθ+ysinθy=ycosθ−xsinθ\left\{ \begin{array}{ll} x=rcos(α-θ)\\ \\y=rsin(α-θ) \end{array}\right. \Rightarrow\left\{ \begin{array}{ll} x=rcosαcosθ+rsinαsinθ\\ \\ y=rsinαcosθ-rcosαsinθ \end{array}\right.\Rightarrow\left\{ \begin{array}{ll} x=xcosθ+ysinθ\\ \\ y=ycosθ-xsinθ \end{array}\right.⎩ ⎨ ⎧x=rcos(α−θ)y=rsin(α−θ)⇒⎩ ⎨ ⎧x=rcosαcosθ+rsinαsinθy=rsinαcosθ−rcosαsinθ⇒⎩ ⎨ ⎧x=xcosθ+ysinθy=ycosθ−xsinθ
根据推导出的公式,我们可以得到旋转矩阵为:M2=[cosθsinθ0−sinθcosθ0001]M_{2}=\left[ \begin{array}{ll} cosθ&sinθ&0\\ -sinθ&cosθ&0\\ 0&0&1 \end{array}\right]M2= cosθ−sinθ0sinθcosθ0001 。
计算M2∗MM_{2}*MM2∗M为M′=[cosθsinθ0−sinθcosθ0001]∗[xy1]=[xcosθ+ysinθ−xsinθ+ycosθ1]M'=\left[ \begin{array}{ll} cosθ&sinθ&0\\ -sinθ&cosθ&0\\ 0&0&1 \end{array}\right]*\left[ \begin{array}{ll} x\\ y\\ 1 \end{array}\right]=\left[ \begin{array}{ll} xcosθ+ysinθ\\ -xsinθ+ycosθ\\1 \end{array}\right]M′= cosθ−sinθ0sinθcosθ0001 ∗ xy1 = xcosθ+ysinθ−xsinθ+ycosθ1
可得旋转后的坐标为(xcosθ+ysinθ,−xsinθ+ycosθ)(xcosθ+ysinθ, -xsinθ+ycosθ)(xcosθ+ysinθ,−xsinθ+ycosθ)
3.对称
考虑一个点关于X轴对称,那么它的对称矩阵为:M3=[1000−10001]M_{3}=\left[ \begin{array}{ll} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{array}\right]M3=
1000−10001
进行矩阵运算M′=[1000−10001]∗[xy1]=[x−y1]M'=\left[ \begin{array}{ll} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{array}\right]*\left[ \begin{array}{ll} x\\ y\\ 1 \end{array}\right]=\left[ \begin{array}{ll} x\\ -y\\1 \end{array}\right]M′= 1000−10001 ∗ xy1 = x−y1
可得关于X轴对称的坐标为(x,−y)(x,-y)(x,−y)。
求点关于任意直线的对称点
设直线方程为y=mx+by=mx+by=mx+b。
我们考虑之前的平移、旋转、对称操作,这三个基本操作的组合运动其实可以完成关于任意直线的对称。
如果让直线与X轴重合,那么我们求点的对称将非常方便,那么继续考虑,如何让直线对于点来说是X轴呢?在y=mx+by=mx+by=mx+b中我们知道,直线在Y轴上距离原点的距离为bbb,因此我们先将点向下平移bbb,此时y=mx+by=mx+by=mx+b相对于X轴有个夹角θθθ,所以我们可以将点顺时针旋转θθθ,得到变换后的点关于X轴对称,然后将计算出的点,按照之前的动作,逆旋转、逆平移,最终的得到答案。
根据而我们的分析,得矩阵变换公式为:
M′=([10001b001]∗([cosθ−sinθ0sinθcosθ0001]∗([1000−10001]∗([cosθsinθ0−sinθcosθ0001]∗([10001−b001]∗[xy1]))))) M'= \left( \begin{array}{ll} \left[ \begin{array}{ll} 1&0&0\\ 0&1&b\\ 0&0&1 \end{array} \right]* \left( \begin{array}{ll} \left[ \begin{array}{ll} cosθ&-sinθ&0\\ sinθ&cosθ&0\\ 0&0&1 \end{array} \right]* \left( \begin{array}{ll} \left[ \begin{array}{ll} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{array} \right]* \left( \begin{array}{ll} \left[ \begin{array}{ll} cosθ&sinθ&0\\ -sinθ&cosθ&0\\ 0&0&1 \end{array} \right]* \left( \begin{array}{ll} \left[ \begin{array}{ll} 1&0&0\\ 0&1&-b\\ 0&0&1 \end{array} \right]* \left[ \begin{array}{ll} x\\ y\\ 1 \end{array} \right] \end{array} \right) \end{array} \right) \end{array} \right) \end{array} \right) \end{array} \right) M′= 1000100b1 ∗ cosθsinθ0−sinθcosθ0001 ∗ 1000−10001 ∗ cosθ−sinθ0sinθcosθ0001 ∗ 1000100−b1 ∗ xy1
按照括号依次计算
M0′=[xy−b1]M1′=[xcosθ+(y−b)sinθ−xsinθ+(y−b)cosθ1]M2′=[xcosθ+(y−b)sinθxsinθ−(y−b)cosθ1]M'_{0}=\left[ \begin{array}{ll} x\\ y-b\\ 1 \end{array} \right] M'_{1}=\left[ \begin{array}{ll} xcosθ+(y-b)sinθ\\ -xsinθ+(y-b)cosθ\\ 1 \end{array} \right]M'_{2}=\left[ \begin{array}{ll} xcosθ+(y-b)sinθ\\ xsinθ-(y-b)cosθ\\ 1 \end{array} \right]M0′= xy−b1 M1′= xcosθ+(y−b)sinθ−xsinθ+(y−b)cosθ1 M2′= xcosθ+(y−b)sinθxsinθ−(y−b)cosθ1
M3′=[x(1−2sin2θ)+2(y−b)sinθcosθ2xsinθcosθ+(y−b)(1−2cos2θ)1]M4′=[x(1−2sin2θ)+2(y−b)sinθcosθ2xsinθcosθ+(y−b)(1−2cos2θ)+b1]M'_{3}=\left[ \begin{array}{ll} x(1-2sin^2θ)+2(y-b)sinθcosθ\\ 2xsinθcosθ+(y-b)(1-2cos^2θ)\\ 1 \end{array} \right]M'_{4}=\left[ \begin{array}{ll} x(1-2sin^2θ)+2(y-b)sinθcosθ\\ 2xsinθcosθ+(y-b)(1-2cos^2θ)+b\\ 1 \end{array} \right]M3′= x(1−2sin2θ)+2(y−b)sinθcosθ2xsinθcosθ+(y−b)(1−2cos2θ)1 M4′= x(1−2sin2θ)+2(y−b)sinθcosθ2xsinθcosθ+(y−b)(1−2cos2θ)+b1
最终得到得坐标为(x(1−2sin2θ)+2(y−b)sinθcosθ,2xsinθcosθ+2(y−b)(1−2cos2θ)+b)(x(1-2sin^2θ)+2(y-b)sinθcosθ,2xsinθcosθ+2(y-b)(1-2cos^2θ)+b)(x(1−2sin2θ)+2(y−b)sinθcosθ,2xsinθcosθ+2(y−b)(1−2cos2θ)+b)
根据y=mx+by=mx+by=mx+b得sinθcosθ=m\frac{sinθ}{cosθ}=mcosθsinθ=m并且sin2θ+cos2θ=1sin^2θ+cos^2θ=1sin2θ+cos2θ=1,得出sin2θ=m2m2+1,cos2θ=1m2+1,sinθcosθ=mm2+1sin^2θ=\frac{m^2}{m^2+1},cos^2θ=\frac{1}{m^2+1},sinθcosθ=\frac{m}{m^2+1}sin2θ=m2+1m2,cos2θ=m2+11,sinθcosθ=m2+1m,带入结果得
坐标为(x1−m2m2+1+2(y−b)mm2+1,2xmm2+1+(y−b)m2−1m2+1+b)(x\frac{1-m^2}{m^2+1}+2(y-b)\frac{m}{m^2+1},2x\frac{m}{m^2+1}+(y-b)\frac{m^2-1}{m^2+1}+b)(xm2+11−m2+2(y−b)m2+1m,2xm2+1m+(y−b)m2+1m2−1+b)
得齐次反射矩阵
[1−m2m2+12mm2+1−2mbm2+12mm2+1m2−1m2+12bm2+1001] \left[ \begin{array}{ll} \frac{1-m^2}{m^2+1}&\frac{2m}{m^2+1}&-\frac{2mb}{m^2+1}\\ \frac{2m}{m^2+1}&\frac{m^2-1}{m^2+1}&\frac{2b}{m^2+1}\\ 0&0&1 \end{array} \right] m2+11−m2m2+12m0m2+12mm2+1m2−10−m2+12mbm2+12b1
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)