Render both stalk and cap as cynlinders.

This commit is contained in:
dongar committed 2024-06-09 21:55:18 -05:00
1 parent b49610be92
commit fa7b9345fe
2 files changed
+36 -12

No files matched your search

+3 -4
View File
@@ -5,7 +5,6 @@ use self::mushroom::Mushroom;
use clap::Parser; use clap::Parser;
use std::fs::OpenOptions; use std::fs::OpenOptions;
#[macro_use]
extern crate approx; extern crate approx;
// TODO: Investigate https://github.com/virtualritz/polyhedron-ops. // TODO: Investigate https://github.com/virtualritz/polyhedron-ops.
@@ -80,7 +79,8 @@ fn main() {
let mushroom = mushroom_from_args(&args); let mushroom = mushroom_from_args(&args);
// Render the mushroom. // Render the mushroom.
let mesh = render::cylinder(mushroom.stalk_h, mushroom.stalk_d, 128); // let mesh = render::cylinder(mushroom.stalk_h, mushroom.stalk_d, 128);
let mesh = render::mushroom(&mushroom);
// Save output to file. // Save output to file.
let mut file = OpenOptions::new() let mut file = OpenOptions::new()
@@ -91,8 +91,7 @@ fn main() {
.unwrap(); .unwrap();
stl_io::write_stl(&mut file, mesh.iter()).unwrap(); stl_io::write_stl(&mut file, mesh.iter()).unwrap();
println!("From: {:?}", mushroom); println!("Generated from: {:?}", mushroom);
println!("Generated:\n{:?}", mesh);
} }
#[cfg(test)] #[cfg(test)]
+33 -8
View File
@@ -1,5 +1,7 @@
use stl_io::{self, Normal, Triangle, Vertex}; use stl_io::{self, Normal, Triangle, Vertex};
use crate::mushroom::Mushroom;
fn new_triangle(p1: &Vertex, p2: &Vertex, p3: &Vertex) -> stl_io::Triangle { fn new_triangle(p1: &Vertex, p2: &Vertex, p3: &Vertex) -> stl_io::Triangle {
// Set Vector U to (Triangle.p2 minus Triangle.p1) // Set Vector U to (Triangle.p2 minus Triangle.p1)
// Set Vector V to (Triangle.p3 minus Triangle.p1) // Set Vector V to (Triangle.p3 minus Triangle.p1)
@@ -78,17 +80,40 @@ fn tube_top(center: &Vertex, edge: &Vec<Vertex>) -> Vec<Triangle> {
return tube_base(&center, &edge); return tube_base(&center, &edge);
} }
pub fn cylinder(height: f32, radius: f32, steps: u32) -> Vec<Triangle> { pub fn mushroom(mushroom: &Mushroom) -> Vec<Triangle> {
let base_center = Vertex::new([0.0, 0.0, 0.0]); // Max size of any flat surface in mm.
let base_edge = vertexes_on_circle(&base_center, radius, steps); let resolution: f32 = 1.0;
let top_center = Vertex::new([0.0, 0.0, height]);
let top_edge = vertexes_on_circle(&top_center, radius, steps); // We always use the same number of diameter steps to ensure the number of circular vertices doesn't change,
// which might create small breaks in our model.
let diameter_steps = std::cmp::max(
(mushroom.cap_d * std::f32::consts::TAU * resolution) as u32,
64,
);
let stalk_base_center = Vertex::new([0.0, 0.0, 0.0]);
let stalk_base_edge = vertexes_on_circle(&stalk_base_center, mushroom.stalk_d, diameter_steps);
let stalk_top_center = Vertex::new([
stalk_base_center[0],
stalk_base_center[1],
stalk_base_center[2] + mushroom.stalk_h,
]);
let stalk_top_edge = vertexes_on_circle(&stalk_top_center, mushroom.stalk_d, diameter_steps);
let cap_base_edge = vertexes_on_circle(&stalk_top_center, mushroom.cap_d, diameter_steps);
let cap_top_center = Vertex::new([
stalk_top_center[0],
stalk_top_center[1],
stalk_top_center[2] + mushroom.cap_h,
]);
let cap_top_edge = vertexes_on_circle(&cap_top_center, mushroom.cap_d, diameter_steps);
let mut result = Vec::new(); let mut result = Vec::new();
result.append(&mut tube_base(&base_center, &base_edge)); result.append(&mut tube_base(&stalk_base_center, &stalk_base_edge));
result.append(&mut tube_sides(&base_edge, &top_edge)); result.append(&mut tube_sides(&stalk_base_edge, &stalk_top_edge));
result.append(&mut tube_top(&top_center, &top_edge)); result.append(&mut tube_sides(&stalk_top_edge, &cap_base_edge));
result.append(&mut tube_sides(&cap_base_edge, &cap_top_edge));
result.append(&mut tube_top(&cap_top_center, &cap_top_edge));
return result; return result;
} }