SmoothFrame
SmoothFrame 是一个零依赖的 Rust 几何库,用来生成接近 Sketch「Smooth Corners」效果的 cubic Bezier 路径。
它只负责算路径,不绑定任何渲染后端。你可以把输出命令直接接到 SVG、Canvas、Skia、Godot 或自己的绘图管线里。
安装
[]
= "0.2"
项目使用 Rust 2024 edition,最低 Rust 版本为 1.85。
快速开始
最常用的入口是 SmoothRect:
use SmoothRect;
radius 是核心圆半径,smoothing 是 Sketch 风格的平滑系数,会被限制在 0..=1。
生成出来的 SmoothPath 可以:
- 用
to_svg_path()或to_svg_path_with_precision()输出 SVG path data。 - 用
commands()读取MoveTo / LineTo / CubicTo / Close命令。 - 用
cubics()提取所有 cubic Bezier 段,方便测试、采样或接入其他 API。 - 用
export_with()接入自定义PathFormatter,输出 Godot、Canvas 或函数调用等格式。
运行示例
仓库里带了一个 demo,可以直接生成路径或完整 SVG:
也可以调整尺寸、半径、平滑系数和边框:
查看所有参数:
API 一览
SmoothRect
矩形便捷 API,也是最接近 SketchTool 导出结果的入口。
use SmoothRect;
普通区间下,一个矩形最多会生成 4 条边和 12 段 cubic。接近圆形或胶囊形时,SketchTool 会退化成普通圆角、圆或 capsule-like 结构;
SmoothRect 会跟随这种行为。
如果你需要每个角始终保留 3 段 cubic 的 primitive,请使用 SmoothCorner 或 SmoothFrame。
SmoothFrame
用于闭合凸多边形。
use ;
SmoothFrame 会检查输入点:
- 少于 3 个点会返回
TooFewPoints。 - 退化边、共线点或面积为 0 会返回
DegenerateFrame。 - 凹多边形会返回
ConcaveFrame。 - 自相交路径会返回
SelfIntersectingFrame。
SmoothCorner
用于单个凸角。它是更底层的 primitive,适合你自己管理边、角和拼接顺序的场景。
use ;
输入语义:
origin:当前角点。incoming_axis:从角点指向上一条边的方向。outgoing_axis:从角点指向下一条边的方向。with_radius():核心圆半径。with_smoothing():Sketch-like smoothing,计算时会 clamp 到0..=1。with_limits():incoming / outgoing 两侧允许占用的最大长度。
接到渲染 API
输出层以 SmoothPath 作为稳定中间表示,SVG 只是内置 formatter。需要接到其他后端时,可以直接读取路径命令:
use ;
CubicSegment 里包含 from / ctrl1 / ctrl2 / to,如果你的后端更喜欢一段一段处理 Bezier,可以直接使用 path.cubics()。
也可以实现 PathFormatter,把输出格式作为独立扩展点:
use ;
;
和 SketchTool 的关系
SmoothRect 的目标是对齐 SketchTool 对 smooth corner 矩形的实际 SVG 导出,而不是只实现一个近似公式。
测试里包含两类约束:
- 内置几何单元测试,覆盖常见矩形、最大半径、胶囊形、圆形退化、凸多边形、错误输入等情况。
- 如果本机安装了 SketchTool,集成测试会批量创建 Sketch smooth rect、导出 SVG、逐条比较
M / L / C / Z控制点。
默认情况下,找不到 SketchTool 时会跳过集成测试。如果本机能找到 SketchTool,cargo test 会跑完整对齐矩阵,这一步可能比较慢。只想验证
SketchTool 对齐时可以单独运行:
重复运行 SketchTool 集成测试前,建议先手动退出 Sketch。SketchTool 会调用本机 Sketch 进行导出,Sketch 已打开或上一次测试后仍停留在后台时,可能复用旧状态或占用导出环境,导致重复测试结果不稳定。
需要指定 SketchTool 路径或强制要求本机必须存在 SketchTool 时:
SMOOTH_FRAME_SKETCHTOOL=/Applications/Sketch.app/Contents/MacOS/sketchtool
SMOOTH_FRAME_REQUIRE_SKETCHTOOL=1
开发
日常改矩形逻辑时先跑 cargo test --test rect 就够快;需要确认 Sketch 导出兼容性时再跑
cargo test --test sketchtool -- --nocapture。
这个 crate 没有运行时依赖。公开 API 统一从 crate 根导出,所以使用方只需要写:
use ;
源码按输入层、处理层、输出层拆分在 src/ 下:
lib.rs:crate 入口和公开类型 re-export。input/:公开输入入口,负责参数校验、输入清洗和格式归一化。input/corner.rs:SmoothCorner输入封装,校验单角方向、半径和平滑系数。input/rect/:SmoothRect矩形便捷输入,处理尺寸归一化、矩形角适配和路径拼接。input/frame/:SmoothFrame闭合凸多边形输入,负责点集校验、角点适配和路径拼接。process/:核心处理层,定义 crate 私有Processortrait,只包含 smooth corner 纯几何计算。process/corner/:单个 smooth corner 的几何解析、圆弧坐标和 cubic 生成。output/format.rs:公开PathFormatter扩展契约和内置SvgPathFormat。output/path.rs:SmoothPath、PathCommand、CubicSegment和 formatter 委托入口。types/geometry.rs:Point、Vector和基础几何运算。errors/mod.rs:SmoothError。utils/mod.rs:内部数值工具、格式化工具和容差常量。
测试按领域拆分在 tests/ 下:
rect.rs:矩形 smooth corner 结构和 Sketch-like 退化行为。corner.rs:单角 primitive 的几何公式。frame.rs:凸多边形 frame 和错误输入。path.rs:路径输出格式。sketchtool.rs:SketchTool 集成对齐矩阵。support/:测试断言和 SketchTool 解析辅助。
示例 demo 拆分在 examples/demo/ 下:
main.rs:串联参数解析、路径生成和输出。cli.rs:命令行参数解析与输入校验。svg.rs:完整 SVG 渲染和数字格式化。
许可证
Apache-2.0