有一个遗留的问题,就是转换矩阵特例现在是5个,今后可能会增加,增加的结果是很多类,包括线段(Line)、圆(Circle)等几何实体类都需要补充代码。这不符合编程“松耦合”的原则,即各模块应该是高度独立的,与其它模块的依赖程度越小越好。我观察了一下矩阵类特例的定义代码,与Point类有相似的代码格式。样例代码如下
/*
* 矩阵基本变换,组合矩阵类 M2D
** 编制人: $ource
* 修改版次及创建时间:0版完成版(2024年8月25日)
* 修改内容及时间:无
* 待完善问题:无
* 内容说明:组合矩阵是一个2X3 实数(f64)类型的矩阵,实现了“组合矩阵*组合矩阵”的乘法重载。矩阵格式如下
* 1 m01 m02
* 0 m11 m12
* 0 m21 m22
*/
pub type M2D=Matrix<f64,f64,f64,f64,f64,f64>;//1、结构体定义
impl M2D{
pub fn new(dx:f64,dy:f64,xx:f64,xy:f64,yx:f64,yy:f64)//2、new函数定义
M2D{
m01:dx, m02:dy,
m11:xx, m12:xy,
m21:yx, m22:yy
}
}
}
//3、本类与其它各类间乘法的重载
impl Mul<M2D> for M2D{//“组合矩阵*组合矩阵”
type Output = M2D;
fn mul(self, tm:M2D) ->M2D{
M2D{
m01:self.m01 * tm.m11 + self.m02 * tm.m21 + tm.m01,m02:self.m01 * tm.m12 + self.m02 * tm.m22 + tm.m02,
m11:self.m11 * tm.m11 + self.m12 * tm.m21 ,m12:self.m11 * tm.m12 + self.m12 * tm.m22,
m21:self.m21 * tm.m11 + self.m22 * tm.m21 ,m22:self.m21 * tm.m12 + self.m22 * tm.m22
}
}
}
impl Mul<NonShear> for M2D{//“组合矩阵*非切变矩阵”
type Output = M2D;
fn mul(self, tm:NonShear) ->M2D{
M2D{
m01:self.m01 * tm.m11 + tm.m01, m02:self.m02 * tm.m22 + tm.m02,
m11:self.m11 * tm.m11 , m12:self.m12 * tm.m22,
m21:self.m21 * tm.m11 , m22:self.m22 * tm.m22
}
}
}
impl Mul<Rotate> for M2D{//组合矩阵*旋转矩阵
type Output = M2D;
fn mul(self, tm:Rotate) ->M2D{
M2D{
m01:self.m01 * tm.m11 + self.m02 * tm.m21 ,m02:self.m01 * tm.m12 + self.m02 * tm.m22,
m11:self.m11 * tm.m11 + self.m12 * tm.m21 ,m12:self.m11 * tm.m12 + self.m12 * tm.m22,
m21:self.m21 * tm.m11 + self.m22 * tm.m21 ,m22:self.m21 * tm.m12 + self.m22 * tm.m22
}
}
}
impl Mul<Scale> for M2D{//组合矩阵*缩放矩阵
type Output = M2D;
fn mul(self, tm:Scale) ->M2D{
M2D{
m01:self.m01 * tm.m11, m02:self.m02 * tm.m22,
m11:self.m11 * tm.m11, m12:self.m12 * tm.m22,
m21:self.m21 * tm.m11, m22:self.m22 * tm.m22
}
}
}
impl Mul<Move> for M2D{//组合矩阵*平移矩阵
type Output = M2D;
fn mul(self, tm:Move) ->M2D{
M2D{
m01:self.m01 + tm.m01,m02:self.m02+ tm.m02,
m11:self.m11 ,m12:self.m12,
m21:self.m21 ,m22:self.m22
}
}
}
上面代码明显分成3块:
1、结构体定义;
2、新建函数new()的定义;
3、重载运算符:“本结构体*各矩阵特例”;
4、每个结构体可能会有自己独立的函数,可以单独书写。
根据这4条总结,我们可以使用宏来实现,宏函数如下:
shap!(
n
a
m
e
,
name,
name,dx,
d
y
,
dy,
dy,xx,
x
y
,
xy,
xy,yx,$yy)
1、
d
x
,
dx,
dx,dy,
x
x
,
xx,
xx,xy,
y
x
,
yx,
yx,yy为结构名称
2、后面6个参数为new变量的参数名,如果为常量1或0时,表示没有该参数。6个参数对应的结构体变量名固定为m01、m02、m11、m12、m21、m22。
3、乘法重载的返回类型通过计算获得,如果不是矩阵类型,自动报错。