content: package edu.stanford.rsl.conrad.phantom.electrondensity;
  
  import edu.stanford.rsl.conrad.geometry.transforms.AffineTransform;
  import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
  import edu.stanford.rsl.conrad.numerics.SimpleVector;
  import edu.stanford.rsl.conrad.physics.materials.Material;
  import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB;
  import edu.stanford.rsl.conrad.rendering.PrioritizableScene;
  
  
  /**
   * Models the insert of an ED Phantom. Inserts can be either buffered or unbuffered. The default buffer material is water. 
   * @author Rotimi X Ojo
   *
   */
  public class Insert extends PrioritizableScene {
  
  	private static final long serialVersionUID = -6549158504106309805L;
  	public static int BUFFERED_INSERT = 1;
  	public static int UNBUFFERED_INSERT = 2;
  	
  	private double dx = 30.5/2,dy = 30.5/2, dz = 50/2;	
  	private QuadricDisk buffer = new QuadricDisk(dx, dy, dz);
  	private QuadricDisk disk;
  	private Material bufferMaterial = MaterialsDB.getMaterial("water");
  	private SimpleMatrix mat = new SimpleMatrix(3,3);
  	private int bufferState = UNBUFFERED_INSERT;
  	
  	/**
  	 * 
  	 * @param material
  	 * @param bufferState
  	 */
  	public Insert(Material material, int bufferState, double diameter) {
  		mat.identity();
  		if(material == null){
  			material =  MaterialsDB.getMaterialWithName("air");
  		}
  		
  		this.bufferState = bufferState;
  		
  		if(bufferState== BUFFERED_INSERT){
  			buffer.setMaterial(bufferMaterial);
  			buffer.setNameString("InsertBuffer");
  			disk = new QuadricDisk(diameter, diameter, dz);
  			disk.setMaterial(material);	
  			disk.setNameString("Insert");
  		}else{
  			buffer.setMaterial(material);
  			buffer.setNameString("InsertBuffer");
  		}
  		if(disk != null){
  			add(disk, 10);
  		}
  		add(buffer, 9);
  		
  	}
  	
  	public Insert(Material material, int bufferState) {
  		this(material, bufferState, 3);
  	}
  	
  	/**
  	 * 
  	 * @param material
  	 */
  	public void setBufferMaterial(Material material){
  		this.bufferMaterial = material;
  	}
  	/**
  	 * Gets the material of the buffer.
  	 * @return the Material
  	 */
  	public Material getBufferMaterial() {
  		return bufferMaterial;
  	}
  	
  	/**
  	 * 
  	 * @param index
  	 * @param distanceFromOrigin
  	 */
  	public void setLocation(int index, double distanceFromOrigin) {
  		double angle = (index)*Math.PI/4;
  		double x = distanceFromOrigin*Math.cos(angle);
  		double y = distanceFromOrigin*Math.sin(angle);
  		double z = 0;
  		buffer.applyTransform(new AffineTransform(mat, new SimpleVector(x,y,z)));
  		if(disk != null){
  			disk.applyTransform(new AffineTransform(mat, new SimpleVector(x,y,z)));
  		}
  	}
  	
  	@Override
  	public String toString(){
  		if(disk != null){
  			return disk.getMaterial().getName();
  		}
  		return buffer.getMaterial().getName();
  	}
  
  	/**
  	 * 
  	 * @return the state of the buffer.
  	 */
  	public int getBufferState() {
  		return bufferState;
  	}
  
  
  }
  /*
   * Copyright (C) 2010-2014 Rotimi X Ojo
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */