首页 > 其他分享 >【从头写CAD】 转换矩阵类系列一,总说明及泛型类

【从头写CAD】 转换矩阵类系列一,总说明及泛型类

时间:2024-08-26 15:26:36浏览次数:9  
标签:cos 转换 Matrix 缩放 及泛 矩阵 泛型 CAD

/*矩阵类编程思路总说明:
   平面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

相关文章

  • Qt+OpenCascade开发笔记(二):Qt引入occ库,搭建工程模板发布Demo
    前言  OpenCASCADE是由OpenCascadeSAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。  本篇描述搭建Qt开发occ环境过程。Demo  注意......
  • P7515 [省选联考 2021 A 卷] 矩阵游戏 题解
    DescriptionAlice有一个\(n\timesm\)的矩阵\(a_{i,j}\)(\(1\lei\len\),\(1\lej\lem\)),其每个元素为大小不超过\({10}^6\)的非负整数。Bob根据该矩阵生成了一个\((n-1)\times(m-1)\)的矩阵\(b_{i,j}\)(\(1\lei\len-1\),\(1\lej\lem-1\)),每个......
  • AI工具 GPT 学术优化 (GPT Academic) 安装实践
     GPT学术优化(GPTAcademic)是一个综合的AIGPT工具包,可以完成各种gpt辅助的工作,比如代码解读、翻译、读论文等功能。官网:GitHub-binary-husky/gpt_academic:为GPT/GLM等LLM大语言模型提供实用化交互接口,特别优化论文阅读/润色/写作体验,模块化设计,支持自定义快捷按钮&函......
  • Day06_0.1基础学习MATLAB学习小技巧总结(6)——矩阵运算篇
    利用暑假的时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......
  • 掌握CADMATIC许可状态,确保企业高效运营
    在当今高度竞争的工程设计和制造业领域,CADMATIC软件已成为企业不可或缺的工具。然而,要充分发挥其功能,确保软件的合法和高效使用至关重要。本文将为您揭示如何掌握CADMATIC许可状态,以确保企业高效运营。一、了解CADMATIC许可状态的重要性CADMATIC许可状态直接关系到企业的运营效......
  • Day03_0.1基础学习MATLAB学习小技巧总结(3)——矩阵的创建、引用和线性索引。
    利用暑假的时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以......
  • Day05_0.1基础学习MATLAB学习小技巧总结(5)——矩阵篇
    利用暑假的时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移......
  • 最新小红书矩阵批量起号玩全自动图文法,无脑操作轻松引流创业粉
    项目介绍:很多人对于引流觉得很难每天都在网上找各种各样的教程那么今天流量终结者来了小红书图文矩阵批量制作软件加小红书号商+流量回收渠道全都给你带来了这套玩法是我们一直以来自己使用的玩法相对其他引流方法这个是上量最快的也是玩法最简单的,这个软件可以给......
  • 代码随想录 -- 数组 -- 螺旋矩阵II
    59.螺旋矩阵II-力扣(LeetCode)每画一条边都要坚持一致的左闭右开注意处理n为奇数时的矩阵中心点classSolution(object):defgenerateMatrix(self,n):res=[[0]*nforainrange(n)]startX=0startY=0loop=mid=n/2c......