From 4de0171bd38c416bdb7215e73d37f9ed6b30db26 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:01:59 -0500 Subject: [PATCH] switched to airfoil struct --- src/main.rs | 7 ++++--- src/selig.rs | 55 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index 107785e..fc7e8cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,10 +16,11 @@ fn main() { scad_file.set_detail(50); // cambered airfoil, used in the wing - let wing_airfoil: Airfoil = selig::parse(include_str!("../ag24.dat")); + let wing_airfoil: Airfoil = Airfoil::parse(include_str!("../ag24.dat")); + println!("perim {}, name {}", wing_airfoil.get_name(), wing_airfoil.perimiter()); // symetric airfoil, used in the control surfaces - let control_airfoil: Airfoil = selig::parse(include_str!("../edgevertical.dat")); + let control_airfoil: Airfoil = Airfoil::parse(include_str!("../edgevertical.dat")); let mut wing_transform = scad!(Translate(vec3(0.0,0.0,0.0))); @@ -86,7 +87,7 @@ fn main() { /// returns a extruded airfoil with the given dimensions fn strut(airfoil: &Airfoil, chord: f32, width: f32) -> ScadObject { - let aerofoil = scad::PolygonParameters::new(airfoil.clone()); + let aerofoil = scad::PolygonParameters::new(airfoil.get_points().clone()); let shape = scad!(Polygon(aerofoil)); let extrude = LinExtrudeParams { diff --git a/src/selig.rs b/src/selig.rs index a1bd997..ddebac6 100644 --- a/src/selig.rs +++ b/src/selig.rs @@ -2,16 +2,47 @@ use nalgebra::Vector2; pub type Point = Vector2; -pub type Airfoil = Vec; - -pub fn parse(file: &str) -> Airfoil { - let mut points = Vec::new(); - - for line in file.lines().skip(1) { - let mut numbers =line.split(" ").filter(|n| !n.trim().is_empty()); - let x = numbers.next().unwrap().parse().unwrap(); - let y = numbers.next().unwrap().parse().unwrap(); - points.push(Point::new(x,y)) - } - points +pub struct Airfoil { + name: String, + data: Vec, +} + +impl Airfoil { + pub fn parse(file: &str) -> Airfoil { + let mut points = Vec::new(); + + let mut lines = file.lines(); + let name = lines.next().expect("selig .dat is empty").to_string(); + + for line in lines { + let mut numbers =line.split(" ").filter(|n| !n.trim().is_empty()); + let x = numbers.next().unwrap().parse().unwrap(); + let y = numbers.next().unwrap().parse().unwrap(); + points.push(Point::new(x,y)) + } + Airfoil { + name, + data: points + } + } + + pub fn get_points(&self) -> &Vec { + &self.data + } + + pub fn get_name(&self) -> &str { + &self.name + } + + pub fn perimiter(&self) -> f32 { + let mut last_point: Option = None; + let mut distance: f32 = 0.0; + for point in self.get_points() { + if let Some(last) = last_point { + distance += (last - point).magnitude(); + } + last_point = Some(point.clone()); + } + distance + } }