【从头写CAD】 转换矩阵类系列七,缩放矩阵类

变换矩阵包含组合矩阵、平移矩阵、旋转矩阵、非切变矩阵及缩放矩阵,这是变换矩阵的最后一个类。

/*
* 矩阵基本变换,缩放类Scale
** 编制人: $ource
* 修改版次及创建时间:0版完成版(2024年8月26日)
* 修改内容及时间:无
* 待完善问题:无
* 内容说明:缩放是矩阵基本功能,实现了“组合矩阵*缩放矩阵”、“平移矩阵*缩放矩阵”、“旋转矩阵*缩放矩阵”、“非切变矩阵*缩放矩阵”、“缩放矩阵*缩放矩阵”、“缩放矩阵*组合矩阵”、“缩放矩阵*平移矩阵”、“缩放矩阵*旋转矩阵”、“缩放矩阵*非切变矩阵”的运算符重载。缩放矩阵格式如下。
       1      0      0
       0      Sx     0
       0      0      Sy
*/
pub type Scale=Matrix<Zero,Zero,f64,Zero,Zero,f64>;
impl Scale{
    pub fn new(sx:f64,sy:f64)->Scale{
        Scale{
            m01:Zero{},  m02:Zero{},
            m11:sx    , m12:Zero{},
            m21:Zero{}, m22:sy
        }
    }

    pub fn from(scale:f64)->Scale{
        Scale::new(scale,scale)
    }
}

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<Scale> for Move{//平移矩阵*缩放矩阵
    type Output = NonShear;
    fn mul(self, tm:Scale) ->NonShear{
        NonShear::new(self.m01 * tm.m11,self.m02 * tm.m22,tm.m11,tm.m22)
    }
}

impl Mul<Scale> for Rotate{//旋转矩阵*缩放矩阵
    type Output = Rotate;
    fn mul(self, tm:Scale) ->Rotate{
        Rotate::new(
            self.m11 * tm.m11, self.m12 * tm.m22,
            self.m21 * tm.m11,self.m22 * tm.m22
        )
    }
}

impl Mul<Scale> for NonShear{//非切变矩阵*缩放矩阵
    type Output = NonShear;
    fn mul(self, tm:Scale) ->NonShear{
        NonShear::new(self.m01 * tm.m11,self.m02 * tm.m22,
                      self.m11 * tm.m11
                                       ,self.m22 * tm.m22
        )
    }
}

impl Mul<Scale> for Scale{//缩放矩阵*缩放矩阵
    type Output = Scale;
    fn mul(self, tm:Scale) ->Scale{
        Scale::new(self.m11 * tm.m11, self.m22 * tm.m22)
    }
}

impl Mul<M2D> for Scale{//缩放矩阵*组合矩阵
    type Output = M2D;
    fn mul(self, tm:M2D) ->M2D{
        M2D{
            m01:tm.m01           , m02:tm.m02,
            m11:self.m11 * tm.m11, m12:self.m11 * tm.m12,
            m21:self.m22 * tm.m21,m22:self.m22 * tm.m22
        }
    }
}

impl Mul<Move> for Scale{//缩放矩阵*平移矩阵
    type Output = NonShear;
    fn mul(self, tm:Move) ->NonShear{
        NonShear::new(tm.m01,tm.m02,self.m11,self.m22)
    }
}

impl Mul<Rotate> for Scale{//缩放矩阵*旋转矩阵
    type Output = Rotate;
    fn mul(self, tm:Rotate) ->Rotate{
        Rotate::new(self.m11+tm.m11, self.m11*tm.m12, self.m22*tm.m21, self.m22*tm.m22)
    }
}

impl Mul<NonShear> for Scale{//缩放矩阵*非切变矩阵
    type Output = NonShear;
    fn mul(self, tm:NonShear) ->NonShear{
        NonShear::new(tm.m01           , tm.m02,
                      self.m11 * tm.m11
                                       ,self.m22 * tm.m22
        )
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值