【学Rust写CAD】23 渐变效果(gradient_source.rs)

源码

rust 复制代码
//color/gradient_source.rs
use super::spread::*;
use super::super::matrix::generic::*;
use super::super::matrix::point::*;
pub struct GradientSource {
    matrix: Matrix2D<Fixed>,
    lut: [u32; 256],
}

impl GradientSource {
    // 泛型化的 radial_gradient_eval
    pub fn radial_gradient_eval<S: Spread>(&self, x: u16, y: u16) -> u32 {
        let p = Point(x as i32,y as i32)*self.matrix;
        let px = p.x as f32;
        let py = p.y as f32;
        let mut distance = (px * px + py * py).sqrt() as i32;
        distance >>= 8;

        self.lut[S::apply(distance) as usize]
    }

    // 泛型化的 linear_gradient_eval
    pub fn linear_gradient_eval<S: SpreadBehavior>(&self, x: u16, y: u16) -> u32 {
        let p = Point(x,y)*self.matrix;
        let lx = p.x >> 8;

        self.lut[S::apply(lx) as usize]
    }
}

代码分析

这段代码定义了一个GradientSource结构体,用于处理渐变效果的计算。它提供了径向渐变和线性渐变的评估方法。

结构体定义
rust 复制代码
pub struct GradientSource {
    matrix: Matrix2D<Fixed>,  // 2D变换矩阵
    lut: [u32; 256],          // 256个元素的查找表(LUT)
}
  • matrix: 一个2D变换矩阵,用于坐标变换

  • lut: 一个包含256个u32值的查找表,存储颜色或渐变值

方法实现

  1. 径向渐变评估 (radial_gradient_eval)
rust 复制代码
pub fn radial_gradient_eval<S: Spread>(&self, x: u16, y: u16) -> u32 {
    let p = Point(x as i32,y as i32)*self.matrix;  // 应用变换矩阵
    let px = p.x as f32;
    let py = p.y as f32;
    let mut distance = (px * px + py * py).sqrt() as i32;  // 计算到原点的距离
    distance >>= 8;  // 右移8位,相当于除以256

    self.lut[S::apply(distance) as usize]  // 使用Spread特性处理距离并查找颜色
}

这个方法:

  1. 将输入坐标(x,y)转换为i32并应用变换矩阵

  2. 计算变换后点到原点的欧几里得距离

  3. 将距离值右移8位(相当于除以256)

  4. 使用Spread特性处理距离值

  5. 从查找表中返回对应的颜色值

  6. 线性渐变评估 (linear_gradient_eval)

rust 复制代码
pub fn linear_gradient_eval<S: SpreadBehavior>(&self, x: u16, y: u16) -> u32 {
    let p = Point(x,y)*self.matrix;  // 应用变换矩阵
    let lx = p.x >> 8;  // 只使用x坐标,右移8位

    self.lut[S::apply(lx) as usize]  // 使用SpreadBehavior特性处理x值并查找颜色
}

这个方法:

  1. 将输入坐标(x,y)应用变换矩阵

  2. 只使用变换后的x坐标,并右移8位

  3. 使用SpreadBehavior特性处理x值

  4. 从查找表中返回对应的颜色值

特性约束
  • radial_gradient_eval要求泛型参数S实现Spread特性

  • linear_gradient_eval要求泛型参数S实现SpreadBehavior特性

这些特性可能定义了如何处理渐变边界(如重复、反射或夹紧等行为)。

用途

这段代码用于图形渲染中实现渐变效果,通过查找表(LUT)和矩阵变换来高效计算任意位置的渐变颜色值。

相关推荐
大卫小东(Sheldon)21 小时前
Rust 推荐使用宏而非普通函数的场景
rust
doiito1 天前
【Agent Harness】为什么我把 JSON‑LD “编译成 DAG” 后,整个 Agent 平台立刻聪明了
ai·rust·架构设计·系统设计·ai agent
jump_jump1 天前
为了重玩金庸群侠传,我研究了一下 Ruffle 怎么复活 Flash
游戏·rust·github
星栈2 天前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
Rust研习社4 天前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
红尘散仙5 天前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
vivo互联网技术5 天前
从 Web 到桌面:基于 Tauri 2.0 + Vue 3 打造 vivo 线下门店「大头贴」拍照体验系统
前端·rust
Rust研习社5 天前
这 8 个 Rust 学习资源值得每个新手收藏起来
后端·rust·编程语言
星栈6 天前
10 分钟跑起第一个 Dioxus 应用:`dx` CLI、`rsx!` 和热更新好不好用
前端·rust·前端框架
望眼欲穿的程序猿6 天前
读取芯片内部温度传感器
嵌入式硬件·rust