当前位置: 首页 > news >正文

【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)

🧠 设计亮点

  1. 类型安全- 与Point类型区分,避免混淆
  2. 完备的运算符重载- 支持所有常见向量运算
  3. 零成本抽象- 所有操作都是简单的数学计算
  4. 泛型设计- 支持任意数值类型
  5. 与几何体系集成- 与Point、Size等类型无缝协作

这个Vector类型是 Iced 几何体系中的重要组成部分,为所有位移和方向相关操作提供了统一的抽象!

http://www.cnnetsun.cn/news/1327425.html

相关文章:

  • 如何安装安卓Android Studio
  • 高斯分布意义及其表达式、方差和协方差
  • 探索考虑泊位优化与多能协同的港口综合能源系统运行优化
  • 剪映专业版教程:制作连续翻页相册效果
  • 1959. 【普及组模拟1】愤怒的牛(aggr.pas/c/cpp)
  • 全面盘点!2026年高口碑国产信创动环监控系统推荐榜单,助力打造智能化工厂安全管理新模式
  • 企业用智能体要投入多少成本?2026避坑指南与主流产品横评
  • 论语第十二篇-颜渊
  • AI获客必须知道这3家专业公司,千万别选错!
  • 千万注意!这家诚信轨道灯厂家,竟让客户排队抢购!
  • NJR-10线材扭转卷绕试验机
  • 十年网安老兵血泪教训:这行“一般人”慎入,三大扎心现实与一条窄路
  • redis缓存穿透、击穿、雪崩的区别
  • Spring面试必问核心知识点精讲
  • C++入门:从基础语法到核心实战
  • Spring AI重塑Java生态,企业级AI开发新纪元
  • KVM Web管理界面安装指南(Cockpit 方案)
  • RDP内核驱动:TdInputThread与IcaChannelInput解析
  • 2025大陆护照+港卡注册Stripe全攻略
  • 书匠策AI vs 传统问卷设计:一场科研效率与创意的革命性碰撞
  • Win11 → WSL2 → Ubuntu → OpenClaw大龙虾安装
  • 并行排序算法:加速大数据处理新利器
  • 别再埋头踩坑了!一位网安老手的核心技巧与“避坑”清单
  • Git实战:从入门到团队协作全攻略
  • 邀请函|鲁欧智造邀您共赴SEMICON China 2026
  • 关于comfyui自己编译xformers轮子文件并且安装
  • 30.Image Steganography隐写(实战+工具)
  • STP协议
  • 显示器坏点检测神器!163KB免安装,30秒揪出屏幕瑕疵
  • 智数魔方SRM,到底“夯”在哪?