boolmesh 0.1.6

Robust 3D mesh boolean library
Documentation
//--- Copyright (C) 2025 Saki Komikado <komietty@gmail.com>,
//--- This Source Code Form is subject to the terms of the Mozilla Public License v.2.0.

use crate::{Manifold, Vec3, Vec3u, Real};

pub fn generate_torus(
    major_radius: f64,
    minor_radius: f64,
    rings: usize,
    segments: usize
) -> Result<Manifold, String> {

    let mut ps = Vec::with_capacity(rings * segments);
    let mut ts = Vec::with_capacity(rings * segments * 6);

    for i in 0..rings {
        let u = i as f64 * 2. * std::f64::consts::PI / rings as f64;
        let (sin_u, cos_u) = u.sin_cos();

        for j in 0..segments {
            let v = j as f64 * 2. * std::f64::consts::PI / segments as f64;
            let (sin_v, cos_v) = v.sin_cos();
            let x = (major_radius + minor_radius * cos_v) * cos_u;
            let y = minor_radius * sin_v;
            let z = (major_radius + minor_radius * cos_v) * sin_u;
            ps.push(Vec3::new(x as Real, y as Real, z as Real));
        }
    }

    for i in 0..rings {
        let next_i = (i + 1) % rings;
        for j in 0..segments {
            let nj = (j + 1) % segments;
            let v0 = i * segments + j;
            let v1 = i * segments + nj;
            let v2 = next_i * segments + j;
            let v3 = next_i * segments + nj;
            ts.push(Vec3u::new(v0, v1, v2));
            ts.push(Vec3u::new(v1, v3, v2));
        }
    }

    Manifold::new_impl(ps, ts, None, None)
}