content: package edu.stanford.rsl.conrad.geometry.transforms.test;
  
  import org.junit.Test;
  
  import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
  import edu.stanford.rsl.conrad.geometry.transforms.AffineTransform;
  import edu.stanford.rsl.conrad.geometry.transforms.ComboTransform;
  import edu.stanford.rsl.conrad.geometry.transforms.ScaleRotate;
  import edu.stanford.rsl.conrad.geometry.transforms.Translation;
  import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
  import edu.stanford.rsl.conrad.numerics.SimpleOperators;
  import edu.stanford.rsl.conrad.numerics.SimpleVector;
  import edu.stanford.rsl.conrad.utils.CONRAD;
  import edu.stanford.rsl.conrad.utils.TestingTools;
  
  
  /**
   * Class to test the accuracy of the {@link ComboTransform} class
   * 
   * @see ComboTransform
   * @author Rotimi X Ojo
   */
  public class TestComboTransform {
  
  	@Test
  	public void RunTest4() {
  		System.out.println("\tRunning Test 4");
  		SimpleVector oldDir = TestingTools.randVector(3);
  		SimpleVector translator= TestingTools.randVector(3);
  		ScaleRotate r1 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		SimpleMatrix afMat = TestingTools.randUpperTriangularMatrix(3, 3);
  		AffineTransform r2 = new AffineTransform(afMat, translator);
  		Translation r3 = new Translation(translator);
  		
  		ComboTransform scr = new ComboTransform(r3, r1, r2);
  		//Transform direction
  		SimpleVector newDir = scr.transform(oldDir);;
  		
  		assert(SimpleOperators.equalElementWise(newDir,SimpleOperators.multiply(afMat,SimpleOperators.multiply(r1.getData(),oldDir)),0));
  		//Transform Point
  		PointND oldP = new PointND(oldDir);
  		PointND newP = scr.transform(oldP);
  		assert(SimpleOperators.equalElementWise(newP.getAbstractVector(),SimpleOperators.add(translator,SimpleOperators.multiply(afMat,SimpleOperators.multiply(r1.getData(),SimpleOperators.add(r3.getData(),oldDir)))),0));		
  		//Inverse Transform
  		ComboTransform inscr = (ComboTransform) scr.inverse();
  		//Invert new Direction		
  		assert(SimpleOperators.equalElementWise(inscr.transform(newDir),oldDir,CONRAD.SMALL_VALUE*3));
  		//Invert new Point
  		assert(SimpleOperators.equalElementWise(inscr.transform(newP).getAbstractVector(),oldP.getAbstractVector(),CONRAD.SMALL_VALUE*3));	
  		
  	}
  
  	@Test
  	public void Runtest3() {
  		System.out.println("\tRunning Test 3");
  		SimpleVector oldDir = TestingTools.randVector(3);
  		SimpleVector translator= TestingTools.randVector(3);
  		ScaleRotate r1 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		SimpleMatrix afMat = TestingTools.randUpperTriangularMatrix(3, 3);
  		AffineTransform r2 = new AffineTransform(afMat, translator);
  		Translation r3 = new Translation(translator);
  		
  		ComboTransform scr = new ComboTransform(r1, r3, r2);
  		//Transform direction
  		SimpleVector newDir = scr.transform(oldDir);;
  		
  		assert(SimpleOperators.equalElementWise(newDir,SimpleOperators.multiply(afMat,SimpleOperators.multiply(r1.getData(),oldDir)),0));
  		//Transform Point
  		PointND oldP = new PointND(oldDir);
  		PointND newP = scr.transform(oldP);
  		assert(SimpleOperators.equalElementWise(newP.getAbstractVector(),SimpleOperators.add(translator,SimpleOperators.multiply(afMat,SimpleOperators.add(r3.getData(),SimpleOperators.multiply(r1.getData(),oldDir)))),0));		
  		//Inverse Transform
  		ComboTransform inscr = (ComboTransform) scr.inverse();
  		//Invert new Direction		
  		assert(SimpleOperators.equalElementWise(inscr.transform(newDir),oldDir,CONRAD.SMALL_VALUE*3));
  		//Invert new Point
  		assert(SimpleOperators.equalElementWise(inscr.transform(newP).getAbstractVector(),oldP.getAbstractVector(),CONRAD.SMALL_VALUE*3));		
  	}
  
  	@Test
  	public void RunTest2() {
  		System.out.println("\tRunning Test 2");
  		SimpleVector oldDir = TestingTools.randVector(3);
  		SimpleVector translator= TestingTools.randVector(3);
  		ScaleRotate r1 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		SimpleMatrix afMat = TestingTools.randUpperTriangularMatrix(3, 3);
  		AffineTransform r2 = new AffineTransform(afMat, translator);
  		Translation r3 = new Translation(translator);
  		
  		ComboTransform scr = new ComboTransform(r1, r2, r3);
  		//Transform direction
  		SimpleVector newDir = scr.transform(oldDir);;
  		
  		assert(SimpleOperators.equalElementWise(newDir,SimpleOperators.multiply(afMat,SimpleOperators.multiply(r1.getData(),oldDir)),0));
  		//Transform Point
  		PointND oldP = new PointND(oldDir);
  		PointND newP = scr.transform(oldP);
  		assert(SimpleOperators.equalElementWise(newP.getAbstractVector(),SimpleOperators.add(r3.getData(),SimpleOperators.add(translator,SimpleOperators.multiply(afMat,SimpleOperators.multiply(r1.getData(),oldDir)))),0));		
  		//Inverse Transform
  		ComboTransform inscr = (ComboTransform) scr.inverse();
  		//Invert new Direction		
  		assert(SimpleOperators.equalElementWise(inscr.transform(newDir),oldDir,CONRAD.SMALL_VALUE*3));
  		//Invert new Point
  		assert(SimpleOperators.equalElementWise(inscr.transform(newP).getAbstractVector(),oldP.getAbstractVector(),CONRAD.SMALL_VALUE*3));
  		
  	}
  
  	@Test
  	public void RunTest1() {
  		System.out.println("\tRunning Test 1");
  		SimpleVector oldDir = TestingTools.randVector(3);
  		ScaleRotate r1 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		ScaleRotate r2 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		ScaleRotate r3 = new ScaleRotate(TestingTools.randUpperTriangularMatrix(3, 3));
  		
  		ComboTransform scr = new ComboTransform(r1, r2, r3);
  		//Transform direction
  		SimpleVector newDir = scr.transform(oldDir);;
  		assert(SimpleOperators.equalElementWise(newDir,SimpleOperators.multiply(r3.getData(),SimpleOperators.multiply(r2.getData(),SimpleOperators.multiply(r1.getData(), oldDir))),0));
  		//Transform Point
  		PointND oldP = new PointND(oldDir);
  		PointND newP = scr.transform(oldP);
  		assert(SimpleOperators.equalElementWise(newP.getAbstractVector(),SimpleOperators.multiply(r3.getData(),SimpleOperators.multiply(r2.getData(),SimpleOperators.multiply(r1.getData(), oldDir))),0));
  		//Inverse Transform
  		ComboTransform inscr = (ComboTransform) scr.inverse();
  		//Invert new Direction		
  		assert(SimpleOperators.equalElementWise(inscr.transform(newDir),oldDir,CONRAD.SMALL_VALUE*3));
  		//Invert new Point
  		assert(SimpleOperators.equalElementWise(inscr.transform(newP).getAbstractVector(),oldP.getAbstractVector(),CONRAD.SMALL_VALUE*3));
  		
  	}
  
  }
  /*
   * Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */