mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Better code reuse, almost generic over dimensions
This commit is contained in:
@@ -61,55 +61,33 @@ impl Cuboid {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if other.lower[0] > self.lower[0] {
|
let mut lower = self.lower;
|
||||||
// We have a set of X-coordinates below the overlap, add a cube for that
|
let mut upper = self.upper;
|
||||||
new_cubes.push(Self::new_internal(
|
|
||||||
self.lower,
|
|
||||||
[other.lower[0], self.upper[1], self.upper[2]],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
if other.upper[0] < self.upper[0] {
|
for axis in 0..3 {
|
||||||
// Similarly, we can remove an upper section.
|
if other.lower[axis] > self.lower[axis] {
|
||||||
new_cubes.push(Self::new_internal(
|
let mut new_upper = upper;
|
||||||
[other.upper[0], self.lower[1], self.lower[2]],
|
new_upper[axis] = other.lower[axis];
|
||||||
self.upper,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we can fix the X-coordinates of the overlap section
|
new_cubes.push(Cuboid {
|
||||||
let overlap_xl = self.lower[0].max(other.lower[0]);
|
lower,
|
||||||
let overlap_xh = self.upper[0].min(other.upper[0]);
|
upper: new_upper,
|
||||||
|
});
|
||||||
|
|
||||||
// Same strategy for the Y axis
|
lower[axis] = other.lower[axis];
|
||||||
if other.lower[1] > self.lower[1] {
|
}
|
||||||
new_cubes.push(Self::new_internal(
|
|
||||||
[overlap_xl, self.lower[1], self.lower[2]],
|
|
||||||
[overlap_xh, other.lower[1], self.upper[2]],
|
|
||||||
))
|
|
||||||
}
|
|
||||||
if other.upper[1] < self.upper[1] {
|
|
||||||
new_cubes.push(Self::new_internal(
|
|
||||||
[overlap_xl, other.upper[1], self.lower[2]],
|
|
||||||
[overlap_xh, self.upper[1], self.upper[2]],
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
let overlap_yl = self.lower[1].max(other.lower[1]);
|
if other.upper[axis] < self.upper[axis] {
|
||||||
let overlap_yh = self.upper[1].min(other.upper[1]);
|
let mut new_lower = lower;
|
||||||
|
new_lower[axis] = other.upper[axis];
|
||||||
|
|
||||||
// Finally, handle the last axis
|
new_cubes.push(Cuboid {
|
||||||
if other.lower[2] > self.lower[2] {
|
lower: new_lower,
|
||||||
new_cubes.push(Self::new_internal(
|
upper,
|
||||||
[overlap_xl, overlap_yl, self.lower[2]],
|
});
|
||||||
[overlap_xh, overlap_yh, other.lower[2]],
|
|
||||||
))
|
upper[axis] = other.upper[axis];
|
||||||
}
|
}
|
||||||
if other.upper[2] < self.upper[2] {
|
|
||||||
new_cubes.push(Self::new_internal(
|
|
||||||
[overlap_xl, overlap_yl, other.upper[2]],
|
|
||||||
[overlap_xh, overlap_yh, self.upper[2]],
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
|
|||||||
Reference in New Issue
Block a user