Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

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)
}