1
mirror of https://github.com/ricoriedel/wipe.git synced 2025-04-11 01:48:26 +00:00
wipe/src/animation/rhombus.rs
2022-04-15 07:50:34 +02:00

52 lines
1.3 KiB
Rust

use crate::animation::Animation;
use crate::vec::Vector;
const THICKNESS: f32 = 0.2;
const FINAL_DISTANCE: f32 = 1.0 + THICKNESS * 2.0;
/// An animation of an expanding rhombus.
pub struct RhombusAnimation {
center: Vector,
thickness: f32,
final_distance: f32,
}
impl RhombusAnimation {
pub fn new(size: Vector) -> Self {
let center = size.center();
let distance = center.sum();
Self {
center,
thickness: distance * THICKNESS,
final_distance: distance * FINAL_DISTANCE,
}
}
}
impl Animation for RhombusAnimation {
fn sample(&self, step: f32, pos: Vector) -> f32 {
let dist = self.final_distance * step - self.thickness;
let pos_dist = (self.center - pos).abs().sum();
(pos_dist - dist) / self.thickness
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn sample() {
let anim = RhombusAnimation::new(Vector::new(30.0, 10.0));
let sample_1 = anim.sample(0.2, Vector::new(5.0, 16.0));
let sample_2 = anim.sample(0.7, Vector::new(22.0, 2.0));
let sample_3 = anim.sample(0.5, Vector::new(4.0, 7.0));
assert!(4.8 < sample_1 && sample_1 < 4.9);
assert!(-1.5 < sample_2 && sample_2 < -1.4);
assert!(0.7 < sample_3 && sample_3 < 0.8);
}
}