Exemplo n.º 1
0
 /** Transform a bounding box. This is only a rough estimate. */
 public Rectangle2D transform(Rectangle2D r) {
   Point2D.Double in = new Point2D.Double();
   Point2D.Double out = new Point2D.Double();
   Rectangle2D bounds = null;
   if (isRectilinear()) {
     for (int ix = 0; ix < 2; ix++) {
       double x = r.getX() + r.getWidth() * ix;
       for (int iy = 0; iy < 2; iy++) {
         double y = r.getY() + r.getHeight() * iy;
         in.x = x;
         in.y = y;
         transform(in, out);
         if (ix == 0 && iy == 0) bounds = new Rectangle2D.Double(out.x, out.y, 0, 0);
         else bounds.add(out.x, out.y);
       }
     }
   } else {
     for (int ix = 0; ix < 7; ix++) {
       double x = r.getX() + r.getWidth() * ix / 6;
       for (int iy = 0; iy < 7; iy++) {
         double y = r.getY() + r.getHeight() * iy / 6;
         in.x = x;
         in.y = y;
         transform(in, out);
         if (ix == 0 && iy == 0) bounds = new Rectangle2D.Double(out.x, out.y, 0, 0);
         else bounds.add(out.x, out.y);
       }
     }
   }
   return bounds;
 }
  public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
    double t = lpphi * lpphi;

    out.y = lpphi * (1. + t * C12);
    out.x = lplam * (1. - Cp * t);
    t = lplam * lplam;
    out.x *= (0.87 - Cl * t * t);
    return out;
  }
Exemplo n.º 3
0
 /** Inverse-project a point (in metres), producing a lat/long result in radians */
 public Point2D.Double inverseTransformRadians(Point2D.Double src, Point2D.Double dst) {
   double x = (src.x - totalFalseEasting) / totalScale;
   double y = (src.y - totalFalseNorthing) / totalScale;
   projectInverse(x, y, dst);
   if (dst.x < -Math.PI) dst.x = -Math.PI;
   else if (dst.x > Math.PI) dst.x = Math.PI;
   if (projectionLongitude != 0) dst.x = MapMath.normalizeLongitude(dst.x + projectionLongitude);
   return dst;
 }
Exemplo n.º 4
0
 /** Project a lat/long point, producing a result in metres */
 public Point2D.Double transformRadians(Point2D.Double src, Point2D.Double dst) {
   double x = src.x;
   if (projectionLongitude != 0) x = MapMath.normalizeLongitude(x - projectionLongitude);
   project(x, src.y, dst);
   dst.x = totalScale * dst.x + totalFalseEasting;
   dst.y = totalScale * dst.y + totalFalseNorthing;
   return dst;
 }
Exemplo n.º 5
0
 /** Inverse-project a number of points (in metres), producing a lat/long result in radians */
 public void inverseTransformRadians(
     double[] srcPoints, int srcOffset, double[] dstPoints, int dstOffset, int numPoints) {
   Point2D.Double in = new Point2D.Double();
   Point2D.Double out = new Point2D.Double();
   for (int i = 0; i < numPoints; i++) {
     in.x = srcPoints[srcOffset++];
     in.y = srcPoints[srcOffset++];
     inverseTransformRadians(in, out);
     dstPoints[dstOffset++] = out.x;
     dstPoints[dstOffset++] = out.y;
   }
 }
  public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
    double rho;

    rho = MapMath.distance(xyx, out.y = rho_0 - xyy);
    if (n < 0.) {
      rho = -rho;
      out.x = -xyx;
      out.y = -xyy;
    }
    out.x = Math.atan2(xyx, xyy) / n;
    switch (type) {
      case PCONIC:
        out.y = Math.atan(c1 - rho / c2) + sig;
        break;
      case MURD2:
        out.y = sig - Math.atan(rho - rho_c);
        break;
      default:
        out.y = rho_c - rho;
    }
    return out;
  }
Exemplo n.º 7
0
 public void vec2FieldMagnitude(Field field, AffineTransform ftoi) {
   AffineTransform itof = null;
   try {
     itof = ftoi.createInverse();
   } catch (NoninvertibleTransformException niv) {
     TDebug.println(0, "NoninvertibleTransformException: " + niv);
   }
   Vector3d v = new Vector3d();
   Point2D.Double p = new Point2D.Double();
   for (int j = 0, k = 0; j < height; ++j)
     for (int i = 0; i < width; ++i, ++k) {
       p.x = i;
       p.y = j;
       itof.transform(p, p);
       v = field.get(p.x, p.y, 0.0);
       f[k] = (float) Math.sqrt(v.x * v.x + v.y * v.y);
     }
 }
  public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
    double rho;

    switch (type) {
      case MURD2:
        rho = rho_c + Math.tan(sig - lpphi);
        break;
      case PCONIC:
        rho = c2 * (c1 - Math.tan(lpphi));
        break;
      default:
        rho = rho_c - lpphi;
        break;
    }
    out.x = rho * Math.sin(lplam *= n);
    out.y = rho_0 - rho * Math.cos(lplam);
    return out;
  }
Exemplo n.º 9
0
 public void vec2FieldZero(Field field, AffineTransform ftoi) {
   AffineTransform itof = null;
   try {
     itof = ftoi.createInverse();
   } catch (NoninvertibleTransformException niv) {
     TDebug.println(0, "NoninvertibleTransformException: " + niv);
   }
   Vector3d v = new Vector3d();
   Point2D.Double p = new Point2D.Double();
   for (int j = 0, k = 0; j < height; ++j)
     for (int i = 0; i < width; ++i, ++k) {
       p.x = i;
       p.y = j;
       itof.transform(p, p);
       v = field.get(p.x, p.y, 0.0);
       if ((v.x == 0.0) && (v.y == 0.0)) f[k] = 1.0f;
       else f[k] = 0.0f;
     }
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   lpphi *= THIRD;
   out.x = XM * lplam * (2. * Math.cos(lpphi + lpphi) - 1.);
   out.y = YM * Math.sin(lpphi);
   return out;
 }
Exemplo n.º 11
0
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    int w = getWidth();
    int h = getHeight();
    double xScale = (w - 2 * PAD) / (xMax - xMin);
    double yScale = (h - 2 * PAD) / (yMax - yMin);
    if (firstTime) System.out.printf("xScale = %.1f  yScale = %.1f%n", xScale, yScale);
    Point2D.Double origin = new Point2D.Double(); // Axes origin.
    Point2D.Double offset = new Point2D.Double(); // Locate data.
    if (xMax < 0) {
      origin.x = w - PAD;
      offset.x = origin.x - xScale * xMax;
    } else if (xMin < 0) {
      origin.x = PAD - xScale * xMin;
      offset.x = origin.x;
    } else {
      origin.x = PAD;
      offset.x = PAD - xScale * xMin;
    }
    if (yMax < 0) {
      origin.y = h - PAD;
      offset.y = origin.y - yScale * yMax;
    } else if (yMin < 0) {
      origin.y = PAD - yScale * yMin;
      offset.y = origin.y;
    } else {
      origin.y = PAD;
      offset.y = PAD - yScale * yMin;
    }
    if (firstTime) {
      System.out.printf("origin = [%6.1f, %6.1f]%n", origin.x, origin.y);
      System.out.printf("offset = [%6.1f, %6.1f]%n", offset.x, offset.y);
    }

    // Draw abcissa.
    g2.draw(new Line2D.Double(PAD, origin.y, w - PAD, origin.y));
    // Draw ordinate.
    g2.draw(new Line2D.Double(origin.x, PAD, origin.x, h - PAD));
    g2.setPaint(Color.red);
    // Mark origin.
    g2.fill(new Ellipse2D.Double(origin.x - 2, origin.y - 2, 4, 4));

    // Plot data.
    g2.setPaint(Color.blue);
    for (int i = 0; i < x.length; i++) {
      double x1 = offset.x + xScale * x[i];
      double y1 = offset.y + yScale * y[i];
      if (firstTime) System.out.printf("i = %d  x1 = %6.1f  y1 = %.1f%n", i, x1, y1);
      g2.fill(new Ellipse2D.Double(x1 - 2, y1 - 2, 4, 4));
      g2.drawString(String.valueOf(i), (float) x1 + 3, (float) y1 - 3);
    }

    // Draw extreme data values.
    g2.setPaint(Color.black);
    Font font = g2.getFont();
    FontRenderContext frc = g2.getFontRenderContext();
    LineMetrics lm = font.getLineMetrics("0", frc);
    String s = String.format("%.1f", xMin);
    float width = (float) font.getStringBounds(s, frc).getWidth();
    double x = offset.x + xScale * xMin;
    g2.drawString(s, (float) x, (float) origin.y + lm.getAscent());
    s = String.format("%.1f", xMax);
    width = (float) font.getStringBounds(s, frc).getWidth();
    x = offset.x + xScale * xMax;
    g2.drawString(s, (float) x - width, (float) origin.y + lm.getAscent());
    s = String.format("%.1f", yMin);
    width = (float) font.getStringBounds(s, frc).getWidth();
    double y = offset.y + yScale * yMin;
    g2.drawString(s, (float) origin.x + 1, (float) y + lm.getAscent());
    s = String.format("%.1f", yMax);
    width = (float) font.getStringBounds(s, frc).getWidth();
    y = offset.y + yScale * yMax;
    g2.drawString(s, (float) origin.x + 1, (float) y);
    if (firstTime) System.out.println("------------------------------");
    firstTime = false;
  }
Exemplo n.º 12
0
  public static List<BezierPath> fromPathData(String str) throws IOException {
    LinkedList<BezierPath> paths = new LinkedList<BezierPath>();

    BezierPath path = null;
    Point2D.Double p = new Point2D.Double();
    Point2D.Double c1 = new Point2D.Double();
    Point2D.Double c2 = new Point2D.Double();
    StreamTokenizer tt = new StreamTokenizer(new StringReader(str));
    tt.resetSyntax();
    tt.parseNumbers();
    tt.whitespaceChars(0, ' ');
    tt.whitespaceChars(',', ',');

    char nextCommand = 'M';
    char command = 'M';
    while (tt.nextToken() != StreamTokenizer.TT_EOF) {
      if (tt.ttype > 0) {
        command = (char) tt.ttype;
      } else {
        command = nextCommand;
        tt.pushBack();
      }

      BezierPath.Node node;
      switch (command) {
          // moveto
        case 'M':
          if (path != null) {
            paths.add(path);
          }
          path = new BezierPath();

          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.moveTo(p.x, p.y);
          nextCommand = 'L';
          break;
        case 'm':
          if (path != null) {
            paths.add(path);
          }
          path = new BezierPath();

          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.moveTo(p.x, p.y);
          nextCommand = 'l';

          // close path
          break;
        case 'Z':
        case 'z':
          p.x = path.get(0).x[0];
          p.y = path.get(0).y[0];
          path.setClosed(true);

          // lineto
          break;
        case 'L':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'L';

          break;
        case 'l':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'l';

          break;
        case 'H':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'H';

          break;
        case 'h':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'h';

          break;
        case 'V':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'V';

          break;
        case 'v':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.lineTo(p.x, p.y);
          nextCommand = 'v';

          // curveto
          break;
        case 'C':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.y = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.y = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.curveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
          nextCommand = 'C';

          break;
        case 'c':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.x = p.x + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.y = p.y + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.x = p.x + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.y = p.y + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.curveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
          nextCommand = 'c';

          break;
        case 'S':
          node = path.get(path.size() - 1);
          c1.x = node.x[0] * 2d - node.x[1];
          c1.y = node.y[0] * 2d - node.y[1];
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.y = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.curveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
          nextCommand = 'S';

          break;
        case 's':
          node = path.get(path.size() - 1);
          c1.x = node.x[0] * 2d - node.x[1];
          c1.y = node.y[0] * 2d - node.y[1];
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.x = p.x + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c2.y = p.y + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.curveTo(c1.x, c1.y, c2.x, c2.y, p.x, p.y);
          nextCommand = 's';

          // quadto
          break;
        case 'Q':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.y = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.quadTo(c1.x, c1.y, p.x, p.y);
          nextCommand = 'Q';

          break;
        case 'q':
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.x = p.x + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          c1.y = p.y + tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.quadTo(c1.x, c1.y, p.x, p.y);
          nextCommand = 'q';

          break;
        case 'T':
          node = path.get(path.size() - 1);
          c1.x = node.x[0] * 2d - node.x[1];
          c1.y = node.y[0] * 2d - node.y[1];
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x = tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y = tt.nval;
          path.quadTo(c1.x, c1.y, p.x, p.y);
          nextCommand = 'T';

          break;
        case 't':
          node = path.get(path.size() - 1);
          c1.x = node.x[0] * 2d - node.x[1];
          c1.y = node.y[0] * 2d - node.y[1];
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.x += tt.nval;
          if (tt.nextToken() != StreamTokenizer.TT_NUMBER) throw new IOException("Number expected");
          p.y += tt.nval;
          path.quadTo(c1.x, c1.y, p.x, p.y);
          nextCommand = 's';

          break;
        default:
          throw new IOException("Illegal command: " + command);
      }
    }
    if (path != null) {
      paths.add(path);
    }
    return paths;
  }
 public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
   out.x = RXF * xyx / (1. + Math.cos(out.y = RYF * xyy));
   return out;
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   out.x = XF * (1. + Math.cos(lpphi)) * lplam;
   out.y = YF * lpphi;
   return out;
 }
 public Point2D.Double project(double lplam, double lpphi, Point2D.Double out) {
   out.x = 0.5 * lplam * (1. + Math.sqrt(Math.cos(lpphi)));
   out.y = lpphi / (Math.cos(0.5 * lpphi) * Math.cos(SIXTH * lplam));
   return out;
 }
Exemplo n.º 16
0
 protected void updatePosition(double x, double y) {
   if (isValidPosition(x, y) == true) {
     _position.x = x;
     _position.y = y;
   }
 }
 public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) {
   out.y = 3. * Math.asin(xyy * RYM);
   out.x = xyx * RXM / (2. * Math.cos((out.y + out.y) * THIRD) - 1);
   return out;
 }
Exemplo n.º 18
0
 @Override
 public void restoreTransformTo(Object geometry) {
   Point2D.Double p = (Point2D.Double) geometry;
   origin.x = p.x;
   origin.y = p.y;
 }
Exemplo n.º 19
0
 /**
  * The method which actually does the inverse projection. This should be overridden for all
  * projections.
  */
 public Point2D.Double projectInverse(double x, double y, Point2D.Double dst) {
   dst.x = x;
   dst.y = y;
   return dst;
 }