56个版本 (20个稳定版)
新 1.4.7 | 2024年8月21日 |
---|---|
1.3.1 | 2024年7月21日 |
0.25.0 | 2024年4月18日 |
0.24.2 | 2024年3月31日 |
0.5.0 | 2023年11月16日 |
在数学类别中排名75
每月下载量1,080
在 3 crates中使用
140KB
3K SLoC
iOverlay
iOverlay是一个快速的多边形布尔库,支持并、交、差、异或等主要操作,由偶数奇数或非零规则控制。该算法基于Vatti裁剪的想法,但是一个原创的实现。
文档
使用交互式演示尝试iOverlay
功能
- 操作:并、交、差、排除。
- 多边形:带孔、自交、多条路径。
- 简化:删除退化顶点并合并共线边。
- 填充规则:偶数奇数和非零。
入门指南
将以下内容添加到您的Cargo.toml中
[dependencies]
i_overlay = "^1.4"
你好,世界
让我们合并两个正方形
let subj = [
F64Point::new(-10.0, -10.0),
F64Point::new(-10.0, 10.0),
F64Point::new(10.0, 10.0),
F64Point::new(10.0, -10.0),
];
let clip = [
F64Point::new(-5.0, -5.0),
F64Point::new(-5.0, 15.0),
F64Point::new(15.0, 15.0),
F64Point::new(15.0, -5.0),
];
let mut overlay = FloatOverlay::new();
overlay.add_path(&subj, ShapeType::Subject);
overlay.add_path(&clip, ShapeType::Clip);
let graph = overlay.into_graph(FillRule::NonZero);
let shapes = graph.extract_shapes(OverlayRule::Union);
println!("shapes count: {}", shapes.len());
if shapes.len() > 0 {
let contour = &shapes[0][0];
println!("shape 0 contour: ");
for p in contour {
let x = p.x;
let y = p.y;
println!("({}, {})", x, y);
}
}
形状结果
extract_shapes
函数的输出是Vec<Vec<Vec<F64Point>>>
,其中
- 外层的
Vec<F64Shape>
表示一组形状。 - 每个形状
Vec<F64Path>
表示一组路径,其中第一条路径是外部边界,所有后续路径都是该边界的孔。 - 每个路径
Vec<F64Point>
是一系列点,形成一个封闭路径。
注意:外边界路径是顺时针顺序,孔是逆时针顺序。
叠加规则
并集,A或B
交集,A和B
差集,B - A
排除,A xor B
依赖关系
~0.5–1.3MB
~30K SLoC