flo_curves/bezier/
deform.rs1use super::curve::*;
2
3pub fn move_point<CurveOut: BezierCurveFactory>(curve: &impl BezierCurve<Point=CurveOut::Point>, t: f64, offset: &CurveOut::Point) -> CurveOut {
10    let w1          = curve.start_point();
12    let w4          = curve.end_point();
13    let (w2, w3)    = curve.control_points();
14
15    let one_minus_t         = 1.0-t;
16    let one_minus_t_cubed   = one_minus_t*one_minus_t*one_minus_t;
17    let t_cubed             = t*t*t;
18
19    let u = one_minus_t_cubed / (t_cubed + one_minus_t_cubed);
21    let c = w1*u + w4*(1.0-u);
22
23    let wn1 = w1*(1.0-t) + w2*t;
25    let wn2 = w2*(1.0-t) + w3*t;
26    let wn3 = w3*(1.0-t) + w4*t;
27
28    let wnn1 = wn1*(1.0-t) + wn2*t;
29    let wnn2 = wn2*(1.0-t) + wn3*t;
30
31    let p = wnn1*(1.0-t) + wnn2*t;
32
33    let pb = p + *offset;
35
36    let wnn1b = wnn1 + *offset;
37    let wnn2b = wnn2 + *offset;
38
39    let ratio   = ((t_cubed+one_minus_t_cubed)/(t_cubed + one_minus_t_cubed-1.0)).abs();
42    let wn2b    = ((pb-c)*ratio) + pb;
43
44    let inverse_t       = 1.0/t;
46    let inverse_tminus1 = 1.0/(t-1.0);
47    
48    let wn1b = (wn2b*t - wnn1b)*inverse_tminus1;
49    let wn3b = (wn2b*-1.0 + wn2b*t + wnn2b)*inverse_t;
50
51    let w2b = (w1*-1.0 + w1*t + wn1b)*inverse_t;
53    let w3b = (w4*t-wn3b)*inverse_tminus1;
54
55    CurveOut::from_points(w1, (w2b, w3b), w4)
57}