SmoothFrame
SmoothFrame 是一个零依赖的 Rust 几何库,用来生成接近 Sketch「Smooth Corners」效果的 cubic Bezier 路径。
它只负责算路径,不绑定任何渲染后端。你可以把输出命令直接接到 SVG、Canvas、Skia、Godot 或自己的绘图管线里。
安装
[]
= "0.1"
项目使用 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。
运行示例
仓库里带了一个 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
路径命令是有意保持简单的:
use ;
CubicSegment 里包含 from / ctrl1 / ctrl2 / to,如果你的后端更喜欢一段一段处理 Bezier,可以直接使用 path.cubics()。
和 SketchTool 的关系
SmoothRect 的目标是对齐 SketchTool 对 smooth corner 矩形的实际 SVG 导出,而不是只实现一个近似公式。
测试里包含两类约束:
- 内置几何单元测试,覆盖常见矩形、最大半径、胶囊形、圆形退化、凸多边形、错误输入等情况。
- 如果本机安装了 SketchTool,集成测试会批量创建 Sketch smooth rect、导出 SVG、逐条比较
M / L / C / Z控制点。
默认情况下,找不到 SketchTool 时会跳过集成测试。如果本机能找到 SketchTool,cargo test 会跑完整对齐矩阵,这一步可能比较慢。只想验证
SketchTool 对齐时可以单独运行:
需要指定 SketchTool 路径或强制要求本机必须存在 SketchTool 时:
SMOOTH_FRAME_SKETCHTOOL=/Applications/Sketch.app/Contents/MacOS/sketchtool
SMOOTH_FRAME_REQUIRE_SKETCHTOOL=1
开发
日常改几何逻辑时先跑 cargo test --test geometry 就够快;需要确认 Sketch 导出兼容性时再跑
cargo test --test sketchtool -- --nocapture。
这个 crate 没有运行时依赖。公开 API 统一从 crate 根导出,所以使用方只需要写:
use ;
源码按职责拆分在 src/ 下:
lib.rs:crate 入口和公开类型 re-export。geometry.rs:Point、Vector和基础几何运算。path.rs:SmoothPath、PathCommand、CubicSegment和 SVG path 输出。corner.rs:单个 smooth corner 的几何计算。frame.rs:闭合凸多边形 frame。rect.rs:SketchTool 对齐的矩形便捷实现。error.rs:SmoothError。math.rs:内部数值工具和容差常量。
许可证
Apache-2.0