一、源码

这段代码定义了一个通用的2D仿射变换矩阵结构,可用于表示二维空间中的各种线性变换。

/// 通用2D仿射变换矩阵(元素仅需实现Copy trait)
///
/// 该矩阵可用于表示二维空间中的任意仿射变换,支持以下应用场景:
/// 1. 平面几何转换(平移/旋转/缩放/剪切)
/// 2. 颜色空间线性变换(如RGB到YUV转换)
/// 3. 带物理单位的量值转换(如像素到毫米的映射)
/// 4. 动画系统中的插值变换
///
/// 矩阵数学表示:
/// ┌           ┐
/// │ xx  xy  x │
/// │ yx  yy  y │
/// │ 0   0   1 │
/// └           ┘
///
/// 字段说明:
/// - x, y:  平移分量(translation),支持:
///   * 基本标量(f32/f64)
///   * 带单位的量(如Length<T>)
///   * 动态变量(Var<T>)
///
/// - xx, xy, yx, yy: 线性变换分量,支持:
///   * 类型常量(编译时确定的转换因子)
///   * 运行时变量(通过Var<T>包装)
///   * 单位化量(如角度、比例系数等)
///
/// 特性:
/// - 轻量:所有字段只需实现Copy trait
/// - 类型安全:支持泛型参数指定不同计算精度
/// - 可组合:可通过矩阵乘法组合多个变换
///
/// 示例:
/// ```
/// // 创建平移矩阵
/// let translate = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0);
///
/// // 创建缩放矩阵
/// let scale = Matrix::new(0.0, 0.0, 2.0, 0.0, 0.0, 3.0);
///
/// // 组合变换(先缩放后平移)
/// let transform = translate * scale;
/// ```
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {/// 水平平移分量pub x: X,/// 垂直平移分量pub y: Y,/// 水平轴向缩放和X到X的变换因子pub xx: Xx,/// X到Y轴的剪切/旋转因子pub xy: Xy,/// Y到X轴的剪切/旋转因子pub yx: Yx,/// 垂直轴向缩放和Y到Y的变换因子pub yy: Yy,
}impl<X, Y, Xx, Xy, Yx, Yy> Matrix<X, Y, Xx, Xy, Yx, Yy> {/// 构造一个新的2D仿射变换矩阵////// # 参数/// - `x`: 水平平移分量/// - `y`: 垂直平移分量/// - `xx`: X轴缩放和X到X变换因子/// - `xy`: X到Y轴的剪切/旋转因子/// - `yx`: Y到X轴的剪切/旋转因子/// - `yy`: Y轴缩放和Y到Y变换因子////// # 返回值/// 返回构建的2D仿射变换矩阵////// # 示例/// ```/// let identity = Matrix::new(0.0, 0.0, 1.0, 0.0, 0.0, 1.0);  // 单位矩阵/// let translated = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0);  // 平移矩阵/// ```pub fn new(x: X, y: Y, xx: Xx, xy: Xy, yx: Yx, yy: Yy) -> Self {Self { x, y, xx, xy, yx, yy }}
}

二、结构体定义

pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {pub x: X,    // 水平平移分量pub y: Y,    // 垂直平移分量pub xx: Xx,  // X轴缩放和X到X变换因子pub xy: Xy,  // X到Y轴的剪切/旋转因子pub yx: Yx,  // Y到X轴的剪切/旋转因子pub yy: Yy   // Y轴缩放和Y到Y变换因子
}

这是一个泛型结构体,使用6个类型参数分别表示矩阵的不同分量。这种设计使得矩阵可以支持不同类型的值(如f32/f64、带单位的量、动态变量等)。

三、数学表示

矩阵表示2D仿射变换,数学形式为:
[ x x x y x y x y y y 0 0 1 ] \begin{bmatrix}xx & xy & x \\ yx & yy & y \\ 0 & 0 & 1 \end{bmatrix} xxyx0xyyy0xy1

这是一个3x3的齐次坐标矩阵,用于表示二维空间中的各种线性变换。

四、特性

  1. 支持多种变换:
  • 平移(通过x, y分量)

  • 旋转/缩放/剪切(通过xx, xy, yx, yy分量)

  1. 泛型设计:
  • 支持不同类型的分量值

  • 类型安全,编译时检查

  1. 轻量级:
  • 所有字段只需实现Copy trait

  • 结构体本身也实现了Copy

  1. 可组合性:
  • 可以通过矩阵乘法组合多个变换

五、应用场景

  1. 平面几何转换(平移/旋转/缩放/剪切)

  2. 颜色空间线性变换(如RGB到YUV转换)

  3. 带物理单位的量值转换(如像素到毫米的映射)

  4. 动画系统中的插值变换

六、构造函数


pub fn new(x: X, y: Y, xx: Xx, xy: Xy, yx: Yx, yy: Yy) -> Self

创建一个新的2D仿射变换矩阵,参数对应矩阵的各个分量。

七、示例用法


// 创建平移矩阵
let translate = Matrix::new(10.0, 20.0, 1.0, 0.0, 0.0, 1.0);// 创建缩放矩阵
let scale = Matrix::new(0.0, 0.0, 2.0, 0.0, 0.0, 3.0);// 组合变换(先缩放后平移)
let transform = translate * scale;

这个设计提供了灵活且类型安全的2D变换表示,适用于各种图形和计算场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87210.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87210.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android RecyclerView隐藏整个Item后,该Item还占位留白问题

前言 android RecyclerView隐藏整个Item后,该Item还占位留白问题 思考了利用隐藏和现实来控制item 结果实现不了方案 解决方案 要依据 model 的第三个参数&#xff08;布尔值&#xff09;决定是否保留数据&#xff0c;可以通过 ​filter 高阶函数结合 ​空安全操作符​ 实…

地图瓦片介绍与地图瓦片编程下载

前沿 地图瓦片指将一定范围内的地图按照一定的尺寸和格式&#xff0c;按缩放级别或者比例尺&#xff0c;切成若干行和列的正方形栅格图片&#xff0c;对切片后的正方形栅格图片被形象的称为瓦片[。瓦片通常应用于B/S软件架构下&#xff0c;浏览器从服务器获取地图数据&#xf…

手机屏亮点缺陷修复及相关液晶线路激光修复原理

摘要 手机屏亮点缺陷严重影响显示品质&#xff0c;液晶线路短路、电压异常是导致亮点的关键因素。激光修复技术凭借高能量密度与精准操控性&#xff0c;可有效修复液晶线路故障&#xff0c;消除亮点缺陷。本文分析亮点缺陷成因&#xff0c;深入探究液晶线路激光修复原理、工艺…

MySQL数据一键同步至ClickHouse数据库

随着数据量的爆炸式增长和业务场景的多样化&#xff0c;传统数据库系统如MySQL虽然稳定可靠&#xff0c;但在海量数据分析场景下逐渐显露出性能瓶颈。这时&#xff0c;ClickHouse凭借其列式存储架构和卓越的OLAP&#xff08;在线分析处理&#xff09;能力脱颖而出&#xff0c;成…

Android中Compose常用组件以及布局使用方法

一、基础控件详解 1. Text - 文本控件 Text(text "Hello Compose", // 必填&#xff0c;显示文本color Color.Blue, // 文字颜色fontSize 24.sp, // 字体大小&#xff08;注意使用.sp单位&#xff09;fontStyle FontStyle.Italic, // 字体样式&…

SCI一区黑翅鸢优化算法+三模型光伏功率预测对比!BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测

SCI一区黑翅鸢优化算法三模型光伏功率预测对比&#xff01;BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测 目录 SCI一区黑翅鸢优化算法三模型光伏功率预测对比&#xff01;BKA-CNN-GRU、CNN-GRU、GRU三模型多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 …

创客匠人视角:创始人 IP 打造为何成为知识变现的核心竞争力

在互联网流量成本高企的当下&#xff0c;知识变现行业正经历从 “产品竞争” 到 “IP 竞争” 的范式迁移。创客匠人 CEO 老蒋指出&#xff0c;创始人 IP 已成为企业突破增长瓶颈的关键支点 —— 美特斯邦威创始人周成建首次直播即创下 1500 万元成交额&#xff0c;印证了创始人…

类图+案例+代码详解:软件设计模式----生成器模式(建造者模式)

生成器模式&#xff08;建造者模式&#xff09; 把复杂对象的建造过程和表示分离&#xff0c;让同样的建造过程可以创建不同的表示。 假设你去快餐店买汉堡&#xff0c;汉堡由面包、肉饼、蔬菜、酱料等部分组成。 建造者模式的角色类比&#xff1a; 产品&#xff08;Product…

UI前端与数字孪生融合探索:为智慧物流提供可视化解决方案

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在全球供应链数字化转型的浪潮中&#xff0c;智慧物流正从概念走向落地 —— 据 MarketsandMa…

远程办公与协作新趋势:从远程桌面、VDI到边缘计算,打造高效、安全的混合办公环境

一、引言 随着数字化转型的加速&#xff0c;越来越多的企业开始采用远程办公和混合办公模式&#xff0c;以提升员工的灵活性和企业的敏捷性。然而&#xff0c;异地办公也带来了诸如桌面环境不一致、安全风险增加、沟通协作效率降低等诸多挑战。因此&#xff0c;如何打造一致、…

算法总结篇:二叉树

二叉树解题整体框架&#xff1a; 1、确定当前题型是做高度还是深度还是搜索树还是其他 高度&#xff08;从下往上&#xff0c;求根深度、高度等&#xff09;&#xff1a; 使用后序遍历会更加简单&#xff0c;递归方法一般需要返回值返回上级&#xff0c;让上级对返回值进行判断…

【Elasticsearch】most_fields、best_fields、cross_fields 的区别与用法

most_fields、best_fields、cross_fields 的区别与用法 1.核心区别概述2.详细解析与用法2.1 best_fields&#xff08;最佳字段匹配&#xff09;2.2 most_fields&#xff08;多字段匹配&#xff09;2.3 cross_fields&#xff08;跨字段匹配&#xff09; 3.对比案例3.1 使用 best…

力扣网C语言编程题:在数组中查找目标值位置之暴力解法

一. 简介 本文记录一下力扣网上涉及数组的问题&#xff1a;排序数组中查找目标值的位置。主要以C语言实现。 二. 力扣网C语言编程题&#xff1a;在数组中查找目标值位置 题目&#xff1a;在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 …

OSCP - Proving Grounds - tre

主要知识点 突破边界的方法比较多样观察pspy64的检测结果 具体步骤 依旧nmap扫描开始,开放了80,8082,22端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 03:39 UTC Nmap scan report for 192.168.56.84 Host is up (0.00083s latency). Not shown: 65532 c…

【Mars3d】支持的basemaps数组与layers数组的坐标系列举

问题场景&#xff1a; basemap 是epsg4326的。&#xff0c;layer 图层是 epsg 4450的。可以在一个页面中展示吗&#xff1f; 回复&#xff1a; 可以不同坐标系叠加&#xff0c;但layer 图层是 epsg 4450的只支持arcgis动态服务&#xff0c;其他情况的不支持 wmts只支持3个坐标…

【算法】509. 斐波那契数

509. 斐波那契数 简单 相关标签 premium lock icon 相关企业 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 …

FOC学习笔记(5)内嵌式电机与表贴式电机的区别

1. 引言 在现代电机设计中&#xff0c;永磁同步电机&#xff08;Permanent Magnet Synchronous Motor, PMSM&#xff09;因其高效率、高功率密度和优异的动态性能&#xff0c;在工业、新能源汽车、航空航天等领域得到广泛应用。根据永磁体在转子中的安装方式不同&#xff0c;永…

算法 按位运算

按位与&#xff08;Bitwise AND&#xff09;和按位异或&#xff08;Bitwise XOR&#xff09; 按位与&#xff08;&&#xff09; 按位与是对两个数的二进制表示的每一位进行逻辑与操作。 规则&#xff1a;两个对应位都为1时&#xff0c;结果位才为1&#xff0c;否则为0。…

python3GUI--基于PyQt5+SQLite3的网址审核系统(详细图文)

文章目录 一&#xff0e;前言二&#xff0e;相关知识1.PyQt52.sqlite3 三&#xff0e;效果预览1.登录2.注册3.普通用户身份权限4.管理员身份权限 三、技术讨论1.数据展示表格1. 更强的表现力和交互性&#xff08;前端功能丰富&#xff09;2. 数据处理效率更高&#xff08;支持大…

与后端现场联调mock数据

当我们后端在现场没办法连后端本地就可以使用mock数据&#xff0c;模拟后端返回数据。使用工具&#xff1a;apifox 一、安装好以后--新建接口 举个栗子&#xff1a; 我想建个接口http://123.123.123.123:8080/api/login 二、 新建期望&#xff0c;返回固定值&#xff0c;否则…