diff --git a/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java b/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java index d3226f5d0d9e2108bbc0e2f7158eb4ff7f84f9af..8939c6009c4f910269d65092fc3be38edf253dfe 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/comparison/HausdorffDistance.java @@ -4,6 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet; import cz.fidentis.analyst.mesh.core.MeshPoint; import cz.fidentis.analyst.mesh.core.MeshPointImpl; import cz.fidentis.analyst.mesh.core.MeshTriangle; +import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor; import javax.vecmath.Vector3d; import java.util.ArrayList; @@ -205,7 +206,9 @@ public class HausdorffDistance { List<Pair<Vector3d, Double>> projections = new ArrayList<>(indicesOfTrianglesOfVertex.size()); Vector3d helperVector = new Vector3d(); - List<MeshTriangle> trList = comparedFacet.asTriangles(); + TriangleListVisitor visitor = new TriangleListVisitor(); + comparedFacet.accept(visitor); + List<MeshTriangle> trList = visitor.getTriangles(); for (int index : indicesOfTrianglesOfVertex) { List<Vector3d> triangle = new ArrayList<>(); triangle.add(trList.get(index).vertex1.getPosition()); diff --git a/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java b/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java index 2eb6eb4ecbcbb63424915ec6c7ad5fda50284b8c..b0e19f0e95d5440e5064d3a36d0526c33b6b631c 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/symmetry/SymmetryEstimator.java @@ -8,6 +8,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacetImpl; import cz.fidentis.analyst.mesh.core.MeshPointImpl; import cz.fidentis.analyst.mesh.core.MeshTriangle; import cz.fidentis.analyst.mesh.visitors.BoundingBoxVisitor; +import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -48,7 +49,9 @@ public class SymmetryEstimator { this.facet = f; this.config = config; - this.triangles = f.asTriangles(); + TriangleListVisitor visitor = new TriangleListVisitor(); + f.accept(visitor); + this.triangles = visitor.getTriangles(); this.areas = new TriangleVertexAreas[triangles.size()]; for (int i = 0; i < areas.length; i++) { diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java index 942f4a023385ce89ad98309159a01d3c24f6f5e1..8d70d62228faca7854ffc8b4055da9f26571dea8 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacet.java @@ -1,6 +1,5 @@ package cz.fidentis.analyst.mesh.core; -import cz.fidentis.analyst.mesh.visitors.BoundingBox; import cz.fidentis.analyst.mesh.visitors.Visitor; import java.util.List; @@ -47,12 +46,6 @@ public interface MeshFacet { */ CornerTable getCornerTable(); - /** - * Returns the mesh as a list of individial triangles. - * @return the list of individial triangles. - */ - List<MeshTriangle> asTriangles(); - /** * Returns true if normals of vertices are calculated. * @return true if normals of vertices are calculated. diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java index 72873fc99e633629754b640b7343ac9b9e6348d8..32ab10eaee8a1c4d829d830db3925f6090723687 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshFacetImpl.java @@ -1,6 +1,7 @@ package cz.fidentis.analyst.mesh.core; import cz.fidentis.analyst.mesh.visitors.BoundingBox; +import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor; import cz.fidentis.analyst.mesh.visitors.Visitor; import java.util.ArrayList; import java.util.Collections; @@ -66,18 +67,6 @@ public class MeshFacetImpl implements MeshFacet { return cornerTable; } - @Override - public List<MeshTriangle> asTriangles() { - List<MeshTriangle> ret = new ArrayList<>(); - for (int i = 0; i < cornerTable.getSize(); i += 3) { - ret.add(new MeshTriangle( - vertices.get(cornerTable.getRow(i + 0).getVertexIndex()), - vertices.get(cornerTable.getRow(i + 1).getVertexIndex()), - vertices.get(cornerTable.getRow(i + 2).getVertexIndex()))); - } - return ret; - } - @Override public boolean hasVertexNormals() { return !this.vertices.isEmpty() && this.vertices.get(0).getNormal() != null; @@ -99,7 +88,9 @@ public class MeshFacetImpl implements MeshFacet { } // calculate normals from corresponding triangles - for (MeshTriangle t : asTriangles()) { + TriangleListVisitor visitor = new TriangleListVisitor(); + this.accept(visitor); + for (MeshTriangle t : visitor.getTriangles()) { Vector3d triangleNormal = (t.vertex3.subtractPosition(t.vertex1)).crossProduct(t.vertex2.subtractPosition(t.vertex1)).getPosition(); normalMap.get(t.vertex1).add(triangleNormal); diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java index 848848151917c1db524c0b10d16b2e8cef6d014a..7805d36f39679a207cb778364ed1498cb2b117c2 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitor.java @@ -4,7 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet; import cz.fidentis.analyst.mesh.core.MeshModel; /** - * Computes a 3D bounding box (cube). + * Visitor that computes a 3D bounding box (cube). * * @author oslejsek */ diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..42cb05c05d92ebe289051c0428010b06a00f31b3 --- /dev/null +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitor.java @@ -0,0 +1,33 @@ +package cz.fidentis.analyst.mesh.visitors; + +import cz.fidentis.analyst.mesh.core.CornerTable; +import cz.fidentis.analyst.mesh.core.MeshFacet; +import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.mesh.core.MeshTriangle; +import java.util.ArrayList; +import java.util.List; + +/** + * Visitor that collects and returs list of triangles. + * + * @author oslejsek + */ +public class TriangleListVisitor implements Visitor { + + private List<MeshTriangle> triangles = new ArrayList<>(); + + @Override + public void visitMeshFacet(MeshFacet facet) { + CornerTable ct = facet.getCornerTable(); + for (int i = 0; i < ct.getSize(); i += 3) { + triangles.add(new MeshTriangle( + facet.getVertex(ct.getRow(i + 0).getVertexIndex()), + facet.getVertex(ct.getRow(i + 1).getVertexIndex()), + facet.getVertex(ct.getRow(i + 2).getVertexIndex()))); + } + } + + public List<MeshTriangle> getTriangles() { + return triangles; + } +} diff --git a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java index 4d693d11fc7e494e90c4e75dd40b57acc474e74f..74a58e63c6bfa825e4102a9aef6f24ecf461557b 100644 --- a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java +++ b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/BoundingBoxVisitorTest.java @@ -17,12 +17,6 @@ public class BoundingBoxVisitorTest { Path testFileDirectory = Paths.get("src", "test", "resources", "cz", "fidentis", "analyst", "mesh", "io"); - @Test - void moreObjectFileTest() { //TODO: Not testing in loader - File moreObjects = new File(testFileDirectory.toFile(), "MoreObjects.obj"); - Exception ex = assertThrows(IOException.class, () -> MeshObjLoader.read(moreObjects)); - } - @Test void icoSphereTest() throws IOException { MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj")); diff --git a/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9221bd871ff70ce22d8ecd6fd4edd652a1a51090 --- /dev/null +++ b/MeshModel/src/test/java/cz/fidentis/analyst/mesh/visitors/TriangleListVisitorTest.java @@ -0,0 +1,44 @@ +package cz.fidentis.analyst.mesh.visitors; + +import cz.fidentis.analyst.mesh.visitors.*; +import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.mesh.io.MeshObjLoader; +import cz.fidentis.analyst.mesh.io.MeshObjLoader; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import javax.vecmath.Vector3d; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Radek Oslejsek + */ +public class TriangleListVisitorTest { + + Path testFileDirectory = Paths.get("src", "test", "resources", "cz", "fidentis", "analyst", "mesh", "io"); + + @Test + void icoSphereTest() throws IOException { + MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj")); + assertNotNull(m); + TriangleListVisitor visitor = new TriangleListVisitor(); + m.accept(visitor); + assertEquals(20, visitor.getTriangles().size()); + } + + @Test + void combinedTest() throws IOException { + MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj")); + assertNotNull(m); + TriangleListVisitor visitor = new TriangleListVisitor(); + m.accept(visitor); + + m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "Tetrahedron.obj")); + assertNotNull(m); + m.accept(visitor); + + assertEquals(24, visitor.getTriangles().size()); + } +}