10个不稳定版本 (3个重大变更)
0.4.1 | 2024年7月30日 |
---|---|
0.4.0 | 2024年6月4日 |
0.3.0 | 2024年6月1日 |
0.2.3 | 2024年5月13日 |
0.1.2 | 2024年3月17日 |
#309 in 算法
每月下载量142次
83KB
1.5K SLoC
clipper2
一个用于Rust的路径/多边形裁剪和偏移的库。
该库的重点是提供一个易于使用的API,尽可能接近核心的Vec
和fn
类型。
该库使用clipper2c-sys库,该库是一个围绕C++版本Clipper2的Rust包装器。
示例
以下示例使用macroquad来可视化操作结果和一些来自examples/
目录的辅助函数。有关更多示例,请参阅示例目录。
use clipper2::*;
use helpers::{circle_path, draw_paths};
use macroquad::prelude::*;
mod helpers;
#[macroquad::main("Difference and inflate")]
async fn main() -> Result<(), ClipperError> {
let circle = circle_path((5.0, 5.0), 3.0, 32);
let circle2 = circle_path((7.0, 7.0), 1.0, 32);
let rectangle = vec![(0.0, 0.0), (5.0, 0.0), (5.0, 6.0), (0.0, 6.0)];
let result = circle
.to_clipper_subject()
.add_clip(circle2)
.add_clip(rectangle)
.difference(FillRule::default())?;
let result2 = result
.inflate(1.0, JoinType::Round, EndType::Polygon, 0.0)
.simplify(0.01, false);
loop {
clear_background(BLACK);
draw_paths(&result, SKYBLUE);
draw_paths(&result2, GREEN);
next_frame().await
}
}
这是结果的形状
API使用f64,但底层使用i64
Clipper2库使用i64值来保证所有计算的鲁棒性。C++库公开了几个类型的int64_t
/i64
和double
/f64
版本。因此,该库内部仅使用int64_t
/i64
类型,但目前仅公开了f64
API。
因此,类型Point
、Path
和Paths
提供了一个PointScaler
特性和泛型参数,允许用户在从f64
转换为i64
时选择使用的缩放。默认情况下,它使用Centi
结构体,该结构体会将值乘以100
。
初期阶段
此项目处于非常初期的阶段,目前仅开放了C++ Clipper2库的一部分功能。在未来的时间里,我们会不断探索并找到更多更符合Rust风格的API暴露方式,因此可能会出现一些破坏性变更。
请随时提出关于如何简化API的建议,或者直接发送代码贡献。有关更多详细信息,请参阅CONTRIBUTING.md。
许可证
根据您的选择,许可协议可以是Apache License, Version 2.0或MIT许可证。
除非您明确表示,否则您根据Apache-2.0许可证定义的贡献,有意提交给Serde的,应按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~1.4–2.2MB
~53K SLoC