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 a70f32d036bcfc3352a538bddc292a600de0d38a..cf00f0daf9c811b2f20660ad8e46d7beaf8a36a8 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 @@ -2,6 +2,7 @@ package cz.fidentis.analyst.mesh.core; import java.util.List; import cz.fidentis.analyst.mesh.MeshVisitor; +import javax.vecmath.Vector3d; /** * An ancapsulated mesh plate, i.e., multiple triangles sharing vertices. @@ -66,6 +67,36 @@ public interface MeshFacet extends Iterable<MeshTriangle> { */ int getNumTriangles(); + /** + * Returns triangles sharing the given mesh vertex. + * + * @param vertexIndex Index of the mesh vertex + * @return Triangles sharing the mesh vertex + */ + List<MeshTriangle> getAdjacentTriangles(int vertexIndex); + + /** + * Finds and returns a point lying at triangles around (sharing) the given mesh vertex + * and being the closest to a 3D point. + * + * @param point 3D point + * @param vertexIndex Index of mesh vertex + * @return The closest surface point near the mesh vertex being closest + * to the given 3D point + */ + Vector3d getClosestAdjacentPoint(Vector3d point, int vertexIndex); + + /** + * Returns the distance between a 3D point and triangles around (sharing) + * the given mesh vertex. It is the distance between the 3D point and + * point found by the {@link MeshFacet#getClosestAdjacentPoint} method. + * + * @param point 3D point + * @param vertexIndex Index of mesh vertex + * @return Distance + */ + double curvatureDistance(Vector3d point, int vertexIndex); + /** * Visits this facet. * 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 7ad43d2b90a18fd2df36b7601797dc106f8340b5..a2b6a48d771385a3a728e434c3cddf5a6fcf1df9 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 @@ -107,6 +107,62 @@ public class MeshFacetImpl implements MeshFacet { return cornerTable.getSize(); } + @Override + public List<MeshTriangle> getAdjacentTriangles(int vertexIndex) { + List<MeshTriangle> ret = new ArrayList<>(); + + List<Integer> adjacentTrianglesI = cornerTable.getTriangleIndexesByVertexIndex(vertexIndex); + for (Integer triI: adjacentTrianglesI) { + List<Integer> triVerticesI = cornerTable.getIndexesOfVerticesByTriangleIndex(triI); + MeshTriangle tri = new MeshTriangle( + getVertex(triVerticesI.get(0)), + getVertex(triVerticesI.get(1)), + getVertex(triVerticesI.get(2)), + triVerticesI.get(0), + triVerticesI.get(1), + triVerticesI.get(2)); + ret.add(tri); + } + + return ret; + } + + @Override + public Vector3d getClosestAdjacentPoint(Vector3d point, int vertexIndex) { + double dist = Double.POSITIVE_INFINITY; + Vector3d ret = null; + + for (MeshTriangle tri: this.getAdjacentTriangles(vertexIndex)) { + Vector3d projection = tri.getClosestPoint(point); + Vector3d aux = new Vector3d(projection); + aux.sub(point); + double d = aux.length(); + if (d < dist) { + dist = d; + ret = projection; + } + } + + return ret; + } + + @Override + public double curvatureDistance(Vector3d point, int vertexIndex) { + double dist = Double.POSITIVE_INFINITY; + + for (MeshTriangle tri: this.getAdjacentTriangles(vertexIndex)) { + Vector3d projection = tri.getClosestPoint(point); + Vector3d aux = new Vector3d(projection); + aux.sub(point); + double d = aux.length(); + if (d < dist) { + dist = d; + } + } + + return dist; + } + @Override public Iterator<MeshTriangle> iterator() { return new Iterator<MeshTriangle>() {