1
Fork 0

airfoil as trait

This commit is contained in:
Andy Killorin 2023-11-04 16:43:32 -05:00
parent d221f8640b
commit dc35cddb79
No known key found for this signature in database
GPG key ID: 8CB11B45B690DC2A
2 changed files with 33 additions and 14 deletions

View file

@ -1,8 +1,10 @@
use std::ops::Deref;
use std::sync::Mutex;
use nalgebra::Vector3;
use scad::*;
use constants::*;
use selig::Airfoil;
use selig::SeligFile;
use selig::Point;
use std::ops::Range;
@ -19,13 +21,13 @@ fn main() {
// cambered airfoil, used in the wing
let wing_airfoil: SeligFile = SeligFile::parse(include_str!("../ag24.dat"));
println!("name {}, perim {}", wing_airfoil.get_name(), wing_airfoil.perimiter());
println!("name {}, perim {}", wing_airfoil.get_name(), wing_airfoil.get_points().perimiter());
println!("desc {}", wing_airfoil.get_description().clone().unwrap_or("no desc".to_string()));
//println!("span {:?}", points_in_range(wing_airfoil.get_points()[0..80], 0.0..1.0));
let points = &wing_airfoil.get_points()[0..80];
let perimeter = span_length(points);
let span = points_in_range(&Vec::from(points), perimeter * 0.4.. perimeter);
let points = wing_airfoil.get_points()[0..80].to_vec();
let perimeter = points.perimiter();
let span = points_in_range(&Vec::from(points.to_vec()), perimeter * 0.4.. perimeter);
let points = scad::PolygonParameters::new(span);
register_part(scad!(Polygon(points)));
@ -124,7 +126,7 @@ enum SparType {
/// returns a extruded airfoil with the given dimensions
fn strut(airfoil: &SeligFile, chord: f32, width: f32, spar: &SparType) -> ScadObject {
let aerofoil = scad::PolygonParameters::new(airfoil.get_points().clone());
let aerofoil = scad::PolygonParameters::new(airfoil.get_points().to_vec());
let shape = scad!(Polygon(aerofoil));
let strut_hole = {
@ -170,7 +172,7 @@ fn topspar_negative(airfoil: &SeligFile, chord: f32, range: Range<f32>) -> ScadO
let points = &points[0.. points.len() / 2];
let perimeter = span_length(points);
let span = points_in_range(&Vec::from(points), perimeter * (1.0-range.end) .. perimeter * (1.0-range.start));
let span = points_in_range(&points.deref().to_vec(), perimeter * (1.0-range.end) .. perimeter * (1.0-range.start));
let mut mask = scad!(Union);
@ -288,6 +290,7 @@ fn topwing_spar(aerofoil: &SeligFile, struts: usize, length: f32, chord: f32, ta
wing
}
pub fn points_in_range(input: &Vec<Point>, range: Range<f32>) -> Vec<Point> {
let mut last_point: Option<Point> = None;
let mut distance: f32 = 0.0;

View file

@ -1,14 +1,16 @@
use std::ops::Range;
use std::ops::RangeFull;
use std::ops::Deref;
use std::ops::Index;
use nalgebra::Vector2;
pub type Point = Vector2<f32>;
pub type Airfoil = Vec<Point>;
pub struct SeligFile {
name: String,
description: Option<String>,
data: Airfoil,
data: Vec<Point>,
}
impl SeligFile {
@ -33,7 +35,7 @@ impl SeligFile {
}
}
pub fn get_points(&self) -> &Airfoil {
pub fn get_points(&self) -> &Vec<Point> {
&self.data
}
@ -47,12 +49,13 @@ impl SeligFile {
}
impl Airfoil {
pub fn perimiter(&self) -> f32 {
self.span_length(&self.get_points()[..])
}
pub trait Airfoil {
fn perimiter(&self) -> f32;
}
fn span_length(&self, points: &[Point]) -> f32 {
impl Airfoil for Vec<Point> {
fn perimiter(&self) -> f32 {
let points = self;
let mut last_point: Option<Point> = None;
let mut distance: f32 = 0.0;
for point in points {
@ -64,3 +67,16 @@ impl Airfoil {
distance
}
}
#[cfg(test)]
mod tests {
use super::{Airfoil, SeligFile};
#[test]
fn full_perimiter() {
let airfoil = SeligFile::parse(include_str!("../ag24.dat"));
let airfoil = airfoil.get_points();
assert_ne!(airfoil.perimiter(), airfoil[0..80].to_vec().perimiter());
}
}