#geometry #voronoi-diagram #2d #shapes #edge #angle #median-axis

centerline

用于查找2D封闭几何形状中心线的简单库

20次发布 (11次破坏)

0.11.0 2023年12月8日
0.10.0 2023年11月18日
0.9.0 2023年11月10日
0.7.0 2021年11月24日
0.0.3 2021年3月25日

#239 in 数学

Download history 6/week @ 2024-03-09 1/week @ 2024-03-16 23/week @ 2024-03-30 4/week @ 2024-04-06

每月 128 次下载
用于 toxicblend

MIT/Apache

505KB
3K SLoC

crates.io Documentation status-badge dependency status license

这个简单的库尝试找到封闭2D几何的中心线,也称为中轴线。

它专注于字母形状,即具有潜在封闭岛屿的顶点环。目前直接连接到其他环的环不起作用。

它使用一个分段沃罗诺伊图作为基础,然后通过比较边(绿色)和创建它的输入几何(红色)之间的角度来过滤掉“尖锐”部分(绿色)。如果角度接近90°,则会被忽略。请注意,经过过滤尖锐部分后,结果(蓝色)在技术上不是真正的中心线,但它使工具路径等变得更加干净。它还对生成的中心线执行线简化。

unfiltered filtered

let segments = ...same as boost voronoi segments...
let mut centerline = Centerline::<i32, glam::Vec3>::::with_segments(segments);
centerline.build_voronoi()?;
// the cosine value of the angle limit. 
let cos_angle:f32 = 0.38;
// the RDP simplification distance
let centerline_simplification:f32 = 0.1;

centerline.calculate_centerline(cos_angle, centerline_simplification, None)?;
println!(
   "Result: lines:{}, line_strings:{}",
   centerline.lines.as_ref().map_or(0,|x|x.len()),
   centerline.line_strings.as_ref().map_or(0,|x|x.len())
);

GUI示例

cargo run --example fltk_gui --features=obj-rs --release

示例仅显示2D,但实际上生成的中心线是3D线段。
Z坐标是2D中心线与其创建的几何形状之间的距离。

示例GUI接受.obj文件作为输入。该.obj文件需要在某个轴对齐平面中是2D的(其中一个坐标必须为零)。此外,请确保没有交叉的外边缘。

最小支持的Rust版本(MSRV)

centerline的最小支持的Rust版本是1.66

待办事项

  • 添加更好的测试
  • 有时形状被注册为在其凸包“外部”
  • 将OpenGL添加到fltk_gui,以便可以可视化中心线的3D效果。

贡献

我们欢迎社区贡献。请随意提交拉取请求或在我们的GitHub仓库报告问题。除非你明确声明,否则任何有意提交以包含在你工作的贡献,根据Apache-2.0许可,应按上述方式双重许可,不附加任何额外条款或条件。

许可

根据以下之一许可

由您选择。

依赖项

约9MB
约195K SLoC