
学Rust写CAD
文章平均质量分 65
一边学习Rust一边开发CAD
liuyuan77
rust爱好人员
展开
-
【学Rust写CAD】39 over_in_in 函数(alpha256补充方法)
实现了公式:result = src * (self * clip) + dst * (256 - (self * clip * src_alpha))over_in_in 是 over_in 函数的扩展版本,增加了额外的裁剪 alpha 值 (clip) 参数,用于更精细地控制合成操作。这个函数特别适合需要多层 alpha 控制的复杂合成场景,如带遮罩的图形渲染或 UI 元素的渐进显示效果。考虑了源图像的 alpha 通道 (src.alpha_t())clip:额外的裁剪 alpha 值。原创 2025-04-09 00:15:00 · 619 阅读 · 0 评论 -
【学Rust写CAD】38 over_in 函数(alpha256补充方法)
这个函数实现了带alpha混合的"over"合成操作,即源图像(src)在目标图像(dst)上的合成,使用了一种优化的近似计算方法。基本遵循标准alpha合成公式:result = src * alpha + dst * (1 - src_alpha)这个函数是图形合成中的核心操作,其优化对渲染性能有重要影响,特别是在需要大量混合操作的场景下。使用除以256代替精确的除以255(因为除以256可以通过位运算快速实现)使用self作为额外的alpha因子来控制源的整体不透明度。原创 2025-04-08 10:25:44 · 439 阅读 · 0 评论 -
【学Rust写CAD】37 premultiply 函数(argb.rs补充方法)
div255(x) 是一个快速除以255的优化函数,因为 (x * a) / 255 是预乘的标准公式。这种预乘后的颜色格式称为"premultiplied alpha",广泛应用于图形渲染和图像处理中。这个函数实现了颜色预乘(premultiply)操作,主要用于图像处理中的alpha合成。当alpha=255时,预乘不会改变颜色值,所以直接返回原值可以节省计算。将ARGB颜色值的RGB通道乘以alpha通道值(即预乘alpha)如果alpha已经是255(完全不透明),则直接返回原值。原创 2025-04-08 09:53:26 · 441 阅读 · 0 评论 -
【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)
alpha_lerp 是一个高效的透明度混合函数,结合了 alpha_mul_256 和 lerp,适用于图形渲染、颜色混合等场景。它通过整数运算避免了浮点计算,同时保持较高的精度。原创 2025-04-07 16:00:47 · 924 阅读 · 0 评论 -
【学Rust写CAD】35 alpha_mul_256(alpha256.rs补充方法)
这个函数用高效的整数运算(乘法和位移)近似计算了 (value * alpha256) / 255,避免了昂贵的除法操作,适合性能敏感的图形计算场景。虽然结果可能有微小误差,但在大多数情况下可以接受。原创 2025-04-07 15:40:40 · 706 阅读 · 0 评论 -
【学Rust写CAD】34 精确 Alpha 混合函数(argb.rs补充方法)
这段代码实现了一个精确的 Alpha 混合(“over” 操作)函数,使用除以 255 的精确计算,并处理了超亮像素的饱和问题。使用 (x * a + 0x80) >> 8 近似 (x * a) / 255(带四舍五入)精确除法:使用 +0x80 技巧实现四舍五入的除以 255(而不是近似除以 256)0x80_00_80 是实现四舍五入除以255的技巧(相当于加0.5后取整)饱和处理:确保混合结果不会超过最大颜色值(255)饱和处理确保任何超过255的值会被截断为255。处理方式与红蓝通道相同。原创 2025-04-06 22:12:25 · 357 阅读 · 0 评论 -
【学Rust写CAD】33 近似 Alpha 混合函数(argb.rs补充方法)
这段代码实现了一个近似 Alpha 混合(“over” 操作)的函数,用于将一个半透明的颜色(self)覆盖在目标颜色(dst)之上。rb = (dst.rb() * a) >> 8:对红蓝通道分量进行乘法并右移(近似除以 256)ag = dst.ag() * a:对 Alpha 和绿通道分量进行乘法(注意这里没有右移)使用除以 256 的近似方法(通过右移 8 位实现)而不是更精确的除以 255。dst:目标颜色(带 Alpha 通道的 ARGB 颜色)最后将源颜色与处理后的目标颜色组合起来。原创 2025-04-06 21:52:40 · 325 阅读 · 0 评论 -
【学Rust写CAD】32 div255函数(div255.rs)
这个函数通过移位和加法高效地近似计算 a / 255 并四舍五入,避免了昂贵的除法运算,是一种经典的位操作优化方法。原创 2025-04-05 21:59:59 · 350 阅读 · 0 评论 -
【学Rust写CAD】31 muldiv255函数(muldiv255.rs,已经取消)
这个函数巧妙地利用移位和加法来近似计算 (a * b) / 255 并四舍五入,避免了昂贵的除法运算,是一种高效的位操作优化方法。原创 2025-04-05 21:48:12 · 609 阅读 · 0 评论 -
【学Rust写CAD】30 Argb结构乘Alpha256(Argb.rs 乘法重载)
例如,x & mask 得到 0x00RR00BB,(x >> 8) & mask 得到 0x00AA00GG。src_ag &!mask:保留 A 和 G 通道的高 8 位(0xAA00GG00)。x >> 8:右移 8 位,使 A 和 G 通道对齐到低位(0x00AA00GG)。src_rb & mask:保留 R 和 B 通道(0x00RR00BB)。用于提取 红色(R) 和 蓝色(B) 通道(0x00RR00BB 格式)。x & mask:提取 R 和 B 分量(0x00RR00BB)。原创 2025-04-04 20:33:48 · 486 阅读 · 0 评论 -
【学Rust写CAD】29 Alpha256结构体(alpha256.rs)
右移 8 位(>> 8)相当于除以 256,因此最终结果为 (prod * 257) / 65536 ≈ prod / 254.98(接近 prod / 255)。误差分析:对于 prod = 255 * 256,真实值为 256,而计算结果为 (65280 + 255) >> 8 = 255(误差 1/256)。prod + (prod >> 8) 近似于 prod * (1 + 1/256),即 prod * 257/256。self.0:范围 [1, 256] 的 alpha 值(由构造函数保证)。原创 2025-04-04 20:17:39 · 1272 阅读 · 0 评论 -
【学Rust写CAD】28 带 Alpha 通道的双线性插值函数(bilinear_interpolation_alpha.rs)
这个函数是前一个双线性插值函数的扩展版本,增加了对 Alpha 通道(透明度)的支持。这个函数适用于需要透明度混合的图像处理场景,如半透明图层叠加、渐变效果等。通过额外的 alpha 参数,可以灵活控制插值结果的透明度。alpha: 一个额外的透明度参数(Alpha256 类型),范围应该是 0-256,用于控制最终结果的透明度。Alpha 值范围是 0-256(而不是传统的 0-255),这可能是为了优化计算效率。仍然使用 wrapping 运算防止溢出。保持了高效的颜色通道分离处理方式。原创 2025-04-03 06:34:59 · 687 阅读 · 0 评论 -
【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
这个函数实现了双线性插值算法,用于在四个已知像素点(tl, tr, bl, br)之间插值计算一个新的像素值。将输入的distx和disty从BILINEAR_INTERPOLATION_BITS精度调整到4位精度(0-15)。hi: 处理绿色(低8位)和alpha(高8位)通道。br: 右下(bottom-right)像素值。lo: 处理蓝色(低8位)和红色(高8位)通道。bl: 左下(bottom-left)像素值。tr: 右上(top-right)像素值。tl: 左上(top-left)像素值。原创 2025-04-03 06:23:46 · 649 阅读 · 0 评论 -
【学Rust写CAD】26 图形像素获取(pixel_fetch.rs)
用途: 安全地获取图像像素,避免因越界访问导致 panic 或内存不安全。策略: 越界时返回最近的边界像素值(类似“边缘填充”效果)。适用场景: 图像处理中需要处理边界条件的操作(如卷积滤波、缩放等)。如果需要其他边界处理方式(如镜像、重复等),可以定义新的结构体并实现 PixelFetch trait。原创 2025-04-02 21:06:55 · 584 阅读 · 0 评论 -
【学Rust写CAD】25 变量类(variable.rs)
这段代码的主要目的是:定义一个通用的数值包装类型 Variable为包装类型实现基本算术运算支持 Fixed 类型与浮点数的混合运算这种设计常用于需要统一处理多种数值类型的场景,比如元素类型为泛型的矩阵计算等数学工具时。原创 2025-04-02 13:06:53 · 541 阅读 · 0 评论 -
【学Rust写CAD】24 扫描渐变(sweep_gradient.rs)
这段代码实现了扫描渐变效果,它通过计算每个像素相对于中心点的角度来确定其在渐变中的位置,然后从预计算的颜色查找表中获取对应的颜色值。这段代码实现了一个扫描渐变(Sweep Gradient)的数据结构和计算方法。扫描渐变是一种颜色沿着圆周方向渐变的着色效果。渐变可以定义为一系列圆的族 ((1-t)·c₁ + t·(c₂), (1-t)·r₁ + t·r₂),排除那些半径小于0的圆。颜色查找表(LUT)有256个条目,对应256种可能的渐变位置。使用 spread 方法处理超出范围的 t 值。原创 2025-04-01 15:25:28 · 467 阅读 · 0 评论 -
【学Rust写CAD】23 渐变效果(gradient_source.rs)
matrix: Matrix2D<Fixed>, // 2D变换矩阵lut: [u32;256], // 256个元素的查找表(LUT)matrix: 一个2D变换矩阵,用于坐标变换lut: 一个包含256个u32值的查找表,存储颜色或渐变值方法实现径向渐变评估 (radial_gradient_eval)// 应用变换矩阵// 计算到原点的距离// 右移8位,相当于除以256。原创 2025-04-01 13:26:59 · 447 阅读 · 0 评论 -
【学Rust写CAD】22 双圆径向渐变的结构体(two_circle_radial_gradient.rs)
这是一个用于表示双圆径向渐变的Rust结构体。一个固定点矩阵,用于对渐变应用变换(如旋转、缩放、平移等)pub关键字表示这个结构体是公开的,可以被其他模块使用。渐变从第一个圆(c1)开始,到第二个圆(c2)结束。可能支持非同心圆的渐变(因为两个圆心可以不同)可能用于存储预计算的渐变颜色值,优化性能。c1x: 第一个圆的圆心x坐标。c1y: 第一个圆的圆心y坐标。c2x: 第二个圆的圆心x坐标。c2y: 第二个圆的圆心y坐标。r1: 第一个圆的半径。r2: 第二个圆的半径。原创 2025-03-31 21:45:48 · 705 阅读 · 0 评论 -
【学Rust写CAD】21 2D 点(point.rs)
为 Point 自动派生了一些 trait:Debug(调试打印)、Clone(克隆)、Copy(拷贝语义)、PartialEq(部分相等比较)Matrix 的泛型参数表示这是一个 2D 变换矩阵,但只使用其平移部分(x, y),旋转和缩放部分固定为单位矩阵。这个 Point 类型适合在需要进行几何变换的场景中使用,因为它底层使用了矩阵表示,可以方便地与变换操作结合。new(x, y):创建一个新点,初始化矩阵的平移部分为 (x,y),其余部分为单位矩阵。从父模块导入了通用的 Matrix 类型。原创 2025-03-31 15:58:42 · 760 阅读 · 0 评论 -
【学Rust写CAD】20 平铺模式结构体(spread.rs)
这个 Spread 枚举定义了渐变超出定义区域时的扩展方式,通常用于处理渐变在边界之外的行为。原创 2025-03-30 05:24:54 · 437 阅读 · 0 评论 -
【学Rust写CAD】19 颜色渐变定义(gradient_stop.rs)
定义了一个名为 GradientStop 的公开结构体,包含两个字段:position: 一个公开的 32 位浮点数(f32),表示渐变停止点的位置(通常在 0.0 到 1.0 之间)color: 一个公开的 Color 类型,表示该位置的颜色。原创 2025-03-30 04:58:54 · 360 阅读 · 0 评论 -
【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)
Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed> - 使用 Matrix 泛型类型,并用 Fixed 类型填充了所有六个类型参数。这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPoint,它基于一个通用的 Matrix 类型。use crate::fixed::Fixed - 从当前 crate 的 fixed 模块导入 Fixed 类型。通过将所有参数都指定为 Fixed 类型,创建了一个专门用于定点数运算的矩阵类型。原创 2025-03-29 23:39:55 · 445 阅读 · 0 评论 -
【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)
pub ox: Ox, // x方向平移量pub oy: Oy, // y方向平移量pub xx: Xx, // x方向缩放和旋转分量pub xy: Xy, // x方向倾斜分量pub yx: Yx, // y方向倾斜分量pub yy: Yy, // y方向缩放和旋转分量| 1 0 0 |其中:ox 和 oy 是平移分量(位于第二列第一行和第三列第一行)xx 和 yy 是缩放和旋转分量(主对角线)xy 和 yx 是倾斜/剪切分量(非对角线)原创 2025-03-29 23:04:20 · 637 阅读 · 0 评论 -
【学Rust写CAD】16 0、1、-1代数单位元(constant.rs)
这段Rust代码定义了一个名为Zero的结构体,并为其实现了几个基本的算术运算 trait。PartialEq和Eq:允许进行相等比较(Zero == Zero)无论怎样相乘结果都是Zero(符合数学上0×0=0的规则)为Zero实现与自身的乘法运算(Zero * Zero)为Zero实现与任意类型T的乘法运算(Zero * T)为Zero实现与任意类型T的加法运算(Zero + T)结果总是返回右操作数rhs(符合数学上0+a=a的规则)结果总是Zero(符合数学上0×a=0的规则)原创 2025-03-28 09:03:31 · 581 阅读 · 0 评论 -
【学Rust写CAD】15 定点数实现(fixed.rs)
表示小数部分占用的位数使用16位表示小数部分,意味着有16位小数和16位整数(在i32中)用于双线性插值计算的精度位数通常设置为4或8位,决定了插值权重的精度。原创 2025-03-28 07:30:19 · 674 阅读 · 0 评论 -
【学Rust写CAD】14线性插值函数(加入Alpha256.rs)
这段代码实现了两个颜色之间的线性插值(linear interpolation),通常称为lerp。这是一种在两个值之间进行平滑过渡的技术,在这里用于颜色过渡。t: 插值系数,范围0-256(0=完全使用起始颜色,256=完全使用目标颜色)使用掩码0xff00ff来提取这些分量(因为颜色通常以ARGB格式存储)同时处理两个颜色分量(蓝色/红色和alpha/绿色),减少操作次数。结果会是紫色(0x800080),正好在红色和蓝色中间。计算目标颜色和起始颜色在各分量上的差值。将插值后的分量重新组合成最终颜色。原创 2025-03-27 20:22:47 · 622 阅读 · 0 评论 -
【学Rust写CAD】13 图像结构体(Image.rs)
Image.rs文件定义了一个名为 Image 的结构体,用于表示图像数据。这个属性自动为 Image 结构体实现了 Clone 和 Copy traitClone 允许通过 .clone() 方法创建副本Copy 表示类型可以通过简单的内存复制来复制(而不是移动语义)由于结构体包含一个引用字段 data,只有当引用的生命周期 'a 允许时,才能安全地实现这些 traitpub width: i32 - 公开的32位整数,表示图像的宽度(像素数)原创 2025-03-27 19:43:15 · 397 阅读 · 0 评论 -
【学Rust写CAD】12 颜色类(argb.rs)
颜色类。原创 2024-08-17 23:46:56 · 167 阅读 · 0 评论 -
【学Rust写CAD】11 2D CAD可用rust库
使用 Rust 开发 2D CAD 应用时,选择合适的库是关键。lyon简介: lyon 是一个用于 2D 图形渲染的 Rust 库,支持路径填充、描边、抗锯齿等功能。特点: 基于 GPU 加速的 2D 渲染,适合实现 CAD 中的几何图形绘制。用途: 用于绘制 2D 几何图形(如线条、圆弧、多边形等)。raqote简介: raqote 是一个纯 Rust 实现的 2D 图形库,支持路径绘制、渐变、图像合成等。特点: 轻量级,适合简单的 2D 绘图需求。原创 2025-03-23 10:38:18 · 726 阅读 · 0 评论 -
【学Rust写CAD】10 加法器
【代码】【学Rust写CAD】10 加法器。原创 2025-03-04 22:05:25 · 264 阅读 · 0 评论 -
学Rust写CAD】9 变量类
FloatType trait 用于约束泛型类型 T,要求 T 必须实现 Mul、Add、Neg 和 Copy。为 f32 和 f64 显式实现了 FloatType,允许它们作为 Variable 中的类型 T 使用。Variable 结构体Variable 结构体是泛型的,T 必须实现 FloatType。它封装了一个类型为 T 的值。算术操作实现乘法 (Mul):为 Variable * Constant 和 Variable * Variable 实现了乘法。原创 2025-03-04 00:15:00 · 641 阅读 · 0 评论 -
【学Rust写CAD】8 常量类
常量的 Trait 定义ValidConstant:表示有效的常量(可以是零或非零)。NotZeroConstant:表示非零常量。GeneralConstant:表示特定范围内的常量(范围是 [-128, -2] 和 [2, 127])。实现 GeneralConstant使用宏 impl_general_constant_limit!为一系列整数值实现 GeneralConstant trait。原创 2025-03-03 06:00:00 · 330 阅读 · 0 评论 -
【学Rust写CAD】7 rust 常量泛型
Rust 的常量泛型(Const Generics)允许你在泛型中使用常量值作为参数。这一特性在 Rust 1.51 版本中稳定。通过常量泛型,你可以编写更灵活和通用的代码,尤其是在处理数组等固定大小的数据结构时。原创 2025-03-03 05:00:00 · 905 阅读 · 0 评论 -
【学Rust写CAD】6 三维转换矩阵及0 1 -1
【代码】【学Rust写CAD】6 三维转换矩阵及0 1 -1。原创 2025-02-18 23:41:30 · 109 阅读 · 0 评论 -
【学Rust写CAD】5 三维转换矩阵及其应用概述
三维转换矩阵是指将一个三维空间中的坐标系转换为另一个三维空间中的坐标系所需要的矩阵。在计算机图形学、计算机视觉等领域,三维转换矩阵是非常重要的基础知识。完整的三维转换矩阵为一个4x4的方阵。原创 2025-02-08 22:03:11 · 780 阅读 · 0 评论 -
【学Rust写CAD】4 相对坐标系(RCS)解析及应用
相对坐标系是依据绝对坐标系或另一个相对坐标系定义原点和坐标轴方向而形成的坐标系统。它允许用户根据实际需求调整坐标轴的方向和原点位置,从而提高了绘图的灵活性和便利性。通过指定原点、X轴单位正方向点、Y轴单位正方向点和Z轴单位正方向点来定义。相对坐标系是一个强大且灵活的工具,可以显著提高绘图、三维建模等领域的效率和准确性。通过理解其定义、应用、特性以及与绝对坐标的区别,我们可以更好地利用相对坐标系来满足各种实际需求。原创 2025-02-05 23:48:06 · 891 阅读 · 0 评论 -
【学Rust写CAD】3 根坐标系定义与应用指南
定义:全局坐标系是一个固定的、统一的坐标系统,用于描述场景中所有物体的位置和方向。特性:全局性:全局坐标系提供了一个全局的参考框架,使得场景中所有物体的位置和方向都可以相对于这个框架进行描述。统一性:全局坐标系中的坐标轴方向和原点位置是固定的,不会因物体的移动或旋转而改变。唯一性:在全局坐标系中,每个物体都有一个唯一的坐标表示其位置和方向。原创 2025-02-05 09:14:11 · 496 阅读 · 0 评论 -
【学Rust写CAD】2 创建第一个工作空间、项目及库
在 Rust 中,工作空间(workspace)允许你管理多个相关的包(crate),这些包可以共享依赖和代码。以下是如何创建一个新的 Rust 工作空间,并在其中新建项目和库(crate)的步骤。原创 2025-01-06 16:28:22 · 826 阅读 · 0 评论 -
【学Rust写CAD】1 环境搭建
Rust、VS Code安装原创 2025-01-06 08:04:40 · 542 阅读 · 0 评论 -
【学Rust写CAD】0 前言
Rust开发CAD前言原创 2024-11-04 14:26:40 · 628 阅读 · 0 评论