/* * 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.util; import org.locationtech.jts.geom.Coordinate; import junit.framework.TestCase; /** * Tests {@link AffineTransformationBuilder}. * * @author Martin Davis */ public class AffineTransformationBuilderTest extends TestCase { public AffineTransformationBuilderTest(String name) { super(name); } public void testRotate1() { run(0, 0, 1, 0, 0, 1, 0, 0, 0, 1, -1, 0); } public void testRotate2() { run(0, 0, 1, 0, 0, 1, 0, 0, 1, 1, -1, 1); } public void testScale1() { run(0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 2); } public void testTranslate1() { run(0, 0, 1, 0, 0, 1, 5, 6, 6, 6, 5, 7); } public void testLinear1() { run(0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 5, 7); } public void testSingular2() { // points on a line mapping to collinear points - not uniquely specified runSingular(0, 0, 1, 1, 2, 2, 0, 0, 10, 10, 30, 30); } public void testSingular3() { // points on a line mapping to collinear points - not uniquely specified runSingular(0, 0, 1, 1, 2, 2, 0, 0, 10, 10, 20, 20); } public void testSingular1() { // points on a line mapping to non-collinear points - no solution runSingular(0, 0, 1, 1, 2, 2, 0, 0, 1, 2, 1, 3); } public void testSingleControl1() { run(0, 0, 5, 6); } public void testDualControl_Translation() { run(0, 0, 1, 1, 5, 5, 6, 6); } public void testDualControl_General() { run(0, 0, 1, 1, 5, 5, 6, 9); } void run(double p0x, double p0y, double p1x, double p1y, double p2x, double p2y, double pp0x, double pp0y, double pp1x, double pp1y, double pp2x, double pp2y ) { Coordinate p0 = new Coordinate(p0x, p0y); Coordinate p1 = new Coordinate(p1x, p1y); Coordinate p2 = new Coordinate(p2x, p2y); Coordinate pp0 = new Coordinate(pp0x, pp0y); Coordinate pp1 = new Coordinate(pp1x, pp1y); Coordinate pp2 = new Coordinate(pp2x, pp2y); AffineTransformationBuilder atb = new AffineTransformationBuilder( p0, p1, p2, pp0, pp1, pp2); AffineTransformation trans = atb.getTransformation(); Coordinate dest = new Coordinate(); assertEqualPoint(pp0, trans.transform(p0, dest)); assertEqualPoint(pp1, trans.transform(p1, dest)); assertEqualPoint(pp2, trans.transform(p2, dest)); } void run(double p0x, double p0y, double p1x, double p1y, double pp0x, double pp0y, double pp1x, double pp1y ) { Coordinate p0 = new Coordinate(p0x, p0y); Coordinate p1 = new Coordinate(p1x, p1y); Coordinate pp0 = new Coordinate(pp0x, pp0y); Coordinate pp1 = new Coordinate(pp1x, pp1y); AffineTransformation trans = AffineTransformationFactory.createFromControlVectors( p0, p1, pp0, pp1); Coordinate dest = new Coordinate(); assertEqualPoint(pp0, trans.transform(p0, dest)); assertEqualPoint(pp1, trans.transform(p1, dest)); } void run(double p0x, double p0y, double pp0x, double pp0y ) { Coordinate p0 = new Coordinate(p0x, p0y); Coordinate pp0 = new Coordinate(pp0x, pp0y); AffineTransformation trans = AffineTransformationFactory.createFromControlVectors( p0, pp0); Coordinate dest = new Coordinate(); assertEqualPoint(pp0, trans.transform(p0, dest)); } void runSingular(double p0x, double p0y, double p1x, double p1y, double p2x, double p2y, double pp0x, double pp0y, double pp1x, double pp1y, double pp2x, double pp2y ) { Coordinate p0 = new Coordinate(p0x, p0y); Coordinate p1 = new Coordinate(p1x, p1y); Coordinate p2 = new Coordinate(p2x, p2y); Coordinate pp0 = new Coordinate(pp0x, pp0y); Coordinate pp1 = new Coordinate(pp1x, pp1y); Coordinate pp2 = new Coordinate(pp2x, pp2y); AffineTransformationBuilder atb = new AffineTransformationBuilder( p0, p1, p2, pp0, pp1, pp2); AffineTransformation trans = atb.getTransformation(); assertEquals(trans, null); } private Coordinate ctl0 = new Coordinate(-10, -10); private Coordinate ctl1 = new Coordinate(10, 20); private Coordinate ctl2 = new Coordinate(10, -20); public void testTransform1() { AffineTransformation trans = new AffineTransformation(); trans.rotate(1); trans.translate(10, 10); trans.scale(2, 2); runTransform(trans, ctl0, ctl1, ctl2); } public void testTransform2() { AffineTransformation trans = new AffineTransformation(); trans.rotate(3); trans.translate(10, 10); trans.scale(2, 10); trans.shear(5, 2); trans.reflect(5, 8, 10, 2); runTransform(trans, ctl0, ctl1, ctl2); } private void runTransform(AffineTransformation trans, Coordinate p0, Coordinate p1, Coordinate p2) { Coordinate pp0 = trans.transform(p0, new Coordinate()); Coordinate pp1 = trans.transform(p1, new Coordinate()); Coordinate pp2 = trans.transform(p2, new Coordinate()); AffineTransformationBuilder atb = new AffineTransformationBuilder( p0, p1, p2, pp0, pp1, pp2); AffineTransformation atbTrans = atb.getTransformation(); Coordinate dest = new Coordinate(); assertEqualPoint(pp0, atbTrans.transform(p0, dest)); assertEqualPoint(pp1, atbTrans.transform(p1, dest)); assertEqualPoint(pp2, atbTrans.transform(p2, dest)); } private void assertEqualPoint(Coordinate p, Coordinate q) { assertEquals(p.x, q.x, 0.00005); assertEquals(p.y, q.y, 0.00005); } }