bezier/
bezier.rs

1use geom3d::{
2    surface::{BezierSurface, SurfacePatch},
3    Float, Grid, Model, Point3,
4};
5
6fn load_teapot(
7    division: (usize, usize),
8) -> std::io::Result<Model<SurfacePatch<BezierSurface<Point3>>>> {
9    use std::fs::File;
10    use std::io::{BufRead, BufReader};
11    use std::path::Path;
12    use std::str::FromStr;
13
14    let file = Path::new(&std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("assets/teapot.bpt");
15    let reader = BufReader::new(File::open(file)?);
16
17    let mut model = Model::new();
18    let mut points = Vec::new();
19    let mut current_cols = 0;
20
21    for line in reader.lines() {
22        let numbers = line?;
23        let items = numbers.split_whitespace().collect::<Vec<_>>();
24        if items.len() == 1 {
25            model
26                .faces
27                .reserve_exact(usize::from_str(items[0]).unwrap());
28        } else if items.len() == 2 {
29            if points.len() > 0 {
30                let surface = SurfacePatch {
31                    surface: BezierSurface::new(Grid::from_vec(points, current_cols)),
32                    parameter_range: ((0.0, 1.0), (0.0, 1.0)),
33                    parameter_division: division,
34                };
35                model.add_face(surface);
36            }
37            let m = usize::from_str(items[0]).unwrap();
38            let n = usize::from_str(items[1]).unwrap();
39            points = Vec::with_capacity((m + 1) * (n + 1));
40            current_cols = n + 1;
41        } else if items.len() == 3 {
42            let point = Point3::new(
43                Float::from_str(items[0]).unwrap(),
44                Float::from_str(items[1]).unwrap(),
45                Float::from_str(items[2]).unwrap(),
46            );
47            points.push(point);
48        }
49    }
50    // add last surface
51    let surface = SurfacePatch {
52        surface: BezierSurface::new(Grid::from_vec(points, current_cols)),
53        parameter_range: ((0.0, 1.0), (0.0, 1.0)),
54        parameter_division: division,
55    };
56    model.add_face(surface);
57    Ok(model)
58}
59
60fn main() {
61    let teapot = load_teapot((16, 16)).unwrap();
62    teapot.save_as_stl("teapot.stl").unwrap();
63    teapot.save_as_obj("teapot.obj").unwrap();
64}