源码
//two_circle_radial_gradient.rs
//! 定义双圆径向渐变的结构体和相关功能
/// 表示一个双圆径向渐变的源
///
/// 该结构体描述了两个圆之间的渐变,支持矩阵变换和颜色查找表优化
#[derive(Debug, Clone, PartialEq)]
pub struct TwoCircleRadialGradientSource {
/// 应用于渐变的变换矩阵(使用固定点表示优化性能)
pub matrix: MatrixFixedPoint,
/// 第一个圆的圆心x坐标
pub c1x: f32,
/// 第一个圆的圆心y坐标
pub c1y: f32,
/// 第一个圆的半径
pub r1: f32,
/// 第二个圆的圆心x坐标
pub c2x: f32,
/// 第二个圆的圆心y坐标
pub c2y: f32,
/// 第二个圆的半径
pub r2: f32,
/// 颜色查找表(256个预计算的颜色值)
pub lut: [u32; 256],
}
代码分析
这个文件定义了一个双圆径向渐变的结构体和相关功能。下面是对代码的详细解释:
结构体定义
TwoCircleRadialGradientSource 结构体表示一个双圆径向渐变,包含以下字段:
-
matrix: 应用于渐变的2D变换矩阵,使用固定点(Fixed)表示优化性能
-
c1x, c1y: 第一个圆的圆心坐标
-
r1: 第一个圆的半径
-
c2x, c2y: 第二个圆的圆心坐标
-
r2: 第二个圆的半径
-
lut: 颜色查找表,包含256个预计算的颜色值(u32格式)
核心方法
eval<S: Spread> 方法用于计算给定坐标(x,y)处的颜色值:
- 坐标变换:首先将输入坐标通过变换矩阵进行变换
let p = Point2D(x as i32,y as i32)*self.matrix;
- 数学计算:基于两个圆之间的渐变定义进行计算
-
计算各种差值向量(cdx, cdy, pdx, pdy, dr)
-
计算二次方程的系数(a, b, c)
-
计算判别式(discr)
- 特殊情况处理:
-
当a=0时(线性情况),使用简化公式计算t值
-
当判别式<0时(无解),返回透明黑色(0)
- t值计算:
-
计算两个可能的解t1和t2
-
选择较大的那个解
- 颜色查找:
-
将t值映射到0-255范围
-
应用Spread模式(如重复、反射等)
-
从颜色查找表(lut)中获取最终颜色
数学原理
代码注释中解释了数学原理:渐变被定义为一系列圆的集合:
((1-t)·c₁ + t·(c₂), (1-t)·r₁ + t·r₂)
其中:
-
t ∈ [0,1]
-
排除半径<0的圆
这实际上描述了两个圆之间的过渡,包括圆心位置和半径的线性插值。
性能考虑
当前实现慢且不好,并参考了pixman的radial_get_scanline_narrow实现。未来可能有优化空间。
用途
这种双圆径向渐变可用于创建各种视觉效果,如锥形光照、球体效果等,是图形渲染中常用的渐变类型之一。