pub fn try_wire_homotopy(wire0: &Wire, wire1: &Wire) -> Result<Shell>
Expand description

Returns a homotopic shell from wire0 to wire1.

Examples

// connecting two squares.
use truck_modeling::*;

let v00 = builder::vertex(Point3::new(0.0, 0.0, 0.0));
let v01 = builder::vertex(Point3::new(1.0, 0.0, 0.0));
let v02 = builder::vertex(Point3::new(2.0, 0.0, 0.0));
let v10 = builder::vertex(Point3::new(0.0, 1.0, 0.0));
let v11 = builder::vertex(Point3::new(1.0, 1.0, 0.0));
let v12 = builder::vertex(Point3::new(2.0, 1.0, 0.0));
let wire0: Wire = vec![
    builder::line(&v00, &v01),
    builder::line(&v01, &v02),
]
.into();
let wire1: Wire = vec![
    builder::line(&v10, &v11),
    builder::line(&v11, &v12),
]
.into();

let shell = builder::try_wire_homotopy(&wire0, &wire1).unwrap();
assert_eq!(shell.len(), 2);
let boundary = shell.extract_boundaries();
assert_eq!(boundary.len(), 1);
assert_eq!(boundary[0].len(), 6);
// a triangular tube
use truck_modeling::*;

let v00 = builder::vertex(Point3::new(0.0, 0.0, 0.0));
let v01 = builder::vertex(Point3::new(1.0, 0.0, 0.0));
let v02 = builder::vertex(Point3::new(0.5, 0.5, 0.0));
let v10 = builder::vertex(Point3::new(0.0, 0.0, 1.0));
let v11 = builder::vertex(Point3::new(1.0, 0.0, 1.0));
let v12 = builder::vertex(Point3::new(0.5, 0.5, 1.0));
let wire0: Wire = vec![
    builder::line(&v00, &v01),
    builder::line(&v01, &v02),
    builder::line(&v02, &v00),
]
.into();
let wire1: Wire = vec![
    builder::line(&v10, &v11),
    builder::line(&v11, &v12),
    builder::line(&v12, &v10),
]
.into();

let shell = builder::try_wire_homotopy(&wire0, &wire1).unwrap();
assert_eq!(shell.len(), 3);
let boundary = shell.extract_boundaries();
assert_eq!(boundary.len(), 2);
assert_eq!(boundary[0].len(), 3);
assert_eq!(boundary[1].len(), 3);

Failures

If the wires have different numbers of edges, then return Error::NotSameNumberOfEdges.

use truck_modeling::{*, errors::Error};

let v00 = builder::vertex(Point3::new(0.0, 0.0, 0.0));
let v01 = builder::vertex(Point3::new(1.0, 0.0, 0.0));
let v02 = builder::vertex(Point3::new(0.5, 0.5, 0.0));
let v10 = builder::vertex(Point3::new(0.0, 0.0, 1.0));
let v11 = builder::vertex(Point3::new(1.0, 0.0, 1.0));
let v12 = builder::vertex(Point3::new(0.5, 0.5, 1.0));
let wire0: Wire = vec![
    builder::line(&v00, &v01),
    builder::line(&v01, &v02),
]
.into();
let wire1: Wire = vec![
    builder::line(&v10, &v11),
    builder::line(&v11, &v12),
    builder::line(&v12, &v10),
]
.into();

assert!(matches!(
    builder::try_wire_homotopy(&wire0, &wire1),
    Err(Error::NotSameNumberOfEdges),
));