【从头写CAD】 转换矩阵类系列九,优化代码

有一个遗留的问题,就是转换矩阵特例现在是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, namedx, 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、乘法重载的返回类型通过计算获得,如果不是矩阵类型,自动报错。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值