Skip to content

Commit 9764de4

Browse files
committed
Meshes: Add boundingBoxMesh
1 parent d01b33a commit 9764de4

File tree

2 files changed

+75
-9
lines changed

2 files changed

+75
-9
lines changed

src/main/java/net/imglib2/mesh/Meshes.java

+44-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public static RealPoint center( final Mesh m )
7575
/**
7676
* Computes and returns an <b>oriented</b> bounding box {@link RealInterval}
7777
*
78-
* @param input
78+
* @param mesh
7979
* @return the output {@link Mesh}
8080
* @implNote op names="geom.boundingBox"
8181
*/
@@ -103,6 +103,49 @@ public static RealInterval boundingBox( final net.imglib2.mesh.Mesh mesh )
103103
return Intervals.createMinMaxReal( boundingBox[ 0 ], boundingBox[ 1 ], boundingBox[ 2 ], boundingBox[ 3 ], boundingBox[ 4 ], boundingBox[ 5 ] );
104104
}
105105

106+
/**
107+
* Computes and returns an <b>oriented</b> bounding box {@link Mesh}
108+
*
109+
* @param input
110+
* @return the output {@link Mesh}
111+
* @implNote op names="geom.boundingBox"
112+
*/
113+
public static Mesh boundingBoxMesh(final Mesh input) {
114+
RealInterval interval = boundingBox(input);
115+
Mesh m = new NaiveDoubleMesh();
116+
// BOTTOM VERTICES
117+
long bbl = m.vertices().add(interval.realMin(0), interval.realMin(1), interval.realMin(2));
118+
long bbr = m.vertices().add(interval.realMax(0), interval.realMin(1), interval.realMin(2));
119+
long bfl = m.vertices().add(interval.realMin(0), interval.realMax(1), interval.realMin(2));
120+
long bfr = m.vertices().add(interval.realMax(0), interval.realMax(1), interval.realMin(2));
121+
// TOP VERTICES
122+
long tbl = m.vertices().add(interval.realMin(0), interval.realMin(1), interval.realMax(2));
123+
long tbr = m.vertices().add(interval.realMax(0), interval.realMin(1), interval.realMax(2));
124+
long tfl = m.vertices().add(interval.realMin(0), interval.realMax(1), interval.realMax(2));
125+
long tfr = m.vertices().add(interval.realMax(0), interval.realMax(1), interval.realMax(2));
126+
127+
// BOTTOM TRIANGLES
128+
m.triangles().add(bbl, bfr, bbr);
129+
m.triangles().add(bbl, bfl, bfr);
130+
// FRONT TRIANGLES
131+
m.triangles().add(tfl, bfr, bfl);
132+
m.triangles().add(tfl, tfr, bfr);
133+
// TOP TRIANGLES
134+
m.triangles().add(tbl, tfr, tfl);
135+
m.triangles().add(tbl, tbr, tfr);
136+
// BACK TRIANGLES
137+
m.triangles().add(tbl, bbl, bbr);
138+
m.triangles().add(tbl, tbr, tfr);
139+
// LEFT TRIANGLES
140+
m.triangles().add(tfl, bfl, bbl);
141+
m.triangles().add(tfl, bbl, tbr);
142+
// RIGHT TRIANGLES
143+
m.triangles().add(tfr, tbr, bbr);
144+
m.triangles().add(tfr, bbr, tfr);
145+
146+
return m;
147+
}
148+
106149
/**
107150
* Copies a mesh into another mesh.
108151
*

src/test/java/net/imglib2/mesh/MeshesTest.java

+31-8
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@
2828
*/
2929
package net.imglib2.mesh;
3030

31-
import static org.junit.Assert.assertEquals;
32-
import static org.junit.Assert.assertTrue;
33-
3431
import javax.imageio.ImageIO;
3532
import javax.imageio.ImageReader;
3633
import java.awt.image.BufferedImage;
@@ -39,11 +36,7 @@
3936
import java.net.URISyntaxException;
4037
import java.nio.file.Files;
4138
import java.nio.file.Paths;
42-
import java.util.ArrayList;
43-
import java.util.HashMap;
44-
import java.util.Iterator;
45-
import java.util.List;
46-
import java.util.Map;
39+
import java.util.*;
4740

4841
import gnu.trove.list.array.TLongArrayList;
4942
import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
@@ -67,6 +60,8 @@
6760
import net.imglib2.util.Fraction;
6861
import net.imglib2.view.RandomAccessibleIntervalCursor;
6962

63+
import static org.junit.Assert.*;
64+
7065
public class MeshesTest
7166
{
7267

@@ -161,6 +156,34 @@ public void testMarchingCubesRealType()
161156
assertTrue( !expectedFacets.hasNext() && !actualFacets.hasNext() );
162157
}
163158

159+
@Test
160+
public void testBoundingBoxMesh() {
161+
final Mesh mesh = new NaiveDoubleMesh();
162+
// Create a pyramid between the points
163+
long bbl = mesh.vertices().add(0, 0, 0);
164+
long bbr = mesh.vertices().add(1, 0, 0);
165+
long bfl = mesh.vertices().add(0, 1, 0);
166+
long t = mesh.vertices().add(0, 0, 1);
167+
mesh.triangles().add(bbl, bfl, bbr);
168+
mesh.triangles().add(t, bbr, bfl);
169+
mesh.triangles().add(t, bbl, bbr);
170+
mesh.triangles().add(t, bfl, bbl);
171+
172+
// Get the bounding box
173+
final Mesh bounding = Meshes.boundingBoxMesh(mesh);
174+
// Assert expected points and number of vertices
175+
Iterator<Vertex> itr = bounding.vertices().iterator();
176+
assertArrayEquals(new double[] {0, 0, 0}, itr.next().positionAsDoubleArray(), 0);
177+
assertArrayEquals(new double[] {1, 0, 0}, itr.next().positionAsDoubleArray(), 0);
178+
assertArrayEquals(new double[] {0, 1, 0}, itr.next().positionAsDoubleArray(), 0);
179+
assertArrayEquals(new double[] {1, 1, 0}, itr.next().positionAsDoubleArray(), 0);
180+
assertArrayEquals(new double[] {0, 0, 1}, itr.next().positionAsDoubleArray(), 0);
181+
assertArrayEquals(new double[] {1, 0, 1}, itr.next().positionAsDoubleArray(), 0);
182+
assertArrayEquals(new double[] {0, 1, 1}, itr.next().positionAsDoubleArray(), 0);
183+
assertArrayEquals(new double[] {1, 1, 1}, itr.next().positionAsDoubleArray(), 0);
184+
assertFalse(itr.hasNext());
185+
}
186+
164187
private static Mesh createMeshWithNoise()
165188
{
166189
final Mesh mesh = new NaiveDoubleMesh();

0 commit comments

Comments
 (0)