package jumptest.junit; import java.util.*; import junit.framework.TestCase; import com.vividsolutions.jts.geom.*; import com.vividsolutions.jump.warp.*; import com.vividsolutions.jump.warp.Triangle; public class TriangulatorTestCase extends TestCase { private TestTriangulator triangulator = new TestTriangulator(); private GeometryFactory factory = new GeometryFactory(); public TriangulatorTestCase(String Name_) { super(Name_); } public static void main(String[] args) { String[] testCaseName = { TriangulatorTestCase.class.getName()}; junit.textui.TestRunner.main(testCaseName); } public void testContains2() { //Demonstrates that Saalfeld's point-in-triangle test is not robust. [Jon Aquino] Triangle t = new Triangle( new Coordinate(1684837.632040163, 501388.22581428883), new Coordinate(1700270.3028528732, 501388.22581428883), new Coordinate(1694394.5629020752, 500206.7497179573)); assertTrue(t.contains(new Coordinate(1694394.5629020752, 500206.74971795734))); } public void testTag() { Coordinate[] sourceQuad = new Coordinate[] { new Coordinate(1, 2), new Coordinate(3, 4), new Coordinate(5, 6), new Coordinate(7, 8)}; Coordinate[] destQuad = new Coordinate[] { new Coordinate(-1, -2), new Coordinate(-3, -4), new Coordinate(-5, -6), new Coordinate(-7, -8)}; TaggedCoordinate[] t = triangulator.tag(sourceQuad, destQuad); assertEquals(new Coordinate(3, 4), t[1]); assertEquals(new Coordinate(-3, -4), t[1].getTag()); } public void testAddVector() { assertEquals( new Coordinate(20, 35), triangulator.add( new Coordinate(10, 20), factory.createLineString( new Coordinate[] { new Coordinate(100, 100), new Coordinate(110, 115)}))); } public void testVectorWithNearestTail1() { LineString v1 = factory.createLineString( new Coordinate[] { new Coordinate(200, 200), new Coordinate(15, 15)}); LineString v2 = factory.createLineString( new Coordinate[] { new Coordinate(0, -20), new Coordinate(0, -10)}); List vectors = Arrays.asList(new LineString[] { v1, v2 }); Coordinate x = new Coordinate(10, 10); assertEquals(v2, triangulator.vectorWithNearestTail(x, vectors)); } private GeometryFactory geometryFactory = new GeometryFactory(); public void testVectorWithNearestTail2() { //flip v1 LineString v1 = geometryFactory.createLineString( new Coordinate[] { new Coordinate(15, 15), new Coordinate(200, 200)}); LineString v2 = geometryFactory.createLineString( new Coordinate[] { new Coordinate(0, -20), new Coordinate(0, -10)}); List vectors = Arrays.asList(new LineString[] { v1, v2 }); Coordinate x = new Coordinate(10, 10); assertEquals(v1, triangulator.vectorWithNearestTail(x, vectors)); } public void testTriangulateQuadrilateral() { Coordinate[] quad = new Coordinate[] { new Coordinate(0, 0), new Coordinate(10, 0), new Coordinate(10, 10), new Coordinate(0, 10)}; List triangles = triangulator.triangles(quad); assertEquals(2, triangles.size()); assertTrue(((Triangle) triangles.get(0)).equals(new TestTriangle(0, 0, 10, 0, 10, 10))); assertTrue(((Triangle) triangles.get(1)).equals(new TestTriangle(0, 0, 0, 10, 10, 10))); } public void testHeightMaximizedTriangles1() { Triangle t1 = new TestTriangle(0, 0, 20, 0, 15, 15); Triangle t2 = new TestTriangle(0, 0, 0, 20, 15, 15); Triangle a1 = new TestTriangle(0, 0, 20, 0, 0, 20); Triangle a2 = new TestTriangle(15, 15, 20, 0, 0, 20); List heightMaximizedTriangles = triangulator.heightMaximizedTriangles(t1, t2); Triangle x1 = (Triangle) heightMaximizedTriangles.get(0); Triangle x2 = (Triangle) heightMaximizedTriangles.get(1); assertTrue((t1.equals(x1) && t2.equals(x2)) || (t1.equals(x2) && t2.equals(x1))); assertTrue(!t1.equals(t2)); assertTrue(!x1.equals(x2)); assertTrue(!t1.equals(a1)); assertTrue(!t1.equals(a2)); assertTrue(!t2.equals(a1)); assertTrue(!t2.equals(a2)); } public void testMin() { TestTriangle t = new TestTriangle(0, 1, 2, 3, 4, 5); assertEquals(new Coordinate(0, 0), t.min(new Coordinate(0, 0), new Coordinate(1, 1))); assertEquals(new Coordinate(0, 1), t.min(new Coordinate(0, 1), new Coordinate(1, 0))); assertEquals(new Coordinate(0, 1), t.min(new Coordinate(1, 0), new Coordinate(0, 1))); assertEquals(new Coordinate(0, 0), t.min(new Coordinate(1, 1), new Coordinate(0, 0))); } public void testAlternativeTriangles() { Triangle t1 = new TestTriangle(0, 0, 20, 0, 10, 10); Triangle t2 = new TestTriangle(0, 0, 20, 0, 10, 11); //quad not convex [Jon Aquino] assertTrue(null == triangulator.alternativeTriangles(t1, t2)); } public void testHeightMaximizedTriangles2() { Triangle t1 = new TestTriangle(0, 0, 20, 0, 15, 15); Triangle t2 = new TestTriangle(0, 0, 0, 20, 15, 15); Triangle a1 = new TestTriangle(0, 0, 20, 0, 0, 20); Triangle a2 = new TestTriangle(15, 15, 20, 0, 0, 20); List heightMaximizedTriangles = triangulator.heightMaximizedTriangles(a1, a2); Triangle x1 = (Triangle) heightMaximizedTriangles.get(0); Triangle x2 = (Triangle) heightMaximizedTriangles.get(1); assertTrue((t1.equals(x1) && t2.equals(x2)) || (t1.equals(x2) && t2.equals(x1))); assertTrue(!t1.equals(t2)); assertTrue(!x1.equals(x2)); assertTrue(!x1.equals(a1)); assertTrue(!x1.equals(a2)); assertTrue(!x2.equals(a1)); assertTrue(!x2.equals(a2)); } public void testTriangleContaining() { Triangle triangle1 = new TestTriangle(0, 0, 10, 0, 10, 10); Triangle triangle2 = new TestTriangle(0, 0, 0, 10, 10, 10); ArrayList triangles = new ArrayList(); triangles.add(triangle1); triangles.add(triangle2); assertTrue( triangle1.equals(triangulator.triangleContaining(new Coordinate(5, 4), triangles))); assertTrue( !triangle2.equals(triangulator.triangleContaining(new Coordinate(5, 4), triangles))); assertTrue( !triangle1.equals(triangulator.triangleContaining(new Coordinate(5, 6), triangles))); assertTrue( triangle2.equals(triangulator.triangleContaining(new Coordinate(5, 6), triangles))); assertTrue(null == triangulator.triangleContaining(new Coordinate(20, 20), triangles)); assertTrue(!triangle1.contains(new Coordinate(0, 5))); assertTrue(triangle1.contains(new Coordinate(5, 5))); assertTrue(triangle1.contains(new Coordinate(10, 5))); assertTrue(triangle2.contains(new Coordinate(0, 5))); assertTrue(triangle2.contains(new Coordinate(5, 5))); assertTrue(!triangle2.contains(new Coordinate(10, 5))); } public void testHasVertex() { Triangle t = new TestTriangle(0, 0, 10, 0, 10, 10); assertTrue(t.hasVertex(new Coordinate(0, 0))); assertTrue(t.hasVertex(new Coordinate(10, 0))); assertTrue(t.hasVertex(new Coordinate(10, 10))); assertTrue(!t.hasVertex(new Coordinate(10, 1))); assertTrue(!t.hasVertex(new Coordinate(0, 10))); } public void testGetArea() { assertEquals(500, (new TestTriangle(0, 0, 100, 0, 0, 10)).getArea(), 1E-10); assertEquals(2500, (new TestTriangle(0, 0, 5, 0, 0, 1000)).getArea(), 1E-10); } public void testGetMinHeight() { assertEquals( 9.9503719020998913566527375373857, (new TestTriangle(0, 0, 100, 0, 0, 10)).getMinHeight(), 1E-10); } public void testToSimplicialCoordinate() { Triangle t = new TestTriangle(0, 1, 10, 12, 23, 20); Coordinate e = new Coordinate(5, 4); Coordinate s = t.toSimplicialCoordinate(e); Coordinate e2 = t.toEuclideanCoordinate(s); assertEquals(e.x, e2.x, 1E-13); assertEquals(e.y, e2.y, 1E-13); } private class TestTriangulator extends Triangulator { public TaggedCoordinate[] tag(Coordinate[] sourceQuad, Coordinate[] destQuad) { Quadrilateral taggedSourceQuad = super.tag( new Quadrilateral(sourceQuad[0], sourceQuad[1], sourceQuad[2], sourceQuad[3]), new Quadrilateral(destQuad[0], destQuad[1], destQuad[2], destQuad[3])); return new TaggedCoordinate[] { (TaggedCoordinate) taggedSourceQuad.getP1(), (TaggedCoordinate) taggedSourceQuad.getP2(), (TaggedCoordinate) taggedSourceQuad.getP3(), (TaggedCoordinate) taggedSourceQuad.getP4()}; } public List triangles(Coordinate[] quad) { return (new Quadrilateral(quad[0], quad[1], quad[2], quad[3])).triangles(); } public List alternativeTriangles(Triangle PQS, Triangle QRS) { return super.alternativeTriangles(PQS, QRS); } public Triangle triangleContaining(Coordinate vertex, List triangles) { return super.triangleContaining(vertex, triangles); } public List heightMaximizedTriangles(Triangle PQS, Triangle QRS) { return super.heightMaximizedTriangles(PQS, QRS); } public LineString vectorWithNearestTail(Coordinate x, List vectors) { return super.vectorWithNearestTail(x, vectors); } public Coordinate add(Coordinate a, LineString vector) { return super.add(a, vector); } } private class TestTriangle extends Triangle { public TestTriangle(double x1, double y1, double x2, double y2, double x3, double y3) { super(new Coordinate(x1, y1), new Coordinate(x2, y2), new Coordinate(x3, y3)); } protected Coordinate min(Coordinate a, Coordinate b) { return super.min(a, b); } } public void testContains() { Coordinate c = new Coordinate(1194845.037570758, 381015.872414322); Triangle t = new Triangle( new Coordinate(c), new Coordinate(1194963.831717294, 381197.705245446), new Coordinate(1194991.149065747, 381311.756990355)); assertTrue(t.contains(c)); } public void testContainsBasic() { doTestContainsBasic( new Triangle(new Coordinate(0, 0), new Coordinate(10, 0), new Coordinate(0, 10))); doTestContainsBasic( new Triangle(new Coordinate(0, 0), new Coordinate(0, 10), new Coordinate(10, 0))); } private void doTestContainsBasic(Triangle triangle) { assertTrue(triangle.contains(new Coordinate(1, 1))); assertTrue(triangle.contains(new Coordinate(0, 0))); assertTrue(triangle.contains(new Coordinate(5, 5))); assertTrue(!triangle.contains(new Coordinate(1, -1))); assertTrue(!triangle.contains(new Coordinate(-1, 1))); assertTrue(!triangle.contains(new Coordinate(5.1, 5.1))); } }