|
|
|
|
@ -100,6 +100,9 @@ trait Circularity {
|
|
|
|
|
//for a specific type
|
|
|
|
|
0.98..=1.02
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 考虑bugle圆形判断
|
|
|
|
|
fn is_circular_with_bulge(&self) -> bool;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 为 Polyline 类型实现圆形检测,有点类似函数定义
|
|
|
|
|
@ -137,6 +140,10 @@ impl Circularity for Polyline {
|
|
|
|
|
|
|
|
|
|
Self::match_range().contains(&t_ratio)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn is_circular_with_bulge(&self) -> bool{
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 为 LwPolyline 类型实现相同的圆形检测逻辑
|
|
|
|
|
@ -165,10 +172,32 @@ impl Circularity for LwPolyline {
|
|
|
|
|
poly_area /= 2.0;
|
|
|
|
|
poly_area.abs()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let t_ratio = 4.0 * PI * poly_area / poly_perim.powf(2.0);
|
|
|
|
|
|
|
|
|
|
Self::match_range().contains(&t_ratio)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn is_circular_with_bulge(&self) -> bool {
|
|
|
|
|
// 检查是否有显著的bulge值
|
|
|
|
|
let has_bulge = self.vertices.iter().any(|v| v.bulge.abs() > 0.5);
|
|
|
|
|
if !has_bulge {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let all_quarter_arcs = self.vertices.iter()
|
|
|
|
|
.all(|v| (v.bulge.abs() - 1.0).abs() < 0.05);
|
|
|
|
|
|
|
|
|
|
if all_quarter_arcs {
|
|
|
|
|
// 检查是否闭合
|
|
|
|
|
if self.vertices.len() >= 3 {
|
|
|
|
|
let first = &self.vertices[0];
|
|
|
|
|
let last = &self.vertices[self.vertices.len() - 1];
|
|
|
|
|
let distance = ((last.x - first.x).powf(2.0) + (last.y - first.y).powf(2.0)).sqrt();
|
|
|
|
|
return distance < 0.1; // 起点终点接近
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 实现Definition的方法
|
|
|
|
|
|