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

Added the comoutation of Voronoi point

parent cdd5ba4b
No related branches found
No related tags found
No related merge requests found
......@@ -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();
......
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