package com.revolsys.elevation.tin; import com.revolsys.geometry.algorithm.CGAlgorithms; import com.revolsys.geometry.model.Point; import com.revolsys.geometry.model.Triangle; import com.revolsys.geometry.model.coordinates.list.CoordinatesListUtil; import com.revolsys.geometry.model.impl.Circle; import com.revolsys.geometry.model.impl.TriangleDoubleXYZ; import com.revolsys.util.MathUtil; public class TriangleWithCircumcircle extends TriangleDoubleXYZ { private static final long serialVersionUID = 1L; public static Triangle newClockwiseTriangle(final double x1, final double y1, final double x2, final double y2, final double x3, final double y3) { return newClockwiseTriangle(x1, y1, Double.NaN, x2, y2, Double.NaN, x3, y3, Double.NaN); } public static TriangleWithCircumcircle newClockwiseTriangle(final double x1, final double y1, final double z1, final double x2, final double y2, final double z2, final double x3, final double y3, final double z3) { if (CoordinatesListUtil.orientationIndex(x1, y1, x2, y2, x3, y3) == CGAlgorithms.CLOCKWISE) { return new TriangleWithCircumcircle(// x1, y1, z1, // x2, y2, z2, // x3, y3, z3); } else { return new TriangleWithCircumcircle(// x1, y1, z1, // x3, y3, z3, // x2, y2, z2); } } public static TriangleWithCircumcircle newClockwiseTriangle(final Point p1, final Point p2, final Point p3) { final double x1 = p1.getX(); final double y1 = p1.getY(); final double z1 = p1.getZ(); final double x2 = p2.getX(); final double y2 = p2.getY(); final double z2 = p2.getZ(); final double x3 = p3.getX(); final double y3 = p3.getY(); final double z3 = p3.getZ(); return newClockwiseTriangle(x1, y1, z1, x2, y2, z2, x3, y3, z3); } public static TriangleWithCircumcircle newTriangle(final Point p1, final Point p2, final Point p3) { final double x1 = p1.getX(); final double y1 = p1.getY(); final double z1 = p1.getZ(); final double x2 = p2.getX(); final double y2 = p2.getY(); final double z2 = p2.getZ(); final double x3 = p3.getX(); final double y3 = p3.getY(); final double z3 = p3.getZ(); return new TriangleWithCircumcircle(// x1, y1, z1, // x2, y2, z2, // x3, y3, z3); } private double centreX = Double.NaN; private double centreY = Double.NaN; private double radius = Double.NaN; public TriangleWithCircumcircle(final double x1, final double y1, final double z1, final double x2, final double y2, final double z2, final double x3, final double y3, final double z3) { super(x1, y1, z1, x2, y2, z2, x3, y3, z3); try { final double[] centre = Triangle.getCircumcentreCoordinates(x1, y1, x2, y2, x3, y3); this.centreX = centre[X]; this.centreY = centre[Y]; this.radius = Triangle.getCircumcircleRadius(this.centreX, this.centreY, x3, y3); } catch (final Throwable e) { } } @Override public boolean circumcircleContains(final double x, final double y) { final double distanceFromCentre = MathUtil.distance(this.centreX, this.centreY, x, y); return distanceFromCentre < this.radius + 0.0001; } @Override public TriangleWithCircumcircle clone() { return (TriangleWithCircumcircle)super.clone(); } @Override public Point getCircumcentre() { return getGeometryFactory().point(this.centreX, this.centreY); } @Override public Circle getCircumcircle() { final Point circumcentre = getCircumcentre(); return new Circle(circumcentre, this.radius); } @Override public double getCircumcircleRadius() { return this.radius; } }