facett-flow/src/curve.rs
//! CPU twin of flow.wgsl's cubic, shared by drawing, overlays and picking.
use egui::{Pos2, vec2};
pub(crate) fn point(a: Pos2, b: Pos2, t: f32) -> Pos2 {
let delta = b - a;
let bend = if delta.y.abs() > delta.x.abs() {
vec2(0.0, delta.y * 0.42)
} else {
vec2(delta.x * 0.42, 0.0)
};
let c = a + bend;
let d = b - bend;
let s = 1.0 - t;
(a.to_vec2() * (s * s * s)
+ c.to_vec2() * (3.0 * s * s * t)
+ d.to_vec2() * (3.0 * s * t * t)
+ b.to_vec2() * (t * t * t))
.to_pos2()
}
pub(crate) fn distance(p: Pos2, a: Pos2, b: Pos2) -> f32 {
let v = b - a;
let t = ((p - a).dot(v) / v.length_sq().max(1e-20)).clamp(0.0, 1.0);
p.distance(a + v * t)
}