【Iced】core库Vector 结构体源码解析(vector.rs)
这是iced_core中定义的2D向量类型,用于表示位移、方向、速度等具有大小和方向的量。
🏗️ 结构体定义
/// 2D向量#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]pubstructVector<T=f32>{/// X分量pubx:T,/// Y分量puby:T,}关键特性
| 属性 | 说明 |
|---|---|
T = f32 | 默认使用f32类型 |
Debug | 支持调试输出 |
Clone, Copy | 支持复制(栈上拷贝) |
PartialEq, Eq | 支持相等比较 |
Default | 默认值为(0, 0) |
🛠️ 基础方法
impl<T>Vector<T>{/// 创建新的Vectorpubconstfnnew(x:T,y:T)->Self{Self{x,y}}}🎯 f32 特定实现
implVector{/// 零向量 (0, 0)pubconstZERO:Self=Self::new(0.0,0.0);/// 四舍五入向量分量pubfnround(self)->Self{Self{x:self.x.round(),y:self.y.round(),}}}🔄 数学运算
1.取反运算
impl<T>std::ops::NegforVector<T>whereT:std::ops::Neg<Output=T>,{typeOutput=Self;fnneg(self)->Self::Output{Self::new(-self.x,-self.y)}}示例:
letv=Vector::new(5,3);letneg_v=-v;// Vector { x: -5, y: -3 }2.向量加法
impl<T>std::ops::AddforVector<T>whereT:std::ops::Add<Output=T>,{typeOutput=Self;fnadd(self,b:Self)->Self{Self::new(self.x+b.x,self.y+b.y)}}impl<T>std::ops::AddAssignforVector<T>whereT:std::ops::AddAssign,{fnadd_assign(&mutself,b:Self){self.x+=b.x;self.y+=b.y;}}示例:
letv1=Vector::new(5,3);letv2=Vector::new(2,4);letsum=v1+v2;// Vector { x: 7, y: 7 }letmutv=Vector::new(1,1);v+=Vector::new(2,3);// v 变为 (3, 4)3.向量减法
impl<T>std::ops::SubforVector<T>whereT:std::ops::Sub<Output=T>,{typeOutput=Self;fnsub(self,b:Self)->Self{Self::new(self.x-b.x,self.y-b.y)}}impl<T>std::ops::SubAssignforVector<T>whereT:std::ops::SubAssign,{fnsub_assign(&mutself,b:Self){self.x-=b.x;self.y-=b.y;}}示例:
letv1=Vector::new(5,3);letv2=Vector::new(2,4);letdiff=v1-v2;// Vector { x: 3, y: -1 }4.标量乘法
impl<T>std::ops::Mul<T>forVector<T>whereT:std::ops::Mul<Output=T>+Copy,{typeOutput=Self;fnmul(self,scale:T)->Self{Self::new(self.x*scale,self.y*scale)}}impl<T>std::ops::MulAssign<T>forVector<T>whereT:std::ops::MulAssign+Copy,{fnmul_assign(&mutself,scale:T){self.x*=scale;self.y*=scale;}}示例:
letv=Vector::new(5,3);letscaled=v*2.0;// Vector { x: 10, y: 6 }letmutv=Vector::new(2,3);v*=3;// v 变为 (6, 9)5.标量除法
impl<T>std::ops::Div<T>forVector<T>whereT:std::ops::Div<Output=T>+Copy,{typeOutput=Self;fndiv(self,scale:T)->Self{Self::new(self.x/scale,self.y/scale)}}impl<T>std::ops::DivAssign<T>forVector<T>whereT:std::ops::DivAssign+Copy,{fndiv_assign(&mutself,scale:T){self.x/=scale;self.y/=scale;}}示例:
letv=Vector::new(10,6);letdivided=v/2.0;// Vector { x: 5, y: 3 }letmutv=Vector::new(9,6);v/=3;// v 变为 (3, 2)🔄 类型转换
从数组创建
impl<T>From<[T;2]>forVector<T>{fnfrom([x,y]:[T;2])->Self{Self::new(x,y)}}示例:
letv=Vector::from([5,3]);// Vector { x: 5, y: 3 }转换为数组
impl<T>From<Vector<T>>for[T;2]whereT:Copy,{fnfrom(other:Vector<T>)->Self{[other.x,other.y]}}示例:
letv=Vector::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 | 位移/方向 | 向量 + 向量 = 新向量 |
点 - 点 = 向量 |
交互示例
letp1=Point::new(10,10);letp2=Point::new(3,4);letv=p1-p2;// Vector { x: 7, y: 6 }letp3=p2+v;// 回到 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 几何体系中的重要组成部分,为所有位移和方向相关操作提供了统一的抽象!
