欢迎光临
我们一直在努力

【Iced】core库Vector 结构体源码解析(vector.rs)

这是 iced_core 中定义的 2D向量 类型,用于表示位移、方向、速度等具有大小和方向的量。

🏗️ 结构体定义

/// 2D向量
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Vector<T = f32> {
/// X分量
pub x: T,
/// Y分量
pub y: T,
}

关键特性

属性说明
T = f32 默认使用 f32 类型
Debug 支持调试输出
Clone, Copy 支持复制(栈上拷贝)
PartialEq, Eq 支持相等比较
Default 默认值为(0, 0)

🛠️ 基础方法

impl<T> Vector<T> {
/// 创建新的Vector
pub const fn new(x: T, y: T) -> Self {
Self { x, y }
}
}


🎯 f32 特定实现

impl Vector {
/// 零向量 (0, 0)
pub const ZERO: Self = Self::new(0.0, 0.0);

/// 四舍五入向量分量
pub fn round(self) -> Self {
Self {
x: self.x.round(),
y: self.y.round(),
}
}
}


🔄 数学运算

1. 取反运算

impl<T> std::ops::Neg for Vector<T>
where
T: std::ops::Neg<Output = T>,
{
type Output = Self;

fn neg(self) -> Self::Output {
Self::new(–self.x, –self.y)
}
}

示例:

let v = Vector::new(5, 3);
let neg_v = –v; // Vector { x: -5, y: -3 }

2. 向量加法

impl<T> std::ops::Add for Vector<T>
where
T: std::ops::Add<Output = T>,
{
type Output = Self;

fn add(self, b: Self) -> Self {
Self::new(self.x + b.x, self.y + b.y)
}
}

impl<T> std::ops::AddAssign for Vector<T>
where
T: std::ops::AddAssign,
{
fn add_assign(&mut self, b: Self) {
self.x += b.x;
self.y += b.y;
}
}

示例:

let v1 = Vector::new(5, 3);
let v2 = Vector::new(2, 4);
let sum = v1 + v2; // Vector { x: 7, y: 7 }

let mut v = Vector::new(1, 1);
v += Vector::new(2, 3); // v 变为 (3, 4)

3. 向量减法

impl<T> std::ops::Sub for Vector<T>
where
T: std::ops::Sub<Output = T>,
{
type Output = Self;

fn sub(self, b: Self) -> Self {
Self::new(self.x – b.x, self.y – b.y)
}
}

impl<T> std::ops::SubAssign for Vector<T>
where
T: std::ops::SubAssign,
{
fn sub_assign(&mut self, b: Self) {
self.x -= b.x;
self.y -= b.y;
}
}

示例:

let v1 = Vector::new(5, 3);
let v2 = Vector::new(2, 4);
let diff = v1 – v2; // Vector { x: 3, y: -1 }

4. 标量乘法

impl<T> std::ops::Mul<T> for Vector<T>
where
T: std::ops::Mul<Output = T> + Copy,
{
type Output = Self;

fn mul(self, scale: T) -> Self {
Self::new(self.x * scale, self.y * scale)
}
}

impl<T> std::ops::MulAssign<T> for Vector<T>
where
T: std::ops::MulAssign + Copy,
{
fn mul_assign(&mut self, scale: T) {
self.x *= scale;
self.y *= scale;
}
}

示例:

let v = Vector::new(5, 3);
let scaled = v * 2.0; // Vector { x: 10, y: 6 }

let mut v = Vector::new(2, 3);
v *= 3; // v 变为 (6, 9)

5. 标量除法

impl<T> std::ops::Div<T> for Vector<T>
where
T: std::ops::Div<Output = T> + Copy,
{
type Output = Self;

fn div(self, scale: T) -> Self {
Self::new(self.x / scale, self.y / scale)
}
}

impl<T> std::ops::DivAssign<T> for Vector<T>
where
T: std::ops::DivAssign + Copy,
{
fn div_assign(&mut self, scale: T) {
self.x /= scale;
self.y /= scale;
}
}

示例:

let v = Vector::new(10, 6);
let divided = v / 2.0; // Vector { x: 5, y: 3 }

let mut v = Vector::new(9, 6);
v /= 3; // v 变为 (3, 2)


🔄 类型转换

从数组创建

impl<T> From<[T; 2]> for Vector<T> {
fn from([x, y]: [T; 2]) -> Self {
Self::new(x, y)
}
}

示例:

let v = Vector::from([5, 3]); // Vector { x: 5, y: 3 }

转换为数组

impl<T> From<Vector<T>> for [T; 2]
where
T: Copy,
{
fn from(other: Vector<T>) -> Self {
[other.x, other.y]
}
}

示例:

let v = Vector::new(5, 3);
let array: [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 位移/方向 向量 + 向量 = 新向量
点 – 点 = 向量

交互示例

let p1 = Point::new(10, 10);
let p2 = Point::new(3, 4);
let v = p1 – p2; // Vector { x: 7, y: 6 }

let p3 = 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 几何体系中的重要组成部分,为所有位移和方向相关操作提供了统一的抽象!

    赞(0)
    未经允许不得转载:171主机测评 » 【Iced】core库Vector 结构体源码解析(vector.rs)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址