/*矩阵类编程思路总说明:
平面CAD对象主要包括点(point)、线(line 含线段、直线、射线,宽线、多段线)、平面形状(shap 含矩形、圆形、椭圆、文字、图块实体、外部参照实体及各种标注等)。我们先用点(point)来说明矩阵功能。
点(P),可以用向量(1,x, y)表示。
一、如果点发生平移时,转换矩阵(Move)为
1 Dx Dy
0 1 0
0 0 1
即P.move(Dx,Dy)=(x+Dx,y+Dy)=P*Move;
平移(Move)矩阵是本矩阵类(Matrix)的泛型特例,单独说明
二、如果点发生旋转时(旋转角度为a),转换矩阵Rotate为
1 0 0
0 cos(a) sin(a)
0 -sin(a) cos(a)
即P.rotation(a)=(x * cos(a) - y * sin(a),x * sin(a) + y *cos(a))=P*M;
旋转(Rotate)矩阵是本矩阵类(Matrix)的泛型特例,单独说明,为提高效率,角度类(Angle)参与矩阵乘法计算。
三、如果点发生缩放时,比例为(Sx,Sy),转换矩阵(Scale)为
1 0 0
0 Sx 0
0 0 Sy
即P.rotation(a)=(x * Sx,x * Sy)=P*Scale;
缩放(Scale)矩阵是本矩阵类(Matrix)的泛型特例,单独说明,为提高效率,实数(f64)参与矩阵乘法计算。
四、平移、旋转、缩放的组合矩阵(M2D)可以表示为
1 Dx Dy
0 Xx Xy
0 Yx Yy
即P.M=(1,x*Xx+y*Yx+1*Dx,x*Xy+y*Yy+1*Dy)=P*M2D;
组合(M2D)矩阵是本矩阵类(Matrix)的泛型特例,单独说明。
五、转换矩阵通过乘法运算的重载,实现其功能。该乘法支持结合律,如P*M1*M2*M3=P*(M1*M2*M3)
根据上面叙述,总结出如下编程思路:
1、平面几何转换,都可以使用转换矩阵实现,不需要在各几何体类中单独实现移动、旋转、缩放功能;
2、多次平面几何转换,如P*M1*M2*M3,可以使用结合律,让多个矩阵合并成一个转换矩阵。
3、考虑到纯平移、旋转或缩放转换用组合矩阵计算时,会出现大量已知的0或1参加计算,影响计算速度。因此定义了3个零大小的类Zero、One和NegOne用于表示0、1、-1,该定义在number.rs文件中实现。转换矩阵为泛型类,泛型定义在本文件实现,通过泛型特例实现的移动(Move)、旋转(Rotate)、缩放(Scale)、组合(M2D)等矩阵独立解说。
4、为了汇总几何体与转换矩阵的计算(如 P*M),方便系统维护,几何体类的参数写成矩阵格式。初步意向如下,后面单独解说。
(1)点(point)(x,y)可以认为是点(0,0)移动到(x,y)后形成的,即表示为:
1 x y
0 0 0
0 0 0
(2) 线段(line)有起点(x1,y1)和终点(x2,y2),可以认为是起点(0,0),终点为(1,0)的线段经过变换得来的,即:
1 x1 y1
0 x2-x1 y2-y1
0 0 0
(3) 圆有圆心(Ox,Oy)、半径r(等价于圆过点(Ox+r,Oy) ),可以理解为圆心在(0,0),半径为1(等价于圆过点(1,0))的单位圆变换过来的,即:
1 Ox Oy
0 r 0
0 0 0
(4) 椭圆有圆心(Ox,Oy)、长半轴长 Ra,短半轴长Rb,与圆类似,表示如下:
1 Ox Oy
0 Ra 0
0 0 Rb
(5) 图块实体有插入点(x,y),x轴比例Sx、y轴比例Sy、旋转角度a,表示如下:
Sx*cos(a) Sx*sin(a) 0
-Sy*sin(a) Sy*cos(a) 0
x y 1
*/
/*转换矩阵通用类Matrix
* 编制人: $ource
* 修改版次:0.2.0版完成版
* 本版次创建时间: 2024年8月16日
* 最后修改时间: 2024年8月26日
* 待完善问题:无
*/
pub mod number;
use number::*;
pub mod point;
use std::ops::{Mul,Div};
// 变换矩阵数据格式(TransformMatrix)
// 1 dx dy 1 Dx Dy 1 m01 m02
// 0 sx ry 0 Xx Xy 0 m11 m12
// 0 rx sy 0 Yx Yy 0 m21 m22
#[derive(Clone,Copy)]
pub struct Matrix<Tdx:Clone+Copy,Tdy:Clone+Copy,Txx:Clone+Copy,Txy:Clone+Copy,Tyx:Clone+Copy,Tyy:Clone+Copy>{
m01:Tdx,m02:Tdy,
m11:Txx,m12:Txy,
m21:Tyx, m22:Tyy
}
标签:cos,转换,Matrix,缩放,及泛,矩阵,泛型,CAD
From: https://blog.csdn.net/weixin_43219667/article/details/141463538