From 1f813379130d29d4713c7f3767f43255a31d5a07 Mon Sep 17 00:00:00 2001 From: Alain Zscheile Date: Fri, 5 Jan 2024 20:46:14 +0100 Subject: [PATCH] +dumbbell --- src/ex.rs | 8 ++++++++ src/lib.rs | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/ex.rs b/src/ex.rs index 6f30f94..e9eb823 100644 --- a/src/ex.rs +++ b/src/ex.rs @@ -34,6 +34,14 @@ pub fn circle_sin_chain1(w: f64) -> impl Fn(f64) -> [f64; 2] { } } +// source: https://mathworld.wolfram.com/DumbbellCurve.html +pub fn dumbbell(a: f64) -> impl Fn(f64) -> [f64; 2] { + move |t: f64| { + let t2 = t * t; + [a * t, a * t2 * (1.0 - t2).sqrt()] + } +} + pub fn ellipse(a: f64, b: f64) -> impl Fn(f64) -> [f64; 2] { move |t: f64| { let cdat = circle(t); diff --git a/src/lib.rs b/src/lib.rs index 0f515b0..cc166ab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ pub enum SelectExample { CassiniAntiAstroid { ca: f64, cc: f64, aa: f64 }, CassiniAstroidTsq { ca: f64, cc: f64, aa: f64 }, + Dumbbell { a: f64 }, Ellipse { a: f64, b: f64 }, Lemniskate { a: f64 }, CirclePow { k: f64 }, @@ -42,6 +43,9 @@ impl SelectExample { *cc += l; *aa += l; } + Self::Dumbbell { a } => { + *a += l; + } Self::Ellipse { a, b } => { *a /= 1.0 + l; *b *= 1.0 + l; @@ -79,6 +83,7 @@ impl SelectExample { let x = ex::cassini_astroid(ca, cc, aa); Box::new(move |t: f64| x(t * t)) } + Self::Dumbbell { a } => Box::new(ex::dumbbell(a)), Self::Ellipse { a, b } => Box::new(ex::ellipse(a, b)), Self::Lemniskate { a } => Box::new(move |t: f64| ex::lemniskate(t, a)), Self::CirclePow { k } => Box::new(ex::circle_pow(k)),