【从头写CAD】 几何体类系列一 开篇

前不久,写了一个Point类,现在回过头来检查时,发现矩阵有5个特例,Point乘法运算仅重载了组合矩阵(M2D)、平移矩阵(Move)2个特例,对非切变矩阵(NonShear)、旋转矩阵(Rotate)、缩放矩阵(Scale)的乘法重载未实施。现补充完整,代码如下:

//5种矩阵的计算(组合矩阵M2D、非切变矩阵NonShear、旋转类Rotate、缩放类Scale、平移类Move)
impl Mul<M2D> for Point{
    type Output = Point;
    fn mul(self, tm:M2D) ->Point{//与组合矩阵M2D计算
        Point::new(self.m01 * tm.m11 + self.m02 * tm.m21 + tm.m01,self.m01 * tm.m12 + self.m02 * tm.m22 + tm.m02)
    }
}

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

impl Mul<Rotate> for Point{
    type Output = Point;
    fn mul(self, tm:Rotate) ->Point{//与旋转矩阵计算
        Point::new(self.m01 * tm.m11 + self.m02 * tm.m21 ,self.m01 * tm.m12 + self.m02 * tm.m22)
    }
}

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

impl Mul<Move> for Point{//与平移矩阵计算
    type Output = Point;
    fn mul(self, tm:Move) ->Point{
        Point::new(
            self.m01 + tm.m01,
            self.m02+ tm.m02
        )
    }
}

遗漏运算符重载代码本身不是大事,编译器发现问题时会报错,不影响程序的正常调试和运行。问题出在编写Point代码时转换矩阵仅实现了前2个特例,当时没有添加其它特例乘法运算的条件。如今,这5个特例也不是矩阵的最终形态,比如常量 -1 的引入会出现更多矩阵特例。这些特例不仅要求在Point类中补充乘法重载,几何体的其它类,如线段(Line)、圆(Circle)等同样需要补充重载。每个重载都有相应的计算公式,靠手工输入也存在录入错误不能及时发现的风险。有没有自动补充代码的可能性呢…

你可能感兴趣的:(rust,从头写CAD历程篇,rust,从头写CAD精华篇,rust,后端,矩阵)