自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(220)
  • 收藏
  • 关注

原创 【学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 510

原创 【学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 381

原创 【学Rust写CAD】26 图形像素获取(pixel_fetch.rs)

用途: 安全地获取图像像素,避免因越界访问导致 panic 或内存不安全。策略: 越界时返回最近的边界像素值(类似“边缘填充”效果)。适用场景: 图像处理中需要处理边界条件的操作(如卷积滤波、缩放等)。如果需要其他边界处理方式(如镜像、重复等),可以定义新的结构体并实现 PixelFetch trait。

2025-04-02 21:06:55 385

原创 【学Rust写CAD】25 变量类(variable.rs)

这段代码的主要目的是:定义一个通用的数值包装类型 Variable为包装类型实现基本算术运算支持 Fixed 类型与浮点数的混合运算这种设计常用于需要统一处理多种数值类型的场景,比如元素类型为泛型的矩阵计算等数学工具时。

2025-04-02 13:06:53 377

原创 【学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 384

原创 【学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 366

原创 【学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 570

原创 【学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 538

原创 【学Rust写CAD】20 平铺模式结构体(spread.rs)

这个 Spread 枚举定义了渐变超出定义区域时的扩展方式,通常用于处理渐变在边界之外的行为。

2025-03-30 05:24:54 409

原创 【学Rust写CAD】19 颜色渐变定义(gradient_stop.rs)

定义了一个名为 GradientStop 的公开结构体,包含两个字段:position: 一个公开的 32 位浮点数(f32),表示渐变停止点的位置(通常在 0.0 到 1.0 之间)color: 一个公开的 Color 类型,表示该位置的颜色。

2025-03-30 04:58:54 341

原创 【学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 424

原创 【学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 608

原创 【学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 554

原创 【学Rust写CAD】15 定点数实现(fixed.rs)

表示小数部分占用的位数使用16位表示小数部分,意味着有16位小数和16位整数(在i32中)用于双线性插值计算的精度位数通常设置为4或8位,决定了插值权重的精度。

2025-03-28 07:30:19 642

原创 【学Rust写CAD】14线性插值函数(加入color.rs)

这段代码实现了两个颜色之间的线性插值(linear interpolation),通常称为lerp。这是一种在两个值之间进行平滑过渡的技术,在这里用于颜色过渡。t: 插值系数,范围0-256(0=完全使用起始颜色,256=完全使用目标颜色)使用掩码0xff00ff来提取这些分量(因为颜色通常以ARGB格式存储)同时处理两个颜色分量(蓝色/红色和alpha/绿色),减少操作次数。结果会是紫色(0x800080),正好在红色和蓝色中间。计算目标颜色和起始颜色在各分量上的差值。将插值后的分量重新组合成最终颜色。

2025-03-27 20:22:47 595

原创 【学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 370

原创 【CXX-Qt】5.2 Crate 组织

CXX-Qt 由 crates/ 目录下的多个 crate 组成。本页概述了每个 crate 的目标以及它与其他 crate 的区别。⭐ cxx-qt - 主角👷 cxx-qt-build - 建筑工人💚 cxx-qt-gen - CXX-Qt 的核心📖 cxx-qt-lib - “标准”库📚 cxx-qt-lib-extras - 书架💻 cxx-qt-macro - cxx-qt-gen 的前端🦾 qt-build-utils - 使用 Qt 构建。

2025-03-26 04:00:00 574

原创 【CXX-Qt】5.1 CXX-Qt 构建系统

使用 CXX-Qt 进行构建比最初听起来要复杂一些。问题(或者用企业术语来说是“挑战”😉)

2025-03-26 00:15:00 558

原创 【CXX-Qt】5 CXX-Qt 内部实现

这些部分主要面向 CXX-Qt 的贡献者,但对于希望更全面了解 CXX-Qt 的用户来说,也可能很有趣。本章解释了 CXX-Qt 的一些内部架构和设计决策。

2025-03-25 02:15:00 204

原创 【CXX-Qt】4.5 Traits

其中一些 trait 在 #[cxx_qt::bridge] 中使用特殊语法,类似于 CXX 中的显式 shim trait 实现。根据 trait 的不同,这要么告诉 CXX-Qt 它应该自动实现该 trait,要么告诉它应该使用现有的 trait 实现进行代码生成。CXX-Qt 使用多个 trait 将其行为和支持的功能清晰地编码到 Rust 的类型系统中。Threading - 标记 trait,指示是否应启用 CXX-Qt 线程支持。Initialize - 在对象构造时执行 Rust 代码。

