# [−][src]Trait plexus::graph::GraphGeometry

pub trait GraphGeometry: Sized {
type Vertex: Copy;
type Arc: Copy + Default;
type Edge: Copy + Default;
type Face: Copy + Default;
}

Graph geometry.

Specifies the types used to represent geometry for vertices, arcs, edges, and faces in a graph. Arbitrary types can be used, including () for no geometry at all.

Geometric operations depend on understanding the positional data in vertices exposed by the AsPosition trait. If the Vertex type implements AsPosition, then geometric operations supported by the Position type are exposed by graph APIs.

# Examples

use decorum::N64;
use nalgebra::{Point3, Vector4};
use num::Zero;
use plexus::graph::{GraphGeometry, MeshGraph};
use plexus::prelude::*;
use plexus::primitive::generate::Position;
use plexus::primitive::sphere::UvSphere;
use plexus::{AsPosition, IntoGeometry};

// Vertex-only geometry with position and color data.
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
pub struct Vertex {
pub position: Point3<N64>,
pub color: Vector4<N64>,
}

impl GraphGeometry for Vertex {
type Vertex = Self;
type Arc = ();
type Edge = ();
type Face = ();
}

impl AsPosition for Vertex {
type Position = Point3<N64>;

fn as_position(&self) -> &Self::Position {
&self.position
}

fn as_position_mut(&mut self) -> &mut Self::Position {
&mut self.position
}
}

// Create a mesh from a sphere primitive and map the geometry data.
let mut graph = UvSphere::new(8, 8)
.polygons::<Position<Point3<N64>>>()
.map_vertices(|position| Vertex {
position,
color: Zero::zero(),
})
.collect::<MeshGraph<Vertex>>();