#![forbid(unsafe_code)]
pub mod ex;
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case", tag = "type"))]
pub enum SelectExample {
AstroidPedal { a: f64 },
CassiniOval { a: f64, c: f64 },
CassiniAstroid { ca: f64, cc: f64, aa: f64 },
CassiniAntiAstroid { ca: f64, cc: f64, aa: f64 },
CassiniAstroidTsq { ca: f64, cc: f64, aa: f64 },
Dumbbell { a: f64, p: f64 },
LineHandled { a: f64 },
Ellipse { a: f64, b: f64 },
Lemniskate { a: f64 },
CirclePow { k: f64 },
CircleSinChain1 { w: f64 },
Spiral { k: u32 },
Spiral1D { k: u32 },
SingularPetalRose { k: u32 },
Circle,
Square,
Intersect8,
Intersect8pp,
}
impl SelectExample {
pub fn add_offset(&mut self, l: f64) {
match self {
Self::AstroidPedal { a } => *a += l,
Self::CassiniOval { a, c } => {
*a += l;
*c += l;
}
Self::CassiniAstroid { ca, cc, aa }
| Self::CassiniAntiAstroid { ca, cc, aa }
| Self::CassiniAstroidTsq { ca, cc, aa } => {
*ca += l;
*cc += l;
*aa += l;
}
Self::Dumbbell { a, .. } => {
*a += l;
}
Self::LineHandled { a } => {
*a += l;
}
Self::Ellipse { a, b } => {
*a /= 1.0 + l;
*b *= 1.0 + l;
}
Self::Lemniskate { a } => {
*a += l;
}
Self::CirclePow { k } => {
*k += l;
}
Self::CircleSinChain1 { w } => {
*w += l;
},
Self::Spiral { .. }
| Self::Spiral1D { .. }
| Self::SingularPetalRose { .. }
| Self::Circle
| Self::Square
| Self::Intersect8
| Self::Intersect8pp => {
panic!("offsetting not supported for this example")
}
}
}
pub fn instantiate(self) -> Box<dyn Fn(f64) -> [f64; 2]> {
match self {
Self::AstroidPedal { a } => Box::new(move |t: f64| ex::astroid_pedal(t, a)),
Self::CassiniOval { a, c } => Box::new(ex::cassini_oval(a, c)),
Self::CassiniAstroid { ca, cc, aa } => Box::new(ex::cassini_astroid(ca, cc, aa)),
Self::CassiniAntiAstroid { ca, cc, aa } => {
Box::new(ex::cassini_anti_astroid(ca, cc, aa))
}
Self::CassiniAstroidTsq { ca, cc, aa } => {
let x = ex::cassini_astroid(ca, cc, aa);
Box::new(move |t: f64| x(t * t))
}
Self::Dumbbell { a, p } => Box::new(ex::dumbbell(a, p)),
Self::LineHandled { a } => Box::new(ex::line_handled(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)),
Self::CircleSinChain1 { w } => Box::new(ex::circle_sin_chain1(w)),
Self::Spiral { k } => Box::new(ex::spiral(k)),
Self::Spiral1D { k } => Box::new(ex::spiral_1d(k)),
Self::SingularPetalRose { k } => Box::new(ex::singular_petal_rose(k)),
Self::Circle => Box::new(ex::circle),
Self::Square => Box::new(ex::square),
Self::Intersect8 => Box::new(ex::intersect_eight),
Self::Intersect8pp => Box::new(ex::intersect_8pp),
}
}
}