content: package edu.stanford.rsl.conrad.reconstruction.voi;
  
  import java.io.BufferedReader;
  import java.io.FileReader;
  import java.io.IOException;
  
  /**
   * Describes a VOI consisting of a cylinder with one cone on top and one cone on the bottom. This is a typical VOI for a C-arm CT acquisition.
   * @author akmaier
   *
   */
  public class CylinderBasedVolumeOfInterest extends VolumeOfInterest {
  
  	/**
  	 * 
  	 */
  	private static final long serialVersionUID = 431870065424171642L;
  	double radius;
  	double minz, maxz;
  	double cylinderminz, cylindermaxz;
  	private boolean success = false;
  	@Override
  	public boolean contains(double x, double y, double z) {
  		boolean contains = false;
  		if ((z < cylindermaxz) && (z > cylinderminz)){
  			contains = inRadius(x, y, radius);
  		} else {
  			if ((z > cylindermaxz) && (z < maxz)){
  				double maxrange = maxz - cylindermaxz;
  				double fraction = 1.0  - ((z - cylindermaxz) / maxrange);
  				contains = inRadius(x, y, radius * fraction);
  			} else {
  				if ((z < cylinderminz) && (z > minz)){
  					double maxrange = cylinderminz - minz;
  					double fraction = 1.0  - ((cylinderminz - z) / maxrange);
  					contains = inRadius(x, y, radius * fraction);
  				}
  			}
  		}
  		return contains;
  	}
  	
  	private boolean inRadius(double x, double y, double radius){
  		double sqrDistance = Math.pow(x, 2) + Math.pow(y ,2);
  		return (sqrDistance < Math.pow(radius, 2));
  	}
  
  	public void readConfigFile(String filename) throws IOException {
  		FileReader read = new FileReader(filename);
  		BufferedReader bufferedReader = new BufferedReader(read);
  		String line = "";
  		//skip four lines
  		line = bufferedReader.readLine();
  		if (line.contains("version 3")){
  			line = bufferedReader.readLine();
  			line = bufferedReader.readLine();
  			line = bufferedReader.readLine();
  			if (debug) System.out.println(line);
  			String [] entries = line.split("\\s+");
  			radius = Double.parseDouble(entries[1]);
  			line = bufferedReader.readLine();
  			entries = line.split("\\s+");
  			cylinderminz = Double.parseDouble(entries[1]);
  			line = bufferedReader.readLine();
  			entries = line.split("\\s+");
  			cylindermaxz = Double.parseDouble(entries[1]);
  			line = bufferedReader.readLine();
  			entries = line.split("\\s+");
  			minz = Double.parseDouble(entries[1]);
  			line = bufferedReader.readLine();
  			entries = line.split("\\s+");
  			maxz = Double.parseDouble(entries[1]);
  		}
  		success = true;
  		bufferedReader.close();
  	}
  
  	public boolean getSuccess() {
  		return success;
  	}
  
  }
  /*
   * Copyright (C) 2010-2014 Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */