Esempio n. 1
0
  private void drawLine(Graphics g, Vector p, Vector q) {
    // FIXME: maybe eliminate class instantiations
    // from this method for performance reasons:
    // use static point arrays for transformations

    Vector u = rotation.apply(p.sub(origin));
    Vector v = rotation.apply(q.sub(origin));

    Point2D.Double from = new Point2D.Double(u.getX(), u.getZ());
    Point2D.Double to = new Point2D.Double(v.getX(), v.getZ());

    Point ifrom = new Point();
    Point ito = new Point();

    transform.transform(from, ifrom);
    transform.transform(to, ito);

    //		g.drawLine(xInt(u.getX()),yInt(u.getZ()),
    //				xInt(v.getX()),yInt(v.getZ()));

    g.drawLine(ifrom.x, ifrom.y, ito.x, ito.y);
  }
Esempio n. 2
0
  private void initTransform(Graphics g) throws Exception {
    // Perform transformation
    transform = new AffineTransform();
    double dw = 1;
    double minw = 0;
    double dh = 0;
    double minh = 0;
    double scale;
    double x;
    double y;
    // double abs;
    final int margin = 5;

    int showLevel = previewTree.getShowLevel();

    class FindAStem extends DefaultTreeTraversal {
      Stem found = null;
      int level;

      public FindAStem(int level) {
        this.level = level;
      }

      public Stem getFound() {
        return found;
      }

      public boolean enterStem(Stem stem) {
        if (found == null && stem.stemlevel < level) return true; // look further
        else if (found != null || stem.stemlevel > level) return false; // found a stem or too deep
        else if (stem.stemlevel == level) found = stem;

        return true;
      }

      public boolean leaveTree(Tree tree) {
        return (found != null);
      }
    }

    if (showLevel < 1) {
      setOrigin(new Vector());

      //////////// FRONT view
      if (perspective == PERSPECTIVE_FRONT) {
        // get width and height of the tree
        dw = previewTree.getWidth() * 2;
        dh = previewTree.getHeight();
        minh = 0;
        minw = -dw / 2;
        ///////////////// TOP view
      } else {
        // get width of the tree
        dw = previewTree.getWidth() * 2;
        minw = -dw / 2;
      }

    } else {

      // find stem which to show
      /*			Enumeration e = previewTree.allStems(showLevel-1);
      if (! e.hasMoreElements()) throw new Exception("Stem not found");
      Stem stem = (Stem)e.nextElement();
      */
      Stem aStem = null;
      FindAStem stemFinder = new FindAStem(showLevel - 1);
      if (previewTree.traverseTree(stemFinder)) {
        aStem = stemFinder.getFound();
      }

      if (aStem != null) {
        Vector diag = aStem.getMaxPoint().sub(aStem.getMinPoint());
        Vector orig = aStem.getTransformation().getT();
        setOrigin(new Vector(orig.getX(), orig.getY(), 0));
        Vector max = aStem.getMaxPoint();
        Vector min = aStem.getMinPoint();

        // get greatest distance from orig
        x = Math.max(Math.abs(min.getX() - orig.getX()), Math.abs(max.getX() - orig.getX()));
        y = Math.max(Math.abs(min.getY() - orig.getY()), Math.abs(max.getY() - orig.getY()));

        dw = Math.sqrt(x * x + y * y) * 2;
        minw = -dw / 2;

        dh = diag.getZ();
        minh = min.getZ();
      }
      // DEBUG
      //			System.err.println("O: "+ orig +" min: "+min+" max: "+max);
      //			System.err.println("maxX: "+x+" maxY: "+y);
      //			System.err.println("dg: "+diag+" dw: "+dw+" minw: "+minw+" dh: "+dh+" minh: "+minh);
    }

    //////////// FRONT view
    if (perspective == PERSPECTIVE_FRONT) {

      // how much to scale for fitting into view?
      scale = Math.min((getHeight() - 2 * margin) / dh, (getWidth() - 2 * margin) / dw);

      if (previewTree.params.debug) System.err.println("scale: " + scale);

      // shift to mid point of the view
      transform.translate(getWidth() / 2, getHeight() / 2);
      // scale to image height
      transform.scale(scale, -scale);
      // shift mid of the tree to the origin of the image
      transform.translate(-minw - dw / 2, -minh - dh / 2);

      ///////////////// TOP view
    } else {

      // how much to scale for fitting into view?
      scale = Math.min((getHeight() - 2 * margin) / dw, (getWidth() - 2 * margin) / dw);

      // shift to mid point of the view
      transform.translate(getWidth() / 2, getHeight() / 2);
      // scale to image height
      transform.scale(scale, -scale);
      // shift mid of the stem to the origin of the image
      transform.translate(-minw - dw / 2, -minw - dw / 2);
    }

    // DEBUG
    Point p = new Point();
    transform.transform(new Point2D.Double(0.0, 0.0), p);
    if (previewTree.params.debug) {
      System.err.println("width: " + minw + "+" + dw);
      System.err.println("height: " + minh + "+" + dh);
      System.err.println("Origin at: " + p);
      System.err.println("view: " + getWidth() + "x" + getHeight());
    }
  }