Skip to content
Snippets Groups Projects
Commit 6485acc8 authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Returning a list of triangles refactored as a Visitor

parent b3306fc6
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet; ...@@ -4,6 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet;
import cz.fidentis.analyst.mesh.core.MeshPoint; import cz.fidentis.analyst.mesh.core.MeshPoint;
import cz.fidentis.analyst.mesh.core.MeshPointImpl; import cz.fidentis.analyst.mesh.core.MeshPointImpl;
import cz.fidentis.analyst.mesh.core.MeshTriangle; import cz.fidentis.analyst.mesh.core.MeshTriangle;
import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
import javax.vecmath.Vector3d; import javax.vecmath.Vector3d;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -205,7 +206,9 @@ public class HausdorffDistance { ...@@ -205,7 +206,9 @@ public class HausdorffDistance {
List<Pair<Vector3d, Double>> projections = new ArrayList<>(indicesOfTrianglesOfVertex.size()); List<Pair<Vector3d, Double>> projections = new ArrayList<>(indicesOfTrianglesOfVertex.size());
Vector3d helperVector = new Vector3d(); 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) { for (int index : indicesOfTrianglesOfVertex) {
List<Vector3d> triangle = new ArrayList<>(); List<Vector3d> triangle = new ArrayList<>();
triangle.add(trList.get(index).vertex1.getPosition()); triangle.add(trList.get(index).vertex1.getPosition());
......
...@@ -8,6 +8,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacetImpl; ...@@ -8,6 +8,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacetImpl;
import cz.fidentis.analyst.mesh.core.MeshPointImpl; import cz.fidentis.analyst.mesh.core.MeshPointImpl;
import cz.fidentis.analyst.mesh.core.MeshTriangle; import cz.fidentis.analyst.mesh.core.MeshTriangle;
import cz.fidentis.analyst.mesh.visitors.BoundingBoxVisitor; import cz.fidentis.analyst.mesh.visitors.BoundingBoxVisitor;
import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
...@@ -48,7 +49,9 @@ public class SymmetryEstimator { ...@@ -48,7 +49,9 @@ public class SymmetryEstimator {
this.facet = f; this.facet = f;
this.config = config; this.config = config;
this.triangles = f.asTriangles(); TriangleListVisitor visitor = new TriangleListVisitor();
f.accept(visitor);
this.triangles = visitor.getTriangles();
this.areas = new TriangleVertexAreas[triangles.size()]; this.areas = new TriangleVertexAreas[triangles.size()];
for (int i = 0; i < areas.length; i++) { for (int i = 0; i < areas.length; i++) {
......
package cz.fidentis.analyst.mesh.core; package cz.fidentis.analyst.mesh.core;
import cz.fidentis.analyst.mesh.visitors.BoundingBox;
import cz.fidentis.analyst.mesh.visitors.Visitor; import cz.fidentis.analyst.mesh.visitors.Visitor;
import java.util.List; import java.util.List;
...@@ -47,12 +46,6 @@ public interface MeshFacet { ...@@ -47,12 +46,6 @@ public interface MeshFacet {
*/ */
CornerTable getCornerTable(); 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. * Returns true if normals of vertices are calculated.
* @return true if normals of vertices are calculated. * @return true if normals of vertices are calculated.
......
package cz.fidentis.analyst.mesh.core; package cz.fidentis.analyst.mesh.core;
import cz.fidentis.analyst.mesh.visitors.BoundingBox; import cz.fidentis.analyst.mesh.visitors.BoundingBox;
import cz.fidentis.analyst.mesh.visitors.TriangleListVisitor;
import cz.fidentis.analyst.mesh.visitors.Visitor; import cz.fidentis.analyst.mesh.visitors.Visitor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
...@@ -66,18 +67,6 @@ public class MeshFacetImpl implements MeshFacet { ...@@ -66,18 +67,6 @@ public class MeshFacetImpl implements MeshFacet {
return cornerTable; 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 @Override
public boolean hasVertexNormals() { public boolean hasVertexNormals() {
return !this.vertices.isEmpty() && this.vertices.get(0).getNormal() != null; return !this.vertices.isEmpty() && this.vertices.get(0).getNormal() != null;
...@@ -99,7 +88,9 @@ public class MeshFacetImpl implements MeshFacet { ...@@ -99,7 +88,9 @@ public class MeshFacetImpl implements MeshFacet {
} }
// calculate normals from corresponding triangles // calculate normals from corresponding triangles
for (MeshTriangle t : asTriangles()) { TriangleListVisitor visitor = new TriangleListVisitor();
this.accept(visitor);
for (MeshTriangle t : visitor.getTriangles()) {
Vector3d triangleNormal = Vector3d triangleNormal =
(t.vertex3.subtractPosition(t.vertex1)).crossProduct(t.vertex2.subtractPosition(t.vertex1)).getPosition(); (t.vertex3.subtractPosition(t.vertex1)).crossProduct(t.vertex2.subtractPosition(t.vertex1)).getPosition();
normalMap.get(t.vertex1).add(triangleNormal); normalMap.get(t.vertex1).add(triangleNormal);
......
...@@ -4,7 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet; ...@@ -4,7 +4,7 @@ import cz.fidentis.analyst.mesh.core.MeshFacet;
import cz.fidentis.analyst.mesh.core.MeshModel; import cz.fidentis.analyst.mesh.core.MeshModel;
/** /**
* Computes a 3D bounding box (cube). * Visitor that computes a 3D bounding box (cube).
* *
* @author oslejsek * @author oslejsek
*/ */
......
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;
}
}
...@@ -17,12 +17,6 @@ public class BoundingBoxVisitorTest { ...@@ -17,12 +17,6 @@ public class BoundingBoxVisitorTest {
Path testFileDirectory = Paths.get("src", "test", "resources", "cz", "fidentis", "analyst", "mesh", "io"); 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 @Test
void icoSphereTest() throws IOException { void icoSphereTest() throws IOException {
MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj")); MeshModel m = MeshObjLoader.read(new File(testFileDirectory.toFile(), "IcoSphere-20.obj"));
......
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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment