【Iced】core库Vector 结构体源码解析(vector.rs)
这是iced_core中定义的2D向量类型用于表示位移、方向、速度等具有大小和方向的量。️ 结构体定义/// 2D向量#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]pubstructVectorTf32{/// X分量pubx:T,/// Y分量puby:T,}关键特性属性说明T f32默认使用f32类型Debug支持调试输出Clone, Copy支持复制栈上拷贝PartialEq, Eq支持相等比较Default默认值为(0, 0)️ 基础方法implTVectorT{/// 创建新的Vectorpubconstfnnew(x:T,y:T)-Self{Self{x,y}}} f32 特定实现implVector{/// 零向量 (0, 0)pubconstZERO:SelfSelf::new(0.0,0.0);/// 四舍五入向量分量pubfnround(self)-Self{Self{x:self.x.round(),y:self.y.round(),}}} 数学运算1.取反运算implTstd::ops::NegforVectorTwhereT:std::ops::NegOutputT,{typeOutputSelf;fnneg(self)-Self::Output{Self::new(-self.x,-self.y)}}示例letvVector::new(5,3);letneg_v-v;// Vector { x: -5, y: -3 }2.向量加法implTstd::ops::AddforVectorTwhereT:std::ops::AddOutputT,{typeOutputSelf;fnadd(self,b:Self)-Self{Self::new(self.xb.x,self.yb.y)}}implTstd::ops::AddAssignforVectorTwhereT:std::ops::AddAssign,{fnadd_assign(mutself,b:Self){self.xb.x;self.yb.y;}}示例letv1Vector::new(5,3);letv2Vector::new(2,4);letsumv1v2;// Vector { x: 7, y: 7 }letmutvVector::new(1,1);vVector::new(2,3);// v 变为 (3, 4)3.向量减法implTstd::ops::SubforVectorTwhereT:std::ops::SubOutputT,{typeOutputSelf;fnsub(self,b:Self)-Self{Self::new(self.x-b.x,self.y-b.y)}}implTstd::ops::SubAssignforVectorTwhereT:std::ops::SubAssign,{fnsub_assign(mutself,b:Self){self.x-b.x;self.y-b.y;}}示例letv1Vector::new(5,3);letv2Vector::new(2,4);letdiffv1-v2;// Vector { x: 3, y: -1 }4.标量乘法implTstd::ops::MulTforVectorTwhereT:std::ops::MulOutputTCopy,{typeOutputSelf;fnmul(self,scale:T)-Self{Self::new(self.x*scale,self.y*scale)}}implTstd::ops::MulAssignTforVectorTwhereT:std::ops::MulAssignCopy,{fnmul_assign(mutself,scale:T){self.x*scale;self.y*scale;}}示例letvVector::new(5,3);letscaledv*2.0;// Vector { x: 10, y: 6 }letmutvVector::new(2,3);v*3;// v 变为 (6, 9)5.标量除法implTstd::ops::DivTforVectorTwhereT:std::ops::DivOutputTCopy,{typeOutputSelf;fndiv(self,scale:T)-Self{Self::new(self.x/scale,self.y/scale)}}implTstd::ops::DivAssignTforVectorTwhereT:std::ops::DivAssignCopy,{fndiv_assign(mutself,scale:T){self.x/scale;self.y/scale;}}示例letvVector::new(10,6);letdividedv/2.0;// Vector { x: 5, y: 3 }letmutvVector::new(9,6);v/3;// v 变为 (3, 2) 类型转换从数组创建implTFrom[T;2]forVectorT{fnfrom([x,y]:[T;2])-Self{Self::new(x,y)}}示例letvVector::from([5,3]);// Vector { x: 5, y: 3 }转换为数组implTFromVectorTfor[T;2]whereT:Copy,{fnfrom(other:VectorT)-Self{[other.x,other.y]}}示例letvVector::new(5,3);letarray:[i32;2]v.into();// [5, 3] 功能总结操作类型运算符/方法数学意义示例构造new(),from()创建向量Vector::new(5, 3)常量ZERO零向量Vector::ZERO取反-反向向量-Vector::new(5, 3)→ (-5, -3)加法,向量合成v1 v2减法-,-向量差v1 - v2数乘*,*缩放v * 2.0数除/,/缩放v / 2.0舍入round()取整v.round()转换From/Into数组互转[5, 3].into() 向量 vs 点的区别类型含义变换行为Point位置点 向量 新点Vector位移/方向向量 向量 新向量点 - 点 向量交互示例letp1Point::new(10,10);letp2Point::new(3,4);letvp1-p2;// Vector { x: 7, y: 6 }letp3p2v;// 回到 p1: Point { x: 10, y: 10 } 在 Iced 中的应用场景场景用途示例平移变换移动UI元素rectangle Vector::new(10, 0)动画插值位置过渡start_point (end_point - start_point) * t滚动偏移滚动视图scrollable.offset Vector::new(0, 10)速度/方向拖拽手势velocity displacement / time缩放中心缩放变换缩放后位置 原位置 (原位置 - 中心) * (缩放比 - 1) 设计亮点类型安全- 与Point类型区分避免混淆完备的运算符重载- 支持所有常见向量运算零成本抽象- 所有操作都是简单的数学计算泛型设计- 支持任意数值类型与几何体系集成- 与Point、Size等类型无缝协作这个Vector类型是 Iced 几何体系中的重要组成部分为所有位移和方向相关操作提供了统一的抽象
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418867.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!