From c1fef9993b5b425e970a9035259b45507be89031 Mon Sep 17 00:00:00 2001 From: annieversary Date: Sat, 28 Aug 2021 00:20:46 +0200 Subject: [PATCH] [#10] add more attractor types --- crates/subtitled10/src/main.rs | 53 +++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/crates/subtitled10/src/main.rs b/crates/subtitled10/src/main.rs index 0e136d5..029da94 100644 --- a/crates/subtitled10/src/main.rs +++ b/crates/subtitled10/src/main.rs @@ -6,6 +6,22 @@ fn main() { } // http://paulbourke.net/fractals/clifford/ +// http://paulbourke.net/fractals/peterdejong/ + +#[derive(Clone, Copy, Debug)] +enum Attractor { + Clifford, + DeJong, +} + +impl Attractor { + fn random() -> Self { + match random_range(0, 2) { + 0 => Self::Clifford, + _ => Self::DeJong, + } + } +} #[derive(Clone, Copy, Debug)] struct Params { @@ -13,6 +29,7 @@ struct Params { b: f32, c: f32, d: f32, + attractor: Attractor, } struct Model { points: Vec, @@ -50,6 +67,7 @@ fn model(_app: &App) -> Model { b: 0.0, c: 0.0, d: 0.0, + attractor: Attractor::random(), }, a_mul: random_range(0.3, 1.0) * random_range(-1.0, 1.0).signum(), @@ -74,17 +92,38 @@ fn model(_app: &App) -> Model { max_d: f32::acos(1.4 / 2.0), base_hue: random_range(0., 360.0), - points: vec![Vec2::ZERO; 10000], + points: vec![Vec2::splat(0.1); 10000], } } -fn advance(params: Params, point: Vec2) -> Vec2 { +fn advance( + Params { + a, + b, + c, + d, + attractor, + }: Params, + point: Vec2, +) -> Vec2 { + let x = point.x; + let y = point.y; + + // clifford attractor // xn+1 = sin(a yn) + c cos(a xn) // yn+1 = sin(b xn) + d cos(b yn) - vec2( - (params.a * point.y).sin() + (params.a * point.x).cos() * params.c, - (params.b * point.x).sin() + (params.b * point.y).cos() * params.d, - ) + + // de Jong + // xn+1 = sin(a yn) - cos(b xn) + // yn+1 = sin(c xn) - cos(d yn) + + match attractor { + Attractor::Clifford => vec2( + (a * y).sin() + (a * x).cos() * c, + (b * x).sin() + (b * y).cos() * d, + ), + Attractor::DeJong => vec2((a * y).sin() - (b * x).cos(), (c * x).sin() - (d * y).cos()), + } } fn update(app: &App, model: &mut Model, _update: Update) { @@ -120,7 +159,7 @@ fn view(app: &App, model: &Model, frame: Frame) { } for &p in &model.points { - let h = random_range(model.base_hue, model.base_hue + 120.0) / 360.0; + let h = random_range(model.base_hue, model.base_hue + 60.0) / 360.0; draw.ellipse() .radius(0.2) .xy(150.0 * p)