package edu.stanford.rsl.conrad.phantom.forbild;
import java.util.regex.Pattern;
import edu.stanford.rsl.conrad.geometry.AbstractShape;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
import edu.stanford.rsl.conrad.geometry.shapes.simple.SimpleSurface;
import edu.stanford.rsl.conrad.geometry.shapes.simple.Sphere;
import edu.stanford.rsl.conrad.geometry.transforms.ScaleRotate;
import edu.stanford.rsl.conrad.geometry.transforms.Transform;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.phantom.forbild.shapes.ForbildBox;
import edu.stanford.rsl.conrad.phantom.forbild.shapes.ForbildCone;
import edu.stanford.rsl.conrad.phantom.forbild.shapes.ForbildCylinder;
import edu.stanford.rsl.conrad.phantom.forbild.shapes.ForbildEllipsoid;
import edu.stanford.rsl.conrad.phantom.forbild.shapes.ForbildSphere;
/**
* <p>This class creates a forbild surface given an appropriate definition.</p>
*
* @author Rotimi .X. Ojo
*
*/
public class ForbildShapeFactory {
/**
* Determines AbstractShape specified by given bound expressions
* @param objBounds forbild bound definition e.g [ Box: x=0; y=9; z=2.5; dx=2.5; dy=0.8; dz=25;]
* @return shape
*/
public static AbstractShape getShape(String objBounds) {
objBounds = objBounds.substring(2,objBounds.indexOf(']'));
SimpleSurface shape = getBaseShape(objBounds);
return shape;
}
public static SimpleSurface getBaseShape(String objBounds){
String lower = objBounds.toLowerCase();
// Forbild uses degrees instead of radians, thus, we convert them to a special degree function (cosd,sind,tand).
objBounds = objBounds.replaceAll("(?i)\\bcos\\b", "cosd").
replaceAll("(?i)\\bsin\\b", "sind").
replaceAll("(?i)\\btan\\b", "tand");
// Forbild uses cm instead of mm as units, thus we apply a scaling by 10 to all Forbild shapes
Transform cmTOmm = new ScaleRotate(SimpleMatrix.I_3.multipliedBy(10));
SimpleSurface result = null;
// debugging
//if (lower.contains("ellipt_cyl") && lower.contains("axis(1,0,0)")){
//System.out.println(objBounds);
if(lower.contains("cyl")){
result = new ForbildCylinder(objBounds);
}else if(lower.contains("sphere")){
result = new ForbildSphere(objBounds);
}else if(lower.contains("ellipsoid")){
result = new ForbildEllipsoid(objBounds);
}else if(lower.contains("box")){
result = new ForbildBox(objBounds);
}else if(lower.contains("cone")){
result = new ForbildCone(objBounds);
}
result.applyTransform(cmTOmm);
//}
return result;
}
}
/*
* Copyright (C) 2010-2014 Rotimi X Ojo
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/