
📝 Rust Code
use nannou::prelude::*;
const WIDTH: f32 = 800.0;
const HEIGHT: f32 = 800.0;
fn main() {
nannou::app(model).update(update).run();
}
struct MovingPoint {
pos: Vec2,
vel: Vec2,
}
struct Model {
p1: MovingPoint,
p2: MovingPoint,
width: f32,
height: f32,
}
fn model(app: &App) -> Model {
let _window_id = app
.new_window()
.size(WIDTH as u32, HEIGHT as u32)
.title("Nannou Line Trail - HSLA")
.view(view)
.build()
.unwrap();
let p1 = MovingPoint {
pos: vec2(-100.0, 0.0),
vel: vec2(60.0, 25.0),
};
let p2 = MovingPoint {
pos: vec2(120.0, 60.0),
vel: vec2(-50.0, -80.0),
};
Model {
p1,
p2,
width: WIDTH,
height: HEIGHT,
}
}
fn update(_app: &App, model: &mut Model, update: Update) {
let dt = update.since_last.as_secs_f32();
for mp in [&mut model.p1, &mut model.p2] {
mp.pos += mp.vel * dt;
let half_w = model.width / 2.0;
let half_h = model.height / 2.0;
if mp.pos.x > half_w {
mp.pos.x = half_w;
mp.vel.x *= -1.0;
} else if mp.pos.x < -half_w {
mp.pos.x = -half_w;
mp.vel.x *= -1.0;
}
if mp.pos.y > half_h {
mp.pos.y = half_h;
mp.vel.y *= -1.0;
} else if mp.pos.y < -half_h {
mp.pos.y = -half_h;
mp.vel.y *= -1.0;
}
}
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
let overlay = hsla(0.0, 0.0, 0.0, 0.06);
draw.rect().w_h(model.width, model.height).color(overlay);
let white = hsla(0.0, 0.0, 1.0, 1.0);
draw.line().start(model.p1.pos).end(model.p2.pos).stroke_weight(2.0).color(white);
draw.to_frame(app, &frame).unwrap();
}
use nannou::prelude::*;
const WIDTH: f32 = 800.0;
const HEIGHT: f32 = 800.0;
fn main() {
nannou::app(model).update(update).run();
}
struct MovingPoint {
pos: Vec2,
vel: Vec2,
}
struct Model {
p1: MovingPoint,
p2: MovingPoint,
width: f32,
height: f32,
}
fn model(app: &App) -> Model {
let _window_id = app
.new_window()
.size(WIDTH as u32, HEIGHT as u32)
.title("Nannou Line Trail - HSLA")
.view(view)
.build()
.unwrap();
let p1 = MovingPoint {
pos: vec2(-100.0, 0.0),
vel: vec2(60.0, 25.0),
};
let p2 = MovingPoint {
pos: vec2(120.0, 60.0),
vel: vec2(-50.0, -80.0),
};
Model {
p1,
p2,
width: WIDTH,
height: HEIGHT,
}
}
fn update(_app: &App, model: &mut Model, update: Update) {
let dt = update.since_last.as_secs_f32();
for mp in [&mut model.p1, &mut model.p2] {
mp.pos += mp.vel * dt;
let half_w = model.width / 2.0;
let half_h = model.height / 2.0;
if mp.pos.x > half_w {
mp.pos.x = half_w;
mp.vel.x *= -1.0;
} else if mp.pos.x < -half_w {
mp.pos.x = -half_w;
mp.vel.x *= -1.0;
}
if mp.pos.y > half_h {
mp.pos.y = half_h;
mp.vel.y *= -1.0;
} else if mp.pos.y < -half_h {
mp.pos.y = -half_h;
mp.vel.y *= -1.0;
}
}
}
fn view(app: &App, model: &Model, frame: Frame) {
let draw = app.draw();
let overlay = hsla(0.0, 0.0, 0.0, 0.06);
draw.rect()
.w_h(model.width, model.height)
.color(overlay);
let white = hsla(0.0, 0.0, 1.0, 1.0);
draw.line()
.start(model.p1.pos)
.end(model.p2.pos)
.stroke_weight(2.0)
.color(white);
draw.to_frame(app, &frame).unwrap();
}