From e90f330a5eea9d381c27ce3c5740c3e36e191e12 Mon Sep 17 00:00:00 2001 From: Don Garrett Date: Thu, 13 Jun 2024 11:15:22 -0500 Subject: [PATCH] Add support for CapStyle::Dome. --- src/layers.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/layers.rs b/src/layers.rs index a15fbf0..67a12c5 100644 --- a/src/layers.rs +++ b/src/layers.rs @@ -1,6 +1,6 @@ use stl_io::{self, Vertex}; -use crate::mushroom::Mushroom; +use crate::mushroom::{CapStyle, Mushroom}; #[derive(Debug, PartialEq, Clone)] pub struct Layer { @@ -53,7 +53,7 @@ fn stalk_layers(mushroom: &Mushroom, base: &Vertex, _resolution: f32) -> Vec Vec { +fn cap_layers_cylinder(mushroom: &Mushroom, base: &Vertex) -> Vec { let top = Vertex::new([base[0], base[1], base[2] + mushroom.cap_h]); return [ @@ -69,6 +69,38 @@ fn cap_layers(mushroom: &Mushroom, base: &Vertex, _resolution: f32) -> Vec Vec { + let mut result: Vec = Vec::with_capacity((mushroom.cap_h / resolution) as usize); + + let mut height = 0.0; + loop { + // A = mushroom.cap_h + // B = mushroom.cap_r + // x=B/π * arccos(y/A) + let radius = (mushroom.cap_r / std::f32::consts::PI) * (height / mushroom.cap_h).acos(); + + result.push(Layer { + center: Vertex::new([base[0], base[1], base[2] + height]), + radius: radius, + }); + + height += resolution; + if height >= mushroom.cap_h { + break; + } + } + + return result; +} + +fn cap_layers(mushroom: &Mushroom, base: &Vertex, resolution: f32) -> Vec { + match mushroom.cap_style { + CapStyle::Cylinder => cap_layers_cylinder(mushroom, base), + CapStyle::Dome => cap_layers_dome(mushroom, base, resolution), + CapStyle::Pointed => cap_layers_dome(mushroom, base, resolution), + } +} + pub fn mushroom(mushroom: &Mushroom, resolution: f32) -> Layers { let _vertical_steps = (mushroom.height() / resolution) as u32;