public final void run( final ImagePlus imp, final int width, final int height, final double minLambda, final double minPhi, final double hfov, final double vfov) { ip = imp.getProcessor().createProcessor(width, height); final ImagePlus impViewer = new ImagePlus("Panorama View", ip); /* initialize projection */ p.setMinLambda(minLambda); p.setMinPhi(minPhi); p.setLambdaPiScale(Math.PI / hfov * imp.getWidth()); p.setPhiPiScale(Math.PI / vfov * (imp.getHeight() - 1)); p.setTargetWidth(ip.getWidth()); p.setTargetHeight(ip.getHeight()); p.setF(0.5); System.out.println(p.getLambdaPiScale() + " " + p.getPhiPiScale()); /* TODO calculate proper size */ // final int cubeSize = 500; final int cubeSize = (int) Math.round(Math.max(p.getPhiPiScale(), p.getLambdaPiScale()) * 2.0 / Math.PI); frontSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); backSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); leftSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); rightSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); topSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); bottomSource = ip.createProcessor(cubeSize + 1, cubeSize + 1); renderCubeFaces(hfov, vfov); /* instantiate and run mapper and painter */ final Mapper mapper = new CubeFaceMapper( frontSource, backSource, leftSource, rightSource, topSource, bottomSource, p); painter = new MappingThread(imp, impViewer, mapper, ip, p); impViewer.show(); gui = new GUI(impViewer); gui.backupGui(); gui.takeOverGui(); painter.start(); update(false); }