1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use ;
use crate::;
pub type SurfacePlaneIntersection<T> = ;
/// Options for surface-plane intersection solver
pub type SurfaceIntersectionSolverOptions<T> = ;
/*
impl<'a, T> Intersects<'a, &'a Plane<T>> for NurbsSurface<T, Const<4>>
where
T: FloatingPoint + ArgminFloat + num_traits::Bounded + SubsetOf<f64>,
{
type Output = anyhow::Result<Vec<NurbsCurve<T, Const<4>>>>;
type Option = Option<SurfaceIntersectionSolverOptions<T>>;
/// Find the intersection curves between a surface and a plane
/// * `plane` - The plane to intersect with
/// * `options` - Hyperparameters for the intersection solver
fn find_intersection(&'a self, plane: &'a Plane<T>, _option: Self::Option) -> Self::Output {
let tess = self.tessellate(Some(AdaptiveTessellationOptions::<T, Const<4>>::default()));
let its = tess.find_intersection(plane, ())?;
/*
let debug = its.polylines.iter().map(|polyline| {
NurbsCurve3D::polyline(polyline, false)
}).collect_vec();
return Ok(debug);
*/
let projected = its
.polylines
.iter()
.map(|polyline| {
// use hint to find the closest point
let mut iter = polyline.iter();
let first = iter.next().ok_or(anyhow::anyhow!("No first point"))?;
let uv = self.find_closest_parameter(first, None)?;
let parameters = iter.try_fold(vec![uv], |mut acc, pt| {
let uv = self.find_closest_parameter(pt, Some(*acc.last().unwrap()))?;
// let uv = self.find_closest_parameter(pt, None)?;
acc.push(uv);
anyhow::Ok(acc)
})?;
anyhow::Ok(parameters)
})
.collect::<anyhow::Result<Vec<_>>>()?;
let curves = projected
.iter()
.map(|parameters| {
let degree = (parameters.len() - 1).min(2);
// let degree = (parameters.len() - 1).min(3);
let parameter_curve = NurbsCurve2D::interpolate(
¶meters
.iter()
.map(|uv| Point2::new(uv.0, uv.1))
.collect_vec(),
degree,
)?;
let pts = parameter_curve.dehomogenized_control_points();
let pts = pts
.iter()
.map(|uv| self.point_at(uv.x, uv.y).to_homogeneous().into())
.collect_vec();
NurbsCurve3D::try_new(
parameter_curve.degree(),
pts,
parameter_curve.knots().to_vec(),
)
})
// .map(|polyline| Ok(NurbsCurve3D::polyline(&polyline, false)))
.collect::<anyhow::Result<Vec<_>>>()?;
// return Ok(curves);
let debug = projected
.iter()
.map(|params| {
// println!("polyline: {:?}", params);
NurbsCurve3D::polyline(
¶ms
.iter()
.map(|uv| self.point_at(uv.0, uv.1))
.collect_vec(),
false,
)
})
.collect_vec();
Ok(curves.into_iter().chain(debug).collect_vec())
}
}
*/