package edu.stanford.rsl.conrad.phantom; import edu.stanford.rsl.conrad.geometry.shapes.simple.Cylinder; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.geometry.shapes.simple.Sphere; import edu.stanford.rsl.conrad.physics.PhysicalObject; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.UserUtil; public class TrigonometryPhantom extends AnalyticPhantom { /** * */ private static final long serialVersionUID = -7237819451464697136L; private double cylRadius = 100.; private double cylHeight = 200.; private double beadRadius = 2.; private double bigBeadRadius = 2 * beadRadius; private String func = "sin"; private String matBead = "PWO"; private String matCyl = "Plexiglass"; private int numberOfBeads = 24; @Override public String getBibtexCitation() { // TODO Auto-generated method stub return null; } @Override public String getMedlineCitation() { // TODO Auto-generated method stub return null; } @Override public String getName() { return "Trigonometry Phantom"; } @Override public void configure() { try { cylRadius = UserUtil.queryDouble("Cylinder radius", cylRadius); cylHeight = UserUtil.queryDouble("Cylinder height", cylHeight); beadRadius = UserUtil.queryDouble("Bead radius", beadRadius); numberOfBeads = UserUtil.queryInt("Number of beads", numberOfBeads); func = UserUtil.queryString("Evaluation function (sin, cos, tan)", func); matBead = UserUtil.queryString("Bead material", matBead); matCyl = UserUtil.queryString("Cylinder material", matCyl); buildPhantom(); } catch (Exception e) { // TODO: handle exception } } private void buildPhantom() { Cylinder shape = new Cylinder(cylRadius, cylRadius, cylHeight); PhysicalObject po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName(matCyl)); po.setShape(shape); add(po); for (int i = 0; i < numberOfBeads; i++) { double phi = computePhi(i); double x = cylRadius * Math.sin(phi); double y = cylRadius * Math.cos(phi); double z = evaluate(phi); Sphere sp = new Sphere(((i + 1) % 3 == 0) ? bigBeadRadius : beadRadius, new PointND(x, y, z)); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName(matBead)); po.setShape(sp); add(po); //sp = new Sphere(beadRadius, new PointND(x * Math.sin(Math.PI / 2), y * Math.cos(Math.PI / 2), 0.5 * z)); //po = new PhysicalObject(); //po.setMaterial(MaterialsDB.getMaterialWithName(matBead)); //po.setShape(sp); //add(po); } } private double evaluate(double phi) { if (func.equals("sin")) { return Math.sin(phi) * cylHeight / 2.0; } else if (func.equals("cos")) { return Math.cos(phi) * cylHeight / 2.0; } else { return Math.tan(phi) * cylHeight / 2.0; } } private double computePhi(int i) { return Math.PI * 2.0 * i / numberOfBeads; } }