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