Esempio n. 1
0
  private final void renderCubeFaces(final double hfov, final double vfov) {
    /* fragile, but that's not public API and we know what we're doing... */
    final double cubeSize = frontSource.getWidth() - 1;

    /* prepare extended image */
    ipSource =
        ip.createProcessor(
            hfov == 2.0 * Math.PI ? imp.getWidth() + 1 : imp.getWidth(),
            vfov == Math.PI ? imp.getHeight() + 1 : imp.getHeight());
    prepareExtendedImage(imp.getProcessor(), ipSource);

    /* render cube faces */
    final EquirectangularProjection q = p.clone();
    q.resetOrientation();
    q.setTargetWidth(cubeSize);
    q.setTargetHeight(cubeSize);
    q.setF(0.5f);

    final InverseTransformMapping<EquirectangularProjection> qMapping =
        new InverseTransformMapping<EquirectangularProjection>(q);

    IJ.showStatus("Rendering cube faces...");
    IJ.showProgress(0, 6);
    qMapping.mapInterpolated(ipSource, frontSource);
    IJ.showProgress(1, 6);
    q.pan(Math.PI);
    qMapping.mapInterpolated(ipSource, backSource);
    IJ.showProgress(2, 6);
    q.resetOrientation();
    q.pan(Math.PI / 2);
    qMapping.mapInterpolated(ipSource, leftSource);
    IJ.showProgress(3, 6);
    q.resetOrientation();
    q.pan(-Math.PI / 2);
    qMapping.mapInterpolated(ipSource, rightSource);
    IJ.showProgress(4, 6);
    q.resetOrientation();
    q.tilt(-Math.PI / 2);
    qMapping.mapInterpolated(ipSource, topSource);
    IJ.showProgress(5, 6);
    q.resetOrientation();
    q.tilt(Math.PI / 2);
    qMapping.mapInterpolated(ipSource, bottomSource);
    IJ.showProgress(6, 6);

    if (showCubefaces) {
      new ImagePlus("front", frontSource).show();
      new ImagePlus("back", backSource).show();
      new ImagePlus("left", leftSource).show();
      new ImagePlus("right", rightSource).show();
      new ImagePlus("top", topSource).show();
      new ImagePlus("bottom", bottomSource).show();
    }
  }
Esempio n. 2
0
  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);
  }