/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package org.locationtech.jts.geom;
import org.locationtech.jts.io.WKTReader;
import junit.framework.TestCase;
import junit.textui.TestRunner;
/**
* @version 1.7
*/
public class TriangleTest extends TestCase
{
private PrecisionModel precisionModel = new PrecisionModel();
private GeometryFactory geometryFactory = new GeometryFactory(precisionModel,
0);
WKTReader reader = new WKTReader(geometryFactory);
private static final double TOLERANCE = 1E-5;
public static void main(String args[])
{
TestRunner.run(TriangleTest.class);
}
public TriangleTest(String name)
{
super(name);
}
public void testInterpolateZ() throws Exception
{
checkInterpolateZ("LINESTRING(1 1 0, 2 1 0, 1 2 10)", new Coordinate(1.5,
1.5), 5);
checkInterpolateZ("LINESTRING(1 1 0, 2 1 0, 1 2 10)", new Coordinate(1.2,
1.2), 2);
checkInterpolateZ("LINESTRING(1 1 0, 2 1 0, 1 2 10)", new Coordinate(0, 0),
-10);
}
public void checkInterpolateZ(String wkt, Coordinate p, double expectedValue)
throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
double z = t.interpolateZ(p);
//System.out.println("Z = " + z);
assertEquals(expectedValue, z, 0.000001);
}
public void testArea3D() throws Exception
{
checkArea3D("POLYGON((0 0 10, 100 0 110, 100 100 110, 0 0 10))",
7071.067811865475);
checkArea3D("POLYGON((0 0 10, 100 0 10, 50 100 110, 0 0 10))",
7071.067811865475);
}
public void checkArea3D(String wkt, double expectedValue) throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
double area3D = t.area3D();
// System.out.println("area3D = " + area3D);
assertEquals(expectedValue, area3D, TOLERANCE);
}
public void testArea() throws Exception
{
// CW
checkArea("POLYGON((10 10, 20 20, 20 10, 10 10))", 50);
// CCW
checkArea("POLYGON((10 10, 20 10, 20 20, 10 10))", -50);
// degenerate point triangle
checkArea("POLYGON((10 10, 10 10, 10 10, 10 10))", 0);
// degenerate line triangle
checkArea("POLYGON((10 10, 20 10, 15 10, 10 10))", 0);
}
public void checkArea(String wkt, double expectedValue) throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
double signedArea = t.signedArea();
//System.out.println("signed area = " + signedArea);
assertEquals(expectedValue, signedArea, TOLERANCE);
double area = t.area();
assertEquals(Math.abs(expectedValue), area, TOLERANCE);
}
public void testAcute() throws Exception
{
// right triangle
checkAcute("POLYGON((10 10, 20 20, 20 10, 10 10))", false);
// CCW right tri
checkAcute("POLYGON((10 10, 20 10, 20 20, 10 10))", false);
// acute
checkAcute("POLYGON((10 10, 20 10, 15 20, 10 10))", true);
}
public void checkAcute(String wkt, boolean expectedValue) throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
boolean isAcute = t.isAcute();
//System.out.println("isAcute = " + isAcute);
assertEquals(expectedValue, isAcute);
}
public void testCircumCentre() throws Exception
{
// right triangle
checkCircumCentre("POLYGON((10 10, 20 20, 20 10, 10 10))", new Coordinate(
15.0, 15.0));
// CCW right tri
checkCircumCentre("POLYGON((10 10, 20 10, 20 20, 10 10))", new Coordinate(
15.0, 15.0));
// acute
checkCircumCentre("POLYGON((10 10, 20 10, 15 20, 10 10))", new Coordinate(
15.0, 13.75));
}
public void testCentroid() throws Exception
{
// right triangle
checkCentroid("POLYGON((10 10, 20 20, 20 10, 10 10))", new Coordinate(
(10.0 + 20.0 + 20.0) / 3.0, (10.0 + 20.0 + 10.0) / 3.0));
// CCW right tri
checkCentroid("POLYGON((10 10, 20 10, 20 20, 10 10))", new Coordinate(
(10.0 + 20.0 + 20.0) / 3.0, (10.0 + 10.0 + 20.0) / 3.0));
// acute
checkCentroid("POLYGON((10 10, 20 10, 15 20, 10 10))", new Coordinate(
(10.0 + 20.0 + 15.0) / 3.0, (10.0 + 10.0 + 20.0) / 3.0));
}
public void checkCentroid(String wkt, Coordinate expectedValue)
throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Coordinate centroid = Triangle.centroid(pt[0], pt[1], pt[2]);
//System.out.println("(Static) centroid = " + centroid);
assertEquals(expectedValue.toString(), centroid.toString());
// Test Instance version
//
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
centroid = t.centroid();
//System.out.println("(Instance) centroid = " + centroid.toString());
assertEquals(expectedValue.toString(), centroid.toString());
}
public void checkCircumCentre(String wkt, Coordinate expectedValue)
throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
Coordinate circumcentre = Triangle.circumcentre(pt[0], pt[1], pt[2]);
//System.out.println("(Static) circumcentre = " + circumcentre);
assertEquals(expectedValue.toString(), circumcentre.toString());
// Test Instance version
//
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
circumcentre = t.circumcentre();
//System.out.println("(Instance) circumcentre = " + circumcentre.toString());
assertEquals(expectedValue.toString(), circumcentre.toString());
}
public void testLongestSideLength() throws Exception
{
// right triangle
checkLongestSideLength("POLYGON((10 10 1, 20 20 2, 20 10 3, 10 10 1))",
14.142135623730951);
// CCW right tri
checkLongestSideLength("POLYGON((10 10 1, 20 10 2, 20 20 3, 10 10 1))",
14.142135623730951);
// acute
checkLongestSideLength("POLYGON((10 10 1, 20 10 2, 15 20 3, 10 10 1))",
11.180339887498949);
}
public void checkLongestSideLength(String wkt, double expectedValue)
throws Exception
{
Geometry g = reader.read(wkt);
Coordinate[] pt = g.getCoordinates();
double length = Triangle.longestSideLength(pt[0], pt[1], pt[2]);
//System.out.println("(Static) longestSideLength = " + length);
assertEquals(expectedValue, length, 0.00000001);
// Test Instance version
//
Triangle t = new Triangle(pt[0], pt[1], pt[2]);
length = t.longestSideLength();
//System.out.println("(Instance) longestSideLength = " + length);
assertEquals(expectedValue, length, 0.00000001);
}
}