package edu.stanford.rsl.conrad.geometry.test; import ij.ImageJ; import ij.ImagePlus; import ij.process.FloatProcessor; import java.util.ArrayList; import junit.framework.Assert; import org.junit.Test; import edu.stanford.rsl.conrad.geometry.ConvexHull; import edu.stanford.rsl.conrad.geometry.Projection; import edu.stanford.rsl.conrad.geometry.shapes.simple.Point3D; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.geometry.trajectories.CircularTrajectory; import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.phantom.renderer.PhantomRenderer; import edu.stanford.rsl.conrad.utils.DoublePrecisionPointUtil; public class GeometryTests { @Test public void testConvexHull2D(){ int width = 480; int height = 480; FloatProcessor test = new FloatProcessor(width, height); PointND [] points = new PointND[2000]; for (int i = 0; i < points.length; i++){ points[i] = new PointND(new SimpleVector(3)); points[i].getAbstractVector().randomize(0, height*0.8); points[i].getAbstractVector().add(height*0.05); points[i].getAbstractVector().setElementValue(2, 0); test.putPixelValue((int)(points[i].get(0)), (int)(points[i].get(1)), 10.0); } ConvexHull hull = new ConvexHull(points); hull.build2D(); PointND [] list = hull.getHullPoints(); test.setColor(15); for (int i = 1; i < list.length; i++){ test.drawLine((int)list[i-1].get(0), (int)list[i-1].get(1), (int)list[i].get(0), (int)list[i].get(1)); test.putPixelValue((int)(list[i-1].get(0)), (int)(list[i-1].get(1)), 20.0); test.putPixelValue((int)(list[i-1].get(0)), (int)(list[i-1].get(1)), 20.0); } //test.drawLine((int)list[list.length-1].get(0), (int)list[list.length-1].get(1), (int)list[0].get(0), (int)list[0].get(0)); //new ImageJ(); //VisualizationUtil.showImageProcessor(test); for(int i = 0; i< points.length; i++){ PointND p = points[i]; if (!hull.isInside(p)){ //System.out.println(p + " " + i + " " + points.length); } Assert.assertEquals(true, hull.isInside(p)); } Assert.assertEquals(false, hull.isInside(new Point3D(0,0,0))); Assert.assertEquals(false, hull.isInside(new Point3D(width,0,0))); Assert.assertEquals(false, hull.isInside(new Point3D(width,height,0))); Assert.assertEquals(false, hull.isInside(new Point3D(0,height,0))); //try { // Thread.sleep(100000); //} catch (InterruptedException e) { // TODO Auto-generated catch block //e.printStackTrace(); //} } @Test public void testConvexHull3D(){ int width = 200; int height = 200; int depth = 300; ImagePlus phantom = PhantomRenderer.createEmptyVolume("tes", width, height, depth); FloatProcessor test = (FloatProcessor) phantom.getStack().getProcessor(1); PointND [] points = new PointND[20000]; for (int i = 0; i < points.length; i++){ points[i] = new PointND(new SimpleVector(3)); points[i].getAbstractVector().randomize(0, height*0.8); points[i].getAbstractVector().add(height*0.05); test = (FloatProcessor) phantom.getStack().getProcessor((int) (1+points[i].get(2))); test.putPixelValue((int)(points[i].get(0)), (int)(points[i].get(1)), 10.0); } ConvexHull hull = new ConvexHull(points); hull.build(); PointND [] list = hull.getRasterPoints(2000); test.setColor(15); for (int i = 0; i < list.length; i++){ //System.out.println(list[i]); test = (FloatProcessor) phantom.getStack().getProcessor((int) Math.round(1+list[i].get(2))); test.putPixelValue((int)(list[i].get(0)), (int)(list[i].get(1)), 20.0); } //test.drawLine((int)list[list.length-1].get(0), (int)list[list.length-1].get(1), (int)list[0].get(0), (int)list[0].get(0)); new ImageJ(); phantom.show(); //try { // Thread.sleep(1000000); //} catch (InterruptedException e) { // TODO Auto-generated catch block // e.printStackTrace(); //} //VisualizationUtil.showImageProcessor(test); for(int i = 0; i< points.length; i++){ PointND p = points[i]; if (!hull.isInside(p)){ System.out.println(p + " " + i + " " + points.length); } Assert.assertEquals(true, hull.isInside(p)); } Assert.assertEquals(false, hull.isInside(new Point3D(0,0,0))); Assert.assertEquals(false, hull.isInside(new Point3D(width,0,0))); Assert.assertEquals(false, hull.isInside(new Point3D(width,height,0))); Assert.assertEquals(false, hull.isInside(new Point3D(0,height,0))); } @Test public void testIsoCenterComputation(){ CircularTrajectory geom = new CircularTrajectory(new Trajectory()); geom.setSourceToDetectorDistance(1200); geom.setPixelDimensionX(0.616); geom.setPixelDimensionY(0.616); geom.setDetectorWidth(640); geom.setDetectorHeight(480); geom.setSourceToAxisDistance(800); geom.setTrajectory(200, 800, 1, 0, 0, Projection.CameraAxisDirection.DETECTORMOTION_PLUS, Projection.CameraAxisDirection.ROTATIONAXIS_PLUS, new SimpleVector(0,0,1)); PointND isocenter = geom.computeIsoCenter(); // Check consistency: ArrayList<PointND> testList1 = new ArrayList<PointND>(); ArrayList<PointND> testList2 = new ArrayList<PointND>(); for (int i = 0; i < 100; i++){ testList1.add(geom.computeIsoCenterOld()); testList2.add(geom.computeIsoCenter()); } for (int i = 0; i < 100; i++){ System.out.println(testList1.get(i)); System.out.println(testList2.get(i)); } System.out.println(DoublePrecisionPointUtil.getGeometricCenter(testList1) + " " + DoublePrecisionPointUtil.getGeometricCenter(testList2)); System.out.println(DoublePrecisionPointUtil.getStandardDeviation(testList1) + " " + DoublePrecisionPointUtil.getStandardDeviation(testList2)); // iso center new is way more stable: System.out.println(isocenter); Assert.assertEquals(new PointND(0,0,0), isocenter); } } /* * Copyright (C) 2010-2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */