From 9647d1b3b2863e6b185418778ec0b59b0bd8b228 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Wed, 1 Nov 2023 09:37:10 -0500 Subject: [PATCH] extracted wing generation to function --- src/constants.rs | 2 +- src/main.rs | 65 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/constants.rs b/src/constants.rs index ad81c84..351ac36 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -6,7 +6,7 @@ pub const CHORD: f32 = 11.2 * IN2MM; pub const WINGSPAN: f32 = 45.0 * IN2MM; pub const LENGTH: f32 = 0.0; /// strut count in the main wing -pub const STRUTS: usize = 6; +pub const STRUTS: usize = 20; pub const CARDBOARD_WIDTH: f32 = 2.4; /// length of each side of the triangular spar pub const SPAR_SIDE_WIDTH: f32 = 0.75 * IN2MM; diff --git a/src/main.rs b/src/main.rs index b4d3cca..1ebe8df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,30 +21,20 @@ fn main() { // symetric airfoil, used in the control surfaces let evert: Airfoil = selig::parse(include_str!("../edgevertical.dat")); - let mut wing = scad!(Translate(vec3(0.0,0.0,0.0))); + let mut wing_transform = scad!(Translate(vec3(0.0,0.0,0.0))); // struts - for strut_idx in 0..STRUTS + 2 { - let port: bool = strut_idx % 2 == 1; - let out: usize = strut_idx/2; - - let mut spacing = WINGSPAN/STRUTS as f32 * out as f32 + FUSELAGE_GAP / 2.0; - - println!("{port} {out} {spacing}"); - - let falloff = 0.95f32.powf(spacing / 40.0); - - if port { spacing = -spacing }; - - let mut transform = scad!(Translate(vec3(0.0, spacing ,0.0))); - - let strut = strut(&e393, CHORD * falloff, CARDBOARD_WIDTH); - transform.add_child(strut); - wing.add_child(transform); + for port in [true,false] { + let mut wing = wing(&e393, STRUTS/2, WINGSPAN/2.0, CHORD, CHORD * 0.8); + wing = scad!(Translate(vec3(0.0, 10.0,0.0)); wing); + if port { + wing = scad!(Mirror(vec3(0.0, 1.0, 0.0)); wing); + } + wing_transform.add_child(wing); } // spars - scad_file.add_object(spar(WINGSPAN)); + scad_file.add_object(spar(WINGSPAN, true)); // rudder let mut rudder = scad!(Rotate(90.0, vec3(1.0, 0.0, 0.0))); @@ -53,7 +43,7 @@ fn main() { scad_file.add_object(rudder); let cardboard = vec3(0.38, 0.26, 0.26); - scad_file.add_object(scad!(Color(cardboard); wing)); + scad_file.add_object(scad!(Color(cardboard); wing_transform)); scad_file.write_to_file(String::from("build/assembly.scad")); @@ -91,11 +81,16 @@ fn strut(airfoil: &Airfoil, chord: f32, width: f32) -> ScadObject { rotated } -fn spar(length: f32) -> ScadObject { +fn spar(length: f32, center: bool) -> ScadObject { let mut spar = scad!(Union); + register_part(scad!(Square(vec2(length, SPAR_SIDE_WIDTH * 3.0)))); + for i in 0..3 { - let panel = scad!(Cube(vec3(SPAR_SIDE_WIDTH, length, CARDBOARD_WIDTH))); + let mut panel = scad!(Cube(vec3(SPAR_SIDE_WIDTH, length, CARDBOARD_WIDTH))); + if center { + panel = scad!(Translate(vec3(0.0, -length/2.0, 0.0)); panel) + } let rot = 120.0 * i as f32; spar.add_child(scad!( Rotate(rot, vec3(0.0, 1.0, 0.0)); panel @@ -108,3 +103,29 @@ fn spar(length: f32) -> ScadObject { fn register_part(part: ScadObject) { PARTS.lock().unwrap().push(part); } + +fn lerp(a: f32, b:f32, x:f32) -> f32 { + a*(1.0-x) + b*x +} + +fn wing(aerofoil: &Airfoil, struts: usize, length: f32, chord: f32, taper: f32) -> ScadObject { + let mut wing = scad!(Translate(vec3(0.0,0.0,0.0))); + + // struts + for strut_idx in 0..struts + 1 { + + let gap = length/struts as f32; + + let chord = lerp(chord, taper, strut_idx as f32 / struts as f32); + + let spacing = strut_idx as f32 * gap; + + let mut transform = scad!(Translate(vec3(0.0, spacing ,0.0))); + + let strut = strut(&aerofoil, chord, CARDBOARD_WIDTH); + transform.add_child(strut); + wing.add_child(transform); + } + + wing +}