pub struct Surface { /* private fields */ }Expand description
A two-dimensional shape
Implementations§
source§impl Surface
impl Surface
sourcepub fn new(geometry: SurfaceGeometry) -> Self
pub fn new(geometry: SurfaceGeometry) -> Self
Construct an instance of Surface
Examples found in repository?
More examples
src/objects/stores.rs (lines 114-117)
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
fn default() -> Self {
let mut store: Store<Surface> = Store::new();
let xy_plane = store.reserve();
store.insert(
xy_plane.clone(),
Surface::new(SurfaceGeometry {
u: GlobalPath::x_axis(),
v: Vector::unit_y(),
}),
);
let xz_plane = store.reserve();
store.insert(
xz_plane.clone(),
Surface::new(SurfaceGeometry {
u: GlobalPath::x_axis(),
v: Vector::unit_z(),
}),
);
let yz_plane = store.reserve();
store.insert(
yz_plane.clone(),
Surface::new(SurfaceGeometry {
u: GlobalPath::y_axis(),
v: Vector::unit_z(),
}),
);
Self {
store,
xy_plane,
xz_plane,
yz_plane,
}
}sourcepub fn geometry(&self) -> SurfaceGeometry
pub fn geometry(&self) -> SurfaceGeometry
Access the surface’s geometry
Examples found in repository?
More examples
src/algorithms/intersect/surface_surface.rs (line 75)
73 74 75 76 77 78 79 80 81 82 83 84
fn plane_from_surface(surface: &Surface) -> Plane {
let (line, path) = {
let line = match surface.geometry().u {
GlobalPath::Line(line) => line,
_ => todo!("Only plane-plane intersection is currently supported."),
};
(line, surface.geometry().v)
};
Plane::from_parametric(line.origin(), line.direction(), path)
}src/validate/vertex.rs (line 161)
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
fn check_position(
surface_vertex: &SurfaceVertex,
config: &ValidationConfig,
) -> Result<(), Self> {
let surface_position_as_global = surface_vertex
.surface()
.geometry()
.point_from_surface_coords(surface_vertex.position());
let global_position = surface_vertex.global_form().position();
let distance = surface_position_as_global.distance_to(&global_position);
if distance > config.identical_max_distance {
return Err(Self::PositionMismatch {
surface_vertex: surface_vertex.clone(),
global_vertex: surface_vertex.global_form().clone_object(),
surface_position_as_global,
distance,
});
}
Ok(())
}src/algorithms/sweep/face.rs (line 29)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
fn sweep_with_cache(
self,
path: impl Into<Vector<3>>,
cache: &mut SweepCache,
objects: &mut Service<Objects>,
) -> Self::Swept {
let path = path.into();
let mut faces = Vec::new();
let is_negative_sweep = {
let u = match self.surface().geometry().u {
GlobalPath::Circle(_) => todo!(
"Sweeping from faces defined in round surfaces is not \
supported"
),
GlobalPath::Line(line) => line.direction(),
};
let v = self.surface().geometry().v;
let normal = u.cross(&v);
normal.dot(&path) < Scalar::ZERO
};
let bottom_face = {
if is_negative_sweep {
self.clone()
} else {
self.clone().reverse(objects)
}
};
faces.push(bottom_face);
let top_face = {
let mut face = self.clone().translate(path, objects);
if is_negative_sweep {
face = face.reverse(objects);
};
face
};
faces.push(top_face);
// Generate side faces
for cycle in self.all_cycles() {
for half_edge in cycle.half_edges() {
let half_edge = if is_negative_sweep {
half_edge.clone().reverse(objects)
} else {
half_edge.clone()
};
let face = (half_edge, self.color())
.sweep_with_cache(path, cache, objects);
faces.push(face);
}
}
let faces = faces.into_iter().map(Partial::from).collect();
PartialShell { faces }.build(objects).insert(objects)
}src/algorithms/sweep/curve.rs (line 24)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
fn sweep_with_cache(
self,
path: impl Into<Vector<3>>,
_: &mut SweepCache,
objects: &mut Service<Objects>,
) -> Self::Swept {
match self.surface().geometry().u {
GlobalPath::Circle(_) => {
// Sweeping a `Curve` creates a `Surface`. The u-axis of that
// `Surface` is a `GlobalPath`, which we are computing below.
// That computation might or might not work with an arbitrary
// surface. Probably not, but I'm not sure.
//
// What definitely won't work, is computing the bottom edge of
// the sweep. The edge sweeping code currently assumes that the
// bottom edge is a line (which is true when sweeping from a
// flat surface). But is the surface we're sweeping from is
// curved, there's simply no way to represent the curve of the
// resulting bottom edge.
todo!(
"Sweeping a curve that is defined on a curved surface is \
not supported yet."
)
}
GlobalPath::Line(_) => {
// We're sweeping from a curve on a flat surface, which is
// supported. Carry on.
}
}
let u = match self.path() {
SurfacePath::Circle(circle) => {
let center = self
.surface()
.geometry()
.point_from_surface_coords(circle.center());
let a = self
.surface()
.geometry()
.vector_from_surface_coords(circle.a());
let b = self
.surface()
.geometry()
.vector_from_surface_coords(circle.b());
let circle = Circle::new(center, a, b);
GlobalPath::Circle(circle)
}
SurfacePath::Line(line) => {
let origin = self
.surface()
.geometry()
.point_from_surface_coords(line.origin());
let direction = self
.surface()
.geometry()
.vector_from_surface_coords(line.direction());
let line = Line::from_origin_and_direction(origin, direction);
GlobalPath::Line(line)
}
};
PartialSurface::from_axes(u, path)
.build(objects)
.insert(objects)
}Additional examples can be found in:
Trait Implementations§
source§impl HasPartial for Surface
impl HasPartial for Surface
§type Partial = PartialSurface
type Partial = PartialSurface
The type representing the partial variant of this object
source§impl Ord for Surface
impl Ord for Surface
source§impl PartialEq<Surface> for Surface
impl PartialEq<Surface> for Surface
source§impl PartialOrd<Surface> for Surface
impl PartialOrd<Surface> for Surface
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self and other) and is used by the <=
operator. Read moresource§impl TransformObject for Surface
impl TransformObject for Surface
source§fn transform_with_cache(
self,
transform: &Transform,
_: &mut Service<Objects>,
_: &mut TransformCache
) -> Self
fn transform_with_cache(
self,
transform: &Transform,
_: &mut Service<Objects>,
_: &mut TransformCache
) -> Self
Transform the object using the provided cache
source§fn transform(self, transform: &Transform, objects: &mut Service<Objects>) -> Self
fn transform(self, transform: &Transform, objects: &mut Service<Objects>) -> Self
Transform the object
impl Copy for Surface
impl Eq for Surface
impl StructuralEq for Surface
impl StructuralPartialEq for Surface
Auto Trait Implementations§
impl RefUnwindSafe for Surface
impl Send for Surface
impl Sync for Surface
impl Unpin for Surface
impl UnwindSafe for Surface
Blanket Implementations§
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.