Rust下基于SFCGAL获取直骨架M值距离的技术疑问
在Rust中通过SFCGAL高效获取直骨架的M值距离
你当前的问题是调用straight_skeleton_distance_in_m()生成直骨架后,无法高效获取每个点对应的M值(距离信息)——to_coordinates()用(f64, f64)类型接收会丢失M值,转WKT或手动过滤原始点又效率低下。
解决核心是使用支持M分量的坐标类型接收转换结果,straight_skeleton_distance_in_m()返回的几何中,每个点的M字段已经存储了到原始多边形边界的距离,直接读取即可:
// 用包含X、Y、M的三元组类型接收坐标序列,第三个元素就是距离值 let coords_with_distance: CoordSeq<(f64, f64, f64)> = out.to_coordinates().unwrap(); // 遍历提取每个点的坐标与距离 for (x, y, distance) in coords_with_distance { // 处理坐标和距离,例如打印或存储 println!("坐标({}, {}) 到边界的距离: {}", x, y, distance); }
如果需要仅保留骨架中间的点(排除原始多边形的边界点),可以通过M值快速过滤——边界点的距离值为0,内部骨架点的距离大于0:
let inner_skeleton_points: Vec<((f64, f64), f64)> = coords_with_distance.into_iter() .filter(|&(_, _, dist)| dist > 0.0) .map(|(x, y, dist)| ((x, y), dist)) .collect();
这种方式直接从底层坐标序列读取M值,无需额外格式转换或低效遍历,是效率最高的实现方式。
内容的提问来源于stack exchange,提问作者LeXav
相关产品推荐
相关产品推荐

