#多边形 #布尔 #裁剪 #Clipper

clipper2

为Rust提供多边形裁剪和偏移的库

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 算法

Download history 165/week @ 2024-04-26 291/week @ 2024-05-03 140/week @ 2024-05-10 16/week @ 2024-05-17 2/week @ 2024-05-24 294/week @ 2024-05-31 35/week @ 2024-06-07 4/week @ 2024-06-14 3/week @ 2024-06-28 14/week @ 2024-07-05 121/week @ 2024-07-26 19/week @ 2024-08-02 2/week @ 2024-08-09

每月下载量142次

MIT/Apache

83KB
1.5K SLoC

clipper2

crate.io docs.rs

一个用于Rust的路径/多边形裁剪和偏移的库。

该库的重点是提供一个易于使用的API,尽可能接近核心的Vecfn类型。

该库使用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
    }
}

这是结果的形状

Image displaying the result of the difference and inflate example

API使用f64,但底层使用i64

Clipper2库使用i64值来保证所有计算的鲁棒性。C++库公开了几个类型的int64_t/i64double/f64版本。因此,该库内部仅使用int64_t/i64类型,但目前仅公开了f64 API。

因此,类型PointPathPaths提供了一个PointScaler特性和泛型参数,允许用户在从f64转换为i64时选择使用的缩放。默认情况下,它使用Centi结构体,该结构体会将值乘以100

初期阶段

此项目处于非常初期的阶段,目前仅开放了C++ Clipper2库的一部分功能。在未来的时间里,我们会不断探索并找到更多更符合Rust风格的API暴露方式,因此可能会出现一些破坏性变更。

请随时提出关于如何简化API的建议,或者直接发送代码贡献。有关更多详细信息,请参阅CONTRIBUTING.md

许可证

根据您的选择,许可协议可以是Apache License, Version 2.0MIT许可证

除非您明确表示,否则您根据Apache-2.0许可证定义的贡献,有意提交给Serde的,应按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~1.4–2.2MB
~53K SLoC