From 1ac45cd4ff8284452bdd9fa03bb38ea8f55fd8f7 Mon Sep 17 00:00:00 2001 From: Radek Oslejsek <oslejsek@fi.muni.cz> Date: Mon, 19 Oct 2020 15:30:46 +0200 Subject: [PATCH] BoundingBox made immutable + fix --- .../analyst/mesh/core/BoundingBox.java | 75 ++++++++----------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/BoundingBox.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/BoundingBox.java index 97d990ef..733d5d84 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/BoundingBox.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/BoundingBox.java @@ -4,34 +4,50 @@ import java.util.List; import javax.vecmath.Vector3d; /** - * @author Natália Bebjaková - * - * Represent min-max box. - * It is automatically maintained by given point array of the model. + * @author Natalia Bebjakova * + * 3D bounding box (cube) of <code>MeshPoint</code>s. */ public class BoundingBox { - private MeshPoint maxPoint; - private MeshPoint minPoint; - private MeshPoint midPoint; - private double maxDiag; + + private final MeshPoint maxPoint; + private final MeshPoint minPoint; + private final MeshPoint midPoint; + private final double maxDiag; /** - * Creates bounding box that is automatically maintained with respect to given array. - * @param points array of points, must not be null or pempty + * Creates bounding box from given mesh points. + * @param points List of mesh points, must not be null or empty * @throws IllegalArgumentException if the @code{points} param is null or empty */ public BoundingBox(List<MeshPoint> points) { if (points == null || points.isEmpty()) { throw new IllegalArgumentException("points"); } - this.computeMinMax(points); - this.computeMidDiag(); + + minPoint = new MeshPointImpl(new Vector3d(Double.POSITIVE_INFINITY,Double.POSITIVE_INFINITY,Double.POSITIVE_INFINITY), null, null); + maxPoint = new MeshPointImpl(new Vector3d(Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NEGATIVE_INFINITY), null, null); + + for (int i = 0; i < points.size(); i++) { + MeshPoint point = points.get(i); + + minPoint.getPosition().x = Math.min(minPoint.getPosition().x, point.getPosition().x); + minPoint.getPosition().y = Math.min(minPoint.getPosition().y, point.getPosition().y); + minPoint.getPosition().z = Math.min(minPoint.getPosition().z, point.getPosition().z); + + maxPoint.getPosition().x = Math.max(maxPoint.getPosition().x, point.getPosition().x); + maxPoint.getPosition().y = Math.max(maxPoint.getPosition().y, point.getPosition().y); + maxPoint.getPosition().z = Math.max(maxPoint.getPosition().z, point.getPosition().z); + } + + midPoint = (minPoint.addPosition(maxPoint)).multiplyPosition(0.5); + MeshPoint diag = maxPoint.subtractPosition(minPoint); + this.maxDiag = diag.abs(); } /** - * + * Return the upper-bound corner of the bounding cube * @return max point of the bounding box */ public MeshPoint getMaxPoint() { @@ -39,7 +55,7 @@ public class BoundingBox { } /** - * + * Return centroid of the bounding cube. * @return middle point of the bounding box */ public MeshPoint getMidPoint() { @@ -47,7 +63,7 @@ public class BoundingBox { } /** - * + * Return the lower-bound corner of the bounding cube * @return min point of the bounding box */ public MeshPoint getMinPoint() { @@ -62,35 +78,6 @@ public class BoundingBox { return maxDiag; } - /** - * Recomputes the BoundingBox from all points - */ - private void computeMinMax(List<MeshPoint> points) { - minPoint = new MeshPointImpl(new Vector3d(Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE), null, null); - maxPoint = new MeshPointImpl(new Vector3d(-100000.0,-100000.0,-100000.0), null, null); - - for (int i = 0; i < points.size(); i++) { - MeshPoint point = points.get(i); - - minPoint.getPosition().x = Math.min(minPoint.getPosition().x, point.getPosition().x); - minPoint.getPosition().y = Math.min(minPoint.getPosition().y, point.getPosition().y); - minPoint.getPosition().z = Math.min(minPoint.getPosition().z, point.getPosition().z); - - maxPoint.getPosition().x = Math.max(maxPoint.getPosition().x, point.getPosition().x); - maxPoint.getPosition().y = Math.max(maxPoint.getPosition().y, point.getPosition().y); - maxPoint.getPosition().z = Math.max(maxPoint.getPosition().z, point.getPosition().z); - } - } - - /** - * Recompute mid-point and max diagonal length. - */ - private void computeMidDiag() { - midPoint = (minPoint.addPosition(maxPoint)).multiplyPosition(0.5); - MeshPoint diag = maxPoint.subtractPosition(minPoint); - this.maxDiag = diag.abs(); - } - /** * Returns description of BoundignBox. * -- GitLab