这是 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)

🧠 设计亮点

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

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