splinosaurus 0.2.2

flexible spline and surface library
Documentation
use nalgebra::Vector3;
use obj::{Group, IndexTuple, ObjData, Object, SimplePolygon};
use splinosaurus::control_points::ControlGrid;
use splinosaurus::export::Triangulation;
use splinosaurus::surfaces::BSurface;

fn main() {
    let mut grid = ControlGrid::new(
        2,
        3,
        vec![
            //
            Vector3::new(100., 100., 100.),
            Vector3::new(200., 100., 100.),
            Vector3::new(300., 100., 100.),
            //
            Vector3::new(100., 200., 100.),
            Vector3::new(200., 200., 300.),
            Vector3::new(300., 200., 100.),
            //
            Vector3::new(100., 300., 100.),
            Vector3::new(200., 300., 100.),
            Vector3::new(300., 500., 100.),
        ],
    );
    grid.set_u_wrapping(true);

    let surface = BSurface::new(grid);

    let t = Triangulation::new(0.1, &surface);

    let mut data = ObjData::default();
    data.position = Vec::from_iter(t.points().iter().map(|p| [p.x, p.y, p.z]));
    data.normal = Vec::from_iter(t.normals().iter().map(|p| [p.x, p.y, p.z]));
    data.objects.push(Object {
        name: "surface".to_string(),
        groups: vec![Group {
            name: "mesh".to_string(),
            index: 0,
            material: None,
            polys: Vec::from_iter(t.indexed_triangles().iter().map(|t| {
                SimplePolygon(vec![
                    IndexTuple(t[0], None, None),
                    IndexTuple(t[1], None, None),
                    IndexTuple(t[2], None, None),
                ])
            })),
        }],
    });

    data.save("a.obj").unwrap();
}