use fj_math::{Circle, Point};
use crate::geometry::{traits::GenPolyline, CurveBoundary, Tolerance};
/// # 近似一个圆轮廓
///
/// ## 论点
///
/// 除了一个圆,这个方法还有两个参数:
///
/// - -圆应该近似的“边界”。
/// - “公差”,指定允许近似值偏离实际圆的程度。
///
/// ## 返回值
///
/// 近似值返回所提供边界内的点。边界点本身不包括在近似值中。这为调用者(无论如何都知道边界)提供了更多如何进一步处理近似值的选项。
///
/// ## 决定论
///
/// 圆近似经过精心设计,可以为给定圆和公差的组合产生确定性结果,而不管边界如何。这样做是为了防止生成无效的网格。
/// I具体来说,这意味着有一组无限的点近似于一个圆(无限,因为圆的局部坐标空间是无限的)。对于给定的圆和公差组合,该集合是确定的。定义圆近似位置的边界仅以两种方式影响结果:
///
/// 1. 它控制着实际计算无限集中的哪些点。
/// 2. 它定义了返回计算点的顺序。
///
/// 因此,无论路径的哪个范围被近似,以及被近似的次数是多少,圆近似都能保证生成可以在有效网格中组合在一起的点。
///
pub fn approx_circle<const D: usize>(
circle: &Circle<D>,
boundary: impl Into<CurveBoundary<Point<1>>>,//边界
tolerance: impl Into<Tolerance>,//公差
) -> Vec<(Point<1>, Point<D>)> {
let boundary = boundary.into();
let tolerance = tolerance.into();
let mut points = Vec::new();
for point_curve in circle.generate_polyline(boundary, tolerance) {
let point_global = circle.point_from_circle_coords(point_curve);
points.push((point_curve, point_global));
}
points
}
标签:4.1,1.1,point,近似,let,circle,tolerance,boundary
From: https://blog.csdn.net/weixin_43219667/article/details/144019722