Render both stalk and cap as cynlinders.
This commit is contained in:
1 parent
b49610be92
commit
fa7b9345fe
2 files changed
+36
-12
No files matched your search
+3
-4
@@ -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
@@ -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(¢er, &edge);
|
return tube_base(¢er, &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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user