mirror of
https://github.com/hannobraun/Fornjot
synced 2025-05-10 12:58:28 +00:00
Merge pull request #2332 from hannobraun/boundary
Remove unused code related to `CurveBoundary`
This commit is contained in:
commit
df602477fe
@ -1,5 +1,5 @@
|
|||||||
use std::{
|
use std::{
|
||||||
cmp::{self, Ordering},
|
cmp::Ordering,
|
||||||
hash::{Hash, Hasher},
|
hash::{Hash, Hasher},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,137 +52,6 @@ impl<T: CurveBoundaryElement> CurveBoundary<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Technically, these methods could be implemented for all
|
|
||||||
// `CurveBoundaryElement`s, but that would be misleading. While
|
|
||||||
// `HandleWrapper<Vertex>` implements `Ord`, which is useful for putting it (and
|
|
||||||
// by extension, `CurveBoundary<Vertex>`) into `BTreeMap`s, this `Ord`
|
|
||||||
// implementation doesn't actually define the geometrically meaningful ordering
|
|
||||||
// that the following methods rely on.
|
|
||||||
impl CurveBoundary<Point<1>> {
|
|
||||||
/// Indicate whether the boundary is empty
|
|
||||||
pub fn is_empty(&self) -> bool {
|
|
||||||
let [min, max] = &self.inner;
|
|
||||||
min >= max
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Indicate whether the boundary contains the given element
|
|
||||||
pub fn contains(&self, point: Point<1>) -> bool {
|
|
||||||
let [min, max] = self.normalize().inner;
|
|
||||||
point > min && point < max
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Indicate whether the boundary overlaps another
|
|
||||||
///
|
|
||||||
/// Boundaries that touch (i.e. their closest boundary elements are equal)
|
|
||||||
/// count as overlapping.
|
|
||||||
pub fn overlaps(&self, other: &Self) -> bool {
|
|
||||||
let [a_low, a_high] = self.normalize().inner;
|
|
||||||
let [b_low, b_high] = other.normalize().inner;
|
|
||||||
|
|
||||||
a_low <= b_high && a_high >= b_low
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create the difference of this boundary and another
|
|
||||||
///
|
|
||||||
/// The result will be normalized.
|
|
||||||
pub fn difference(self, other: Self) -> Option<OneOrTwoBoundaries> {
|
|
||||||
let [self_min, self_max] = self.normalize().inner;
|
|
||||||
let [other_min, other_max] = other.normalize().inner;
|
|
||||||
|
|
||||||
match (
|
|
||||||
self_min <= other_min,
|
|
||||||
self_min <= other_max,
|
|
||||||
self_max <= other_min,
|
|
||||||
self_max <= other_max,
|
|
||||||
) {
|
|
||||||
(true, true, true, true) => {
|
|
||||||
Some(OneOrTwoBoundaries::One(CurveBoundary {
|
|
||||||
inner: [self_min, self_max],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
(true, true, false, true) => {
|
|
||||||
let min = self_min;
|
|
||||||
let max = other_min;
|
|
||||||
|
|
||||||
if min == max {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
Some(OneOrTwoBoundaries::One(CurveBoundary {
|
|
||||||
inner: [min, max],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
(true, true, false, false) => Some(OneOrTwoBoundaries::Two([
|
|
||||||
CurveBoundary {
|
|
||||||
inner: [self_min, other_min],
|
|
||||||
},
|
|
||||||
CurveBoundary {
|
|
||||||
inner: [other_max, self_max],
|
|
||||||
},
|
|
||||||
])),
|
|
||||||
(false, true, false, true) => None,
|
|
||||||
(false, true, false, false) => {
|
|
||||||
Some(OneOrTwoBoundaries::One(CurveBoundary {
|
|
||||||
inner: [other_max, self_max],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
(false, false, false, false) => {
|
|
||||||
Some(OneOrTwoBoundaries::One(CurveBoundary {
|
|
||||||
inner: [self_min, self_max],
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
case => {
|
|
||||||
unreachable!(
|
|
||||||
"{case:?} is impossible, due to normalization above"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create the intersection of this boundary and another
|
|
||||||
///
|
|
||||||
/// The result will be normalized.
|
|
||||||
#[must_use]
|
|
||||||
pub fn intersection(self, other: Self) -> Self {
|
|
||||||
let self_ = self.normalize();
|
|
||||||
let other = other.normalize();
|
|
||||||
|
|
||||||
let [self_min, self_max] = self_.inner;
|
|
||||||
let [other_min, other_max] = other.inner;
|
|
||||||
|
|
||||||
let min = cmp::max(self_min, other_min);
|
|
||||||
let max = cmp::min(self_max, other_max);
|
|
||||||
|
|
||||||
Self { inner: [min, max] }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create the union of this boundary and another
|
|
||||||
///
|
|
||||||
/// The result will be normalized.
|
|
||||||
///
|
|
||||||
/// # Panics
|
|
||||||
///
|
|
||||||
/// Panics, if the two boundaries don't overlap (touching counts as
|
|
||||||
/// overlapping).
|
|
||||||
pub fn union(self, other: Self) -> Self {
|
|
||||||
let self_ = self.normalize();
|
|
||||||
let other = other.normalize();
|
|
||||||
|
|
||||||
assert!(
|
|
||||||
self.overlaps(&other),
|
|
||||||
"Can't merge boundaries that don't at least touch"
|
|
||||||
);
|
|
||||||
|
|
||||||
let [self_min, self_max] = self_.inner;
|
|
||||||
let [other_min, other_max] = other.inner;
|
|
||||||
|
|
||||||
let min = cmp::min(self_min, other_min);
|
|
||||||
let max = cmp::max(self_max, other_max);
|
|
||||||
|
|
||||||
Self { inner: [min, max] }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<S, T: CurveBoundaryElement> From<[S; 2]> for CurveBoundary<T>
|
impl<S, T: CurveBoundaryElement> From<[S; 2]> for CurveBoundary<T>
|
||||||
where
|
where
|
||||||
S: Into<T::Repr>,
|
S: Into<T::Repr>,
|
||||||
@ -219,12 +88,6 @@ impl<T: CurveBoundaryElement> PartialOrd for CurveBoundary<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq)]
|
|
||||||
pub enum OneOrTwoBoundaries {
|
|
||||||
One(CurveBoundary<Point<1>>),
|
|
||||||
Two([CurveBoundary<Point<1>>; 2]),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// An element of a curve boundary
|
/// An element of a curve boundary
|
||||||
///
|
///
|
||||||
/// Used for the type parameter of [`CurveBoundary`].
|
/// Used for the type parameter of [`CurveBoundary`].
|
||||||
@ -242,123 +105,3 @@ impl CurveBoundaryElement for Point<1> {
|
|||||||
impl CurveBoundaryElement for Vertex {
|
impl CurveBoundaryElement for Vertex {
|
||||||
type Repr = Handle<Vertex>;
|
type Repr = Handle<Vertex>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use fj_math::Point;
|
|
||||||
|
|
||||||
use crate::geometry::{boundary::OneOrTwoBoundaries, CurveBoundary};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn overlaps() {
|
|
||||||
assert!(overlap([0., 2.], [1., 3.])); // regular overlap
|
|
||||||
assert!(overlap([0., 1.], [1., 2.])); // just touching
|
|
||||||
assert!(overlap([2., 0.], [3., 1.])); // not normalized
|
|
||||||
assert!(overlap([1., 3.], [0., 2.])); // lower boundary comes second
|
|
||||||
|
|
||||||
assert!(!overlap([0., 1.], [2., 3.])); // regular non-overlap
|
|
||||||
assert!(!overlap([2., 3.], [0., 1.])); // lower boundary comes second
|
|
||||||
|
|
||||||
fn overlap(a: [f64; 2], b: [f64; 2]) -> bool {
|
|
||||||
let a = array_to_boundary(a);
|
|
||||||
let b = array_to_boundary(b);
|
|
||||||
|
|
||||||
a.overlaps(&b)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn difference() {
|
|
||||||
// `a \ b = x`
|
|
||||||
|
|
||||||
// b covers a exactly
|
|
||||||
diff([1., 2.], [1., 2.], &[]);
|
|
||||||
diff([1., 2.], [2., 1.], &[]);
|
|
||||||
diff([2., 1.], [1., 2.], &[]);
|
|
||||||
diff([2., 1.], [2., 1.], &[]);
|
|
||||||
|
|
||||||
// b covers a, overhang right
|
|
||||||
diff([1., 2.], [1., 3.], &[]);
|
|
||||||
diff([1., 2.], [3., 1.], &[]);
|
|
||||||
diff([2., 1.], [1., 3.], &[]);
|
|
||||||
diff([2., 1.], [3., 1.], &[]);
|
|
||||||
|
|
||||||
// b covers a, overhang left
|
|
||||||
diff([1., 2.], [0., 2.], &[]);
|
|
||||||
diff([1., 2.], [2., 0.], &[]);
|
|
||||||
diff([2., 1.], [0., 2.], &[]);
|
|
||||||
diff([2., 1.], [2., 0.], &[]);
|
|
||||||
|
|
||||||
// b covers a, overhang both sides
|
|
||||||
diff([1., 2.], [0., 3.], &[]);
|
|
||||||
diff([1., 2.], [3., 0.], &[]);
|
|
||||||
diff([2., 1.], [0., 3.], &[]);
|
|
||||||
diff([2., 1.], [3., 0.], &[]);
|
|
||||||
|
|
||||||
// a to the left of b, touching
|
|
||||||
diff([0., 1.], [1., 2.], &[[0., 1.]]);
|
|
||||||
diff([0., 1.], [2., 1.], &[[0., 1.]]);
|
|
||||||
diff([1., 0.], [1., 2.], &[[0., 1.]]);
|
|
||||||
diff([1., 0.], [2., 1.], &[[0., 1.]]);
|
|
||||||
|
|
||||||
// a to the left of b, not touching
|
|
||||||
diff([0., 1.], [2., 3.], &[[0., 1.]]);
|
|
||||||
diff([0., 1.], [3., 2.], &[[0., 1.]]);
|
|
||||||
diff([1., 0.], [2., 3.], &[[0., 1.]]);
|
|
||||||
diff([1., 0.], [3., 2.], &[[0., 1.]]);
|
|
||||||
|
|
||||||
// a to the right of b, touching
|
|
||||||
diff([2., 3.], [1., 2.], &[[2., 3.]]);
|
|
||||||
diff([2., 3.], [2., 1.], &[[2., 3.]]);
|
|
||||||
diff([3., 2.], [1., 2.], &[[2., 3.]]);
|
|
||||||
diff([3., 2.], [2., 1.], &[[2., 3.]]);
|
|
||||||
|
|
||||||
// a to the right of b, not touching
|
|
||||||
diff([2., 3.], [0., 1.], &[[2., 3.]]);
|
|
||||||
diff([2., 3.], [1., 0.], &[[2., 3.]]);
|
|
||||||
diff([3., 2.], [0., 1.], &[[2., 3.]]);
|
|
||||||
diff([3., 2.], [1., 0.], &[[2., 3.]]);
|
|
||||||
|
|
||||||
// b intersects a on the right
|
|
||||||
diff([0., 2.], [1., 3.], &[[0., 1.]]);
|
|
||||||
diff([0., 2.], [3., 1.], &[[0., 1.]]);
|
|
||||||
diff([2., 0.], [1., 3.], &[[0., 1.]]);
|
|
||||||
diff([2., 0.], [3., 1.], &[[0., 1.]]);
|
|
||||||
|
|
||||||
// b intersects a on the left
|
|
||||||
diff([1., 3.], [0., 2.], &[[2., 3.]]);
|
|
||||||
diff([1., 3.], [2., 0.], &[[2., 3.]]);
|
|
||||||
diff([3., 1.], [0., 2.], &[[2., 3.]]);
|
|
||||||
diff([3., 1.], [2., 0.], &[[2., 3.]]);
|
|
||||||
|
|
||||||
// a covers b, overhang both sides
|
|
||||||
diff([0., 3.], [1., 2.], &[[0., 1.], [2., 3.]]);
|
|
||||||
diff([0., 3.], [2., 1.], &[[0., 1.], [2., 3.]]);
|
|
||||||
diff([3., 0.], [1., 2.], &[[0., 1.], [2., 3.]]);
|
|
||||||
diff([3., 0.], [2., 1.], &[[0., 1.], [2., 3.]]);
|
|
||||||
|
|
||||||
fn diff(a: [f64; 2], b: [f64; 2], x: &[[f64; 2]]) {
|
|
||||||
print!("{a:?} \\ {b:?} = ");
|
|
||||||
|
|
||||||
let a = array_to_boundary(a);
|
|
||||||
let b = array_to_boundary(b);
|
|
||||||
|
|
||||||
let x = match x {
|
|
||||||
[] => None,
|
|
||||||
&[x] => Some(OneOrTwoBoundaries::One(array_to_boundary(x))),
|
|
||||||
&[x1, x2] => Some(OneOrTwoBoundaries::Two(
|
|
||||||
[x1, x2].map(array_to_boundary),
|
|
||||||
)),
|
|
||||||
_ => panic!("Invalid result"),
|
|
||||||
};
|
|
||||||
|
|
||||||
let diff = a.difference(b);
|
|
||||||
println!("{diff:?}");
|
|
||||||
assert_eq!(diff, x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn array_to_boundary(array: [f64; 2]) -> CurveBoundary<Point<1>> {
|
|
||||||
CurveBoundary::from(array.map(|element| [element]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user