diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java index c2750aed83462b39410806a4e99431cb60ec7b0c..5df388a191fcb8850905f26ae81fc0933fae9f2b 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/core/MeshTriangle.java @@ -7,10 +7,9 @@ import java.util.NoSuchElementException; import javax.vecmath.Vector3d; /** - * - * @author Natália Bebjaková + * Adapter for the corner table representing a single triangle of {@code MeshFacet}. * - * Adapter for the corner table representing a single triangle of the @code{MeshFacet}. + * @author Natalia Bebjakova */ public class MeshTriangle implements Iterable<MeshPoint> { @@ -112,6 +111,66 @@ public class MeshTriangle implements Iterable<MeshPoint> { }; } + /** + * Return a center of circumcircle. This point represents the point + * of Voronoi area used for Delaunay triangulation, for instenace. + * + * @return the center of circumcircle + */ + public Vector3d getVoronoiPoint() { + double a = (vertex2.subtractPosition(vertex3)).abs(); + double b = (vertex3.subtractPosition(vertex1)).abs(); + double c = (vertex2.subtractPosition(vertex1)).abs(); + + double d1 = a * a * (b * b + c * c - a * a); + double d2 = b * b * (c * c + a * a - b * b); + double d3 = c * c * (a * a + b * b - c * c); + double dSum = d1 + d2 + d3; + + d1 /= dSum; + d2 /= dSum; + d3 /= dSum; + + MeshPoint v1Half = (vertex2.addPosition(vertex3)).dividePosition(2); + MeshPoint v2Half = (vertex1.addPosition(vertex3)).dividePosition(2); + MeshPoint v3Half = (vertex2.addPosition(vertex1)).dividePosition(2); + + + if (d1 < 0) { + double v3Area = ((v2Half.subtractPosition(vertex3)).crossProduct(v1Half.subtractPosition(vertex3))).abs() / 2.0; + double v2Area = ((v3Half.subtractPosition(vertex2)).crossProduct(v1Half.subtractPosition(vertex2))).abs() / 2.0; + double v1Area = (((v1Half.subtractPosition(vertex1)).crossProduct(v3Half.subtractPosition(vertex1))).abs() / 2.0) + + (((v1Half.subtractPosition(vertex1)).crossProduct(v2Half.subtractPosition(vertex1))).abs() / 2.0); + return new Vector3d(v1Area, v2Area, v3Area); + } + if (d2 < 0) { + double v1Area = ((v3Half.subtractPosition(vertex1)).crossProduct(v2Half.subtractPosition(vertex1))).abs() / 2.0; + double v3Area = ((v1Half.subtractPosition(vertex3)).crossProduct(v2Half.subtractPosition(vertex3))).abs() / 2.0; + double v2Area = (((v2Half.subtractPosition(vertex2)).crossProduct(v1Half.subtractPosition(vertex2))).abs() / 2.0) + + (((v2Half.subtractPosition(vertex2)).crossProduct(v3Half.subtractPosition(vertex2))).abs() / 2.0); + return new Vector3d(v1Area, v2Area, v3Area); + } + if (d3 < 0) { + double v2Area = ((v1Half.subtractPosition(vertex2)).crossProduct(v3Half.subtractPosition(vertex2))).abs() / 2.0; + double v1Area = ((v2Half.subtractPosition(vertex1)).crossProduct(v3Half.subtractPosition(vertex1))).abs() / 2.0; + double v3Area = (((v3Half.subtractPosition(vertex3)).crossProduct(v2Half.subtractPosition(vertex3))).abs() / 2.0) + + (((v3Half.subtractPosition(vertex3)).crossProduct(v1Half.subtractPosition(vertex3))).abs() / 2.0); + return new Vector3d(v1Area, v2Area, v3Area); + } + + MeshPoint circumcenter = vertex1.multiplyPosition(d1).addPosition(vertex2.multiplyPosition(d2).addPosition(vertex3.multiplyPosition(d3))); + + double v1Area = (((v2Half.subtractPosition(vertex1)).crossProduct(circumcenter.subtractPosition(vertex1))).abs() / 2.0) + + (((v3Half.subtractPosition(vertex1)).crossProduct(circumcenter.subtractPosition(vertex1))).abs() / 2.0); + + double v2Area = (((v3Half.subtractPosition(vertex2)).crossProduct(circumcenter.subtractPosition(vertex2))).abs() / 2.0) + + (((v1Half.subtractPosition(vertex2)).crossProduct(circumcenter.subtractPosition(vertex2))).abs() / 2.0); + + double v3Area = (((v1Half.subtractPosition(vertex3)).crossProduct(circumcenter.subtractPosition(vertex3))).abs() / 2.0) + + (((v2Half.subtractPosition(vertex3)).crossProduct(circumcenter.subtractPosition(vertex3))).abs() / 2.0); + return new Vector3d(v1Area, v2Area, v3Area); + } + @Override public String toString() { String ret = "TRI {" + System.lineSeparator();