2025-03-25 00:15:00 264

原创 【CXX-Qt】4.4 属性

桥接模块中的大多数项都支持 #[namespace]、#[cxx_name=…] 和 #[rust_name=…] 属性。

2025-03-24 01:00:00 481

原创 【CXX-Qt】4.3 共享类型

[qenum] - 支持 Q_ENUM 和 Q_ENUM_NSQt 允许通过一组宏将枚举暴露给 Qt 的元对象系统,从而暴露给 QML:Q_ENUM 用于暴露作为 QObject 成员的枚举。Q_ENUM_NS 用于暴露位于命名空间中的枚举。CXX-Qt 通过 #[qenum] 属性支持这两种宏。

2025-03-24 00:15:00 751

原创 【euclid】21 3D包围盒模块(box3d.rs)

Box3D 结构体是一个高效且通用的三维轴对齐矩形框表示,提供了丰富的几何操作方法。它泛型化了坐标类型和单位,适用于图形、UI 等领域中需要处理三维矩形框的场景。

2025-03-24 00:14:35 654

原创 【euclid】20 2D包围盒模块(box2d.rs)

Box2D 结构体是一个高效且通用的二维轴对齐矩形表示,提供了丰富的几何操作方法。它泛型化了坐标类型和单位,适用于图形、UI 等领域中需要处理二维矩形的场景。

2025-03-23 23:55:21 294

原创 【学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 691

原创 【CXX-Qt】4.2 extern “C++Qt“

QObjectsMethodsSignalsextern “C++Qt” 部分是 CXX-Qt 桥接的一部分,用于声明 Qt 类型和签名,使其可用于 Rust,并提供包含相应 Qt 声明的头文件路径。一个桥接模块可以包含零个或多个 extern “C++Qt” 块。这补充了 extern “C++” CXX 部分,但允许在 C++ 类型上声明 Qt 特定的功能。可以通过块级属性自动转换为驼峰命名或蛇形命名。

2025-03-23 02:15:00 218

原创 【CXX-Qt】4.1 extern “RustQt“

如果自动生成的函数不适用于你的用例,你可以禁用 CXX-Qt 的自动生成并编写完全自定义的属性。例如,如果你的属性不对应于内部 Rust 结构体中的任何单个字段,则可能需要这样做。你可以使用标志指定自定义 getter、setter 和通知信号,例如:#[qproperty(TYPE, NAME, READ = myGetter, WRITE = mySetter, NOTIFY = myOnChanged)]。📝 注意:标志的键使用全大写字母,如 Qt 版本的 `qproperty`。

2025-03-23 00:30:00 701

原创 【CXX-Qt】3 桥接模块参考

然后,这个 Rust 模块将像普通的 CXX 桥接一样工作,同时还支持 CXX-Qt 添加的额外功能。extern “RustQt” - 将 Rust 类型暴露给 Qt,作为 QObject、Q_SIGNAL、Q_PROPERTY 等。#[cxx_qt::bridge] 宏的功能与 #[cxx::bridge] 非常相似。共享类型 - 在 Rust 和 Qt 之间共享枚举,例如 Q_ENUM、Q_ENUM_NS 等。Trait - 与 CXX-Qt QObject 相关的 trait。

2025-03-23 00:15:00 159

原创 【CXX-Qt】2.5 继承

某些 Qt API 要求你从抽象基类中重写某些方法,例如 QAbstractItemModel。为了支持直接从 Rust 中创建这样的子类,CXX-Qt 提供了多种辅助工具。某些基类可能需要特殊的构造参数。这可以通过使用自定义构造函数来实现。

2025-03-22 09:31:06 507

原创 【CXX-Qt】2.4 嵌套对象

然后,可以通过使用 *mut T 将其作为属性、可调用方法的参数或信号参数使用。如下例所示,将 InnerObject 嵌套到 OuterObject 中。首先,在桥接模块的 extern 块中正常定义一个类型。嵌套对象通过指向其 QObject 表示的指针来引用。Rust Qt 对象可以作为属性或参数相互嵌套。

2025-03-22 09:08:48 376

原创 【CXX-Qt】2.3 类型

任何有效的 CXX 类型都应该可以与 CXX-Qt 一起使用。请注意,适用与 CXX 相同的规则,因此类型必须是可平凡传递的。如果它们是不透明类型,则必须使用引用或指针。有关如何包装 Qt 对象的示例,请参阅 cxx-qt-lib 源代码。要在容器中使用自定义类型,请找到容器使用的 trait。例如,对于 QSet,有一个 QSetElement trait;对于 QHash<K, V>,有一个 QHashPair trait。

2025-03-22 08:58:47 865

原创 【CXX-Qt】2.2 生成的 QObject

CXX-Qt 的一个关键特性是能够从 Rust 创建你自己的 QObject。这就是 #[qobject] 宏的用途。本篇旨在记录生成的 QObject 的详细信息以及如何从 Rust 与生成的 QObject 进行交互。#[qobject] 宏为 Rust 结构体的类型别名生成一个 QObject。虽然这个 QObject 是一个 C++ 类型,但 CXX-Qt 会自动将其包装为 CXX 不透明类型。

2025-03-22 08:47:57 528

原创 【CXX-Qt】2.1.1 为 WebAssembly 构建

CXX-Qt 及其编写的应用程序可以编译为 WebAssembly,但存在一些限制。以下是关于如何为 WASM 目标构建的详细说明。你需要安装 Qt for WebAssembly。下一篇将展示已测试的版本。此外,如果尚未完成,请从此处克隆 emsdk git 仓库。

2025-03-20 08:40:53 830

原创 【CXX-Qt】2.1 构建系统

CXX-Qt 可以集成到现有的 CMake 项目中,也可以仅使用 Cargo 进行构建。需要了解的可以阅读上2篇文章:Cargo 集成CMake 集成CXX-Qt 可以与任何 C++ 构建系统一起使用,只要在调用 Cargo 之前设置了 QMAKE、CXX_QT_EXPORT_DIR 和 CXX_QT_EXPORT_CRATE_ 环境变量。请查看我们的 CMake 代码以了解如何使用这些变量。

2025-03-20 07:42:51 374

原创 CXX-Qt】2 核心概念

CXX-Qt 使用 CXX 在 C++ 和 Rust 之间安全地进行桥接。CXX-Qt 的主要目的是将 Qt 对 C++ 语言的扩展暴露给 CXX。

2025-03-18 22:44:22 72

原创 【CXX-Qt】1.5 使用CMake构建

在本示例中,我们将演示如何使用CMake将CXX-Qt代码集成到C++应用程序中。Cargo将CXX-Qt代码构建为静态库,然后CMake将其链接到C++可执行文件中。我们首先需要修改项目结构,以分离项目的不同部分。将Rust项目移动到rust文件夹中。将qml文件夹移回顶层。

2025-03-18 22:40:18 732

原创 【CXX】6.12 Result<T>

Result 可以作为双向 extern 函数的返回类型。它的行为是将 C++ 异常与 Rust 的 Result 相互转换。如果你的代码库不使用 C++ 异常,或者倾向于使用类似 outcome、leaf::result、StatusOr 等类型来表示失败,那么目前你需要通过自己的封装来处理这些类型与 Rust Result 的转换。未来计划提供更好的支持。

2025-03-17 01:00:00 505

原创 【CXX】6.11 函数指针

从 C++ 向 Rust 传递函数指针尚未实现,目前仅支持从 Rust 向 extern “C++” 函数传递函数指针。函数指针通常用于通过 FFI 实现异步函数。请参阅相关示例代码。返回类型为 Result 的函数指针尚未实现。

2025-03-17 00:15:00 486

原创 【CXX】6.10 *mut T,*const T原始指针

通常情况下,你应该尽可能使用引用(&mut T, &T)或 std::unique_ptr 而不是原始指针,但原始指针也可以作为一种不安全的备选方案。

2025-03-16 07:38:45 306

原创 【CXX】6.9 CxxVector<T> — std::vector<T>

std::vector 的 Rust 绑定称为 CxxVector。

2025-03-16 07:20:28 250

从头写CAD完成部分源码

从头写CAD完成部分源码

2024-09-08

角度类、长度类及相关文件源码

角度类、长度类及相关文件源码

2024-09-03

【从头写CAD】 几何体类系列一 开篇

Point类源码

2024-08-28

【从头写CAD】点类Point

【从头写CAD】点类Point

2024-08-25

【从头写CAD】 主程序

相关源码

2024-08-21

【从头写CAD】 程序集

【从头写CAD】 程序集

2024-08-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除