package edu.stanford.rsl.conrad.geometry.transforms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
/**
* Class to model a chain of transforms.
* @author Rotimi X Ojo
*
*/
public class ComboTransform extends Transform {
private static final long serialVersionUID = -509282426585065975L;
protected ArrayList<Transform> transforms = new ArrayList<Transform>();
public ComboTransform(){
}
/**
* Create Combo Transform.
* @param t Ordered array of transforms. Transforms are applied from left to right.
*/
public ComboTransform(Transform...t) {
init(t);
}
/**
* Initializes a Combo Transform.
* @param t Ordered array of transforms. Transforms are applied from left to right.
*/
protected void init(Transform...t){
transforms.addAll(Arrays.asList(t));
}
/**
* Adds transforms to queue
* @param t Ordered array of transforms. Transforms are applied from left to right.
*/
protected void add(Transform... t){
transforms.addAll(Arrays.asList(t));
}
@Override
public PointND transform(PointND point){
PointND p = point.clone();
Iterator<Transform> it = transforms.iterator();
while(it.hasNext()){
p = it.next().transform(p);
}
return p;
}
@Override
public SimpleVector transform(SimpleVector dir){
SimpleVector p = dir.clone();
Iterator<Transform> it = transforms.iterator();
while(it.hasNext()){
p = it.next().transform(p);
}
return p;
}
/**
* Inverts the transformers and order of transformation
*/
@Override
public ComboTransform inverse(){
ComboTransform inverse = new ComboTransform();
for(int i = transforms.size()-1; i >=0; i--){
inverse.add(transforms.get(i).inverse());
}
return inverse;
}
@Override
public Transform clone() {
Transform []curr = new Transform [transforms.size()];
for(int i = 0; i < transforms.size();i++){
curr[i] = transforms.get(i).clone();
}
return new ComboTransform(curr);
}
@Override
public Transform [] getData() {
return transforms.toArray(new Transform[transforms.size()]);
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/