From 78a360ae89cd8731fd68ec85d298e60f1ac5ff5a Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 27 Jun 2021 10:20:21 -0700 Subject: [PATCH] More idiomatic constructors. --- rtchallenge/examples/eoc2.rs | 16 ++++++++-------- rtchallenge/src/canvas.rs | 26 +++++++++++++------------- rtchallenge/src/tuples.rs | 32 +++++++++++++++++--------------- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/rtchallenge/examples/eoc2.rs b/rtchallenge/examples/eoc2.rs index 4557631..9b7bc82 100644 --- a/rtchallenge/examples/eoc2.rs +++ b/rtchallenge/examples/eoc2.rs @@ -1,8 +1,8 @@ use anyhow::{bail, Result}; use rtchallenge::{ - canvas::{canvas, Canvas}, - tuples::{color, point, vector, Tuple}, + canvas::Canvas, + tuples::{Color, Tuple}, }; #[derive(Debug)] @@ -23,7 +23,7 @@ fn tick(env: &Environment, proj: &Projectile) -> Projectile { } fn draw_dot(c: &mut Canvas, x: usize, y: usize) { - let red = color(1., 0., 0.); + let red = Color::new(1., 0., 0.); c.set(x.saturating_sub(1), y.saturating_sub(1), red); c.set(x, y.saturating_sub(1), red); c.set(x + 1, y.saturating_sub(1), red); @@ -35,16 +35,16 @@ fn draw_dot(c: &mut Canvas, x: usize, y: usize) { c.set(x + 1, y + 1, red); } fn main() -> Result<()> { - let position = point(0., 1., 0.); - let velocity = vector(1., 1.8, 0.).normalize() * 11.25; + let position = Tuple::point(0., 1., 0.); + let velocity = Tuple::vector(1., 1.8, 0.).normalize() * 11.25; let mut p = Projectile { position, velocity }; - let gravity = vector(0., -0.1, 0.); - let wind = vector(-0.01, 0., 0.); + let gravity = Tuple::vector(0., -0.1, 0.); + let wind = Tuple::vector(-0.01, 0., 0.); let e = Environment { gravity, wind }; let w = 800; let h = 600; - let mut c = canvas(w, h); + let mut c = Canvas::new(w, h); let mut i = 0; let w = w as f32; let h = h as f32; diff --git a/rtchallenge/src/canvas.rs b/rtchallenge/src/canvas.rs index cffe1f8..cfba39e 100644 --- a/rtchallenge/src/canvas.rs +++ b/rtchallenge/src/canvas.rs @@ -5,7 +5,7 @@ use std::path::Path; use png; use thiserror::Error; -use crate::tuples::{color, Color}; +use crate::tuples::Color; #[derive(Error, Debug)] pub enum CanvasError { @@ -20,16 +20,16 @@ pub struct Canvas { pub pixels: Vec, } -pub fn canvas(width: usize, height: usize) -> Canvas { - let pixels = vec![color(0., 0., 0.); width * height]; - Canvas { - width, - height, - pixels, - } -} - impl Canvas { + pub fn new(width: usize, height: usize) -> Canvas { + let pixels = vec![Color::new(0., 0., 0.); width * height]; + Canvas { + width, + height, + pixels, + } + } + pub fn set(&mut self, x: usize, y: usize, c: Color) { if x > self.width { return; @@ -74,14 +74,14 @@ impl Canvas { mod tests { use super::canvas; - use crate::tuples::color; + use crate::tuples::Color; #[test] fn create_canvas() { let c = canvas(10, 20); assert_eq!(c.width, 10); assert_eq!(c.height, 20); - let black = color(0., 0., 0.); + let black = Color::new(0., 0., 0.); for (i, p) in c.pixels.iter().enumerate() { assert_eq!(p, &black, "pixel {} not {:?}: {:?}", i, &black, p); } @@ -90,7 +90,7 @@ mod tests { #[test] fn write_to_canvas() { let mut c = canvas(10, 20); - let red = color(1., 0., 0.); + let red = Color::new(1., 0., 0.); c.set(2, 3, red); assert_eq!(c.get(2, 3), red); } diff --git a/rtchallenge/src/tuples.rs b/rtchallenge/src/tuples.rs index 81ac045..ac4bd24 100644 --- a/rtchallenge/src/tuples.rs +++ b/rtchallenge/src/tuples.rs @@ -8,6 +8,18 @@ pub struct Tuple { } impl Tuple { + pub fn point(x: f32, y: f32, z: f32) -> Tuple { + Tuple::new(x, y, z, 1.0) + } + + pub fn vector(x: f32, y: f32, z: f32) -> Tuple { + Tuple::new(x, y, z, 0.0) + } + + pub fn new(x: f32, y: f32, z: f32, w: f32) -> Tuple { + Tuple { x, y, z, w } + } + pub fn is_point(&self) -> bool { self.w == 1.0 } @@ -101,23 +113,11 @@ impl Sub for Tuple { } } -pub fn point(x: f32, y: f32, z: f32) -> Tuple { - tuple(x, y, z, 1.0) -} - -pub fn vector(x: f32, y: f32, z: f32) -> Tuple { - tuple(x, y, z, 0.0) -} - -pub fn tuple(x: f32, y: f32, z: f32, w: f32) -> Tuple { - Tuple { x, y, z, w } -} - pub fn dot(a: Tuple, b: Tuple) -> f32 { a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w } pub fn cross(a: Tuple, b: Tuple) -> Tuple { - vector( + Tuple::vector( a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, @@ -130,8 +130,10 @@ pub struct Color { pub green: f32, pub blue: f32, } -pub fn color(red: f32, green: f32, blue: f32) -> Color { - Color { red, green, blue } +impl Color { + pub fn new(red: f32, green: f32, blue: f32) -> Color { + Color { red, green, blue } + } } impl Add for Color { type Output = Self;