From 45967a8a28379fe5fbaa4b284eacc2db0dcf7c1c Mon Sep 17 00:00:00 2001 From: Sascha Brawer Date: Wed, 29 Oct 2003 17:17:51 +0100 Subject: [PATCH] CubicCurve2D.java (contains): Docfix for URL of embedded drawing. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java (contains): Docfix for URL of embedded drawing. * java/awt/geom/QuadCurve2D.java: Likewise. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java: Added documentation. * java/awt/geom/QuadCurve2D.java: Likewise. * java/awt/geom/doc-files/QuadCurve2D-4.png, java/awt/geom/doc-files/QuadCurve2D-5.png, java/awt/geom/doc-files/CubicCurve2D-4.png, java/awt/geom/doc-files/Cubicurve2D-5.png: New illustrations. 2003-10-29 Sascha Brawer * java/awt/geom/CubicCurve2D.java (getFlatnessSq): Implement. (subdivide(CubicCurve2D, CubicCurve2D)): Avoid useless object allocation. (subdivide(double[],int,double[],int,double[],int)): Implement. 2003-10-29 Sascha Brawer * java/awt/geom/doc-files/CubicCurve2D-1.png, java/awt/geom/doc-files/CubicCurve2D-2.png, java/awt/geom/doc-files/CubicCurve2D-3.png: New illustrations. From-SVN: r73048 --- libjava/ChangeLog | 27 + libjava/java/awt/geom/CubicCurve2D.java | 1019 ++++++++++++++++- libjava/java/awt/geom/QuadCurve2D.java | 202 +++- .../awt/geom/doc-files/CubicCurve2D-1.png | Bin 0 -> 6280 bytes .../awt/geom/doc-files/CubicCurve2D-2.png | Bin 0 -> 5791 bytes .../awt/geom/doc-files/CubicCurve2D-3.png | Bin 0 -> 13168 bytes .../awt/geom/doc-files/CubicCurve2D-4.png | Bin 0 -> 7839 bytes .../awt/geom/doc-files/CubicCurve2D-5.png | Bin 0 -> 5112 bytes .../java/awt/geom/doc-files/QuadCurve2D-4.png | Bin 0 -> 7797 bytes .../java/awt/geom/doc-files/QuadCurve2D-5.png | Bin 0 -> 4757 bytes 10 files changed, 1206 insertions(+), 42 deletions(-) create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-1.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-2.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-3.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-4.png create mode 100644 libjava/java/awt/geom/doc-files/CubicCurve2D-5.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-4.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-5.png diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3de9a60786a3..d91fa185c3f2 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,30 @@ +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java (contains): Docfix for URL of embedded drawing. + * java/awt/geom/QuadCurve2D.java: Likewise. + +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java: Added documentation. + * java/awt/geom/QuadCurve2D.java: Likewise. + + * java/awt/geom/doc-files/QuadCurve2D-4.png, + java/awt/geom/doc-files/QuadCurve2D-5.png, + java/awt/geom/doc-files/CubicCurve2D-4.png, + java/awt/geom/doc-files/Cubicurve2D-5.png: New illustrations. + +2003-10-29 Sascha Brawer + + * java/awt/geom/CubicCurve2D.java (getFlatnessSq): Implement. + (subdivide(CubicCurve2D, CubicCurve2D)): Avoid useless object allocation. + (subdivide(double[],int,double[],int,double[],int)): Implement. + +2003-10-29 Sascha Brawer + + * java/awt/geom/doc-files/CubicCurve2D-1.png, + java/awt/geom/doc-files/CubicCurve2D-2.png, + java/awt/geom/doc-files/CubicCurve2D-3.png: New illustrations. + 2003-10-29 Ito Kazumitsu * java/text/DecimalFormat.java diff --git a/libjava/java/awt/geom/CubicCurve2D.java b/libjava/java/awt/geom/CubicCurve2D.java index 2bc0b358b190..1e38d3ada9a1 100644 --- a/libjava/java/awt/geom/CubicCurve2D.java +++ b/libjava/java/awt/geom/CubicCurve2D.java @@ -1,5 +1,5 @@ /* CubicCurve2D.java -- represents a parameterized cubic curve in 2-D space - Copyright (C) 2002 Free Software Foundation + Copyright (C) 2002, 2003 Free Software Foundation This file is part of GNU Classpath. @@ -42,31 +42,168 @@ import java.awt.Rectangle; import java.awt.Shape; import java.util.NoSuchElementException; + /** - * STUBS ONLY - * XXX Implement and document. + * A two-dimensional curve that is parameterized with a cubic + * function. + * + *

A drawing of a CubicCurve2D + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Graydon Hoare (graydon@redhat.com) + * @author Sascha Brawer (brawer@dandelis.ch) + * + * @since 1.2 */ -public abstract class CubicCurve2D implements Shape, Cloneable +public abstract class CubicCurve2D + implements Shape, Cloneable { + /** + * Constructs a new CubicCurve2D. Typical users will want to + * construct instances of a subclass, such as {@link + * CubicCurve2D.Float} or {@link CubicCurve2D.Double}. + */ protected CubicCurve2D() { } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public abstract double getX1(); + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public abstract double getY1(); + + + /** + * Returns the curve’s start point. + */ public abstract Point2D getP1(); + + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public abstract double getCtrlX1(); + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public abstract double getCtrlY1(); + + + /** + * Returns the curve’s first control point. + */ public abstract Point2D getCtrlP1(); + + + /** + * Returns the x coordinate of the curve’s second + * control point. + */ public abstract double getCtrlX2(); + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public abstract double getCtrlY2(); + + + /** + * Returns the curve’s second control point. + */ public abstract Point2D getCtrlP2(); + + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public abstract double getX2(); + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public abstract double getY2(); + + + /** + * Returns the curve’s end point. + */ public abstract Point2D getP2(); + + /** + * Changes the curve geometry, separately specifying each coordinate + * value. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public abstract void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2); + + + /** + * Changes the curve geometry, specifying coordinate values in an + * array. + * + * @param coords an array containing the new coordinate values. The + * x coordinate of the new start point is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * new first control point is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the new second control + * point is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the new end point is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public void setCurve(double[] coords, int offset) { setCurve(coords[offset++], coords[offset++], @@ -74,11 +211,51 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++]); } + + + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. + * + *

A drawing of a CubicCurve2D + * + *

The curve does not keep any reference to the passed point + * objects. Therefore, a later change to p1, + * c1, c2 or p2 will not + * affect the curve geometry. + * + * @param p1 the new start point. + * @param c1 the new first control point. + * @param c2 the new second control point. + * @param p2 the new end point. + */ public void setCurve(Point2D p1, Point2D c1, Point2D c2, Point2D p2) { setCurve(p1.getX(), p1.getY(), c1.getX(), c1.getY(), c2.getX(), c2.getY(), p2.getX(), p2.getY()); } + + + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. + * + *

A drawing of a CubicCurve2D + * + *

The curve does not keep references to the passed point + * objects. Therefore, a later change to the pts array + * or any of its elements will not affect the curve geometry. + * + * @param pts an array containing the points. The new start point + * is located at pts[offset], the new first control + * point at pts[offset + 1], the new second control + * point at pts[offset + 2], and the new end point + * at pts[offset + 3]. + * + * @param offset the offset of the start point in pts. + */ public void setCurve(Point2D[] pts, int offset) { setCurve(pts[offset].getX(), pts[offset++].getY(), @@ -86,24 +263,115 @@ public abstract class CubicCurve2D implements Shape, Cloneable pts[offset].getX(), pts[offset++].getY(), pts[offset].getX(), pts[offset++].getY()); } + + + /** + * Changes the curve geometry to that of another curve. + * + * @param c the curve whose coordinates will be copied. + */ public void setCurve(CubicCurve2D c) { setCurve(c.getX1(), c.getY1(), c.getCtrlX1(), c.getCtrlY1(), c.getCtrlX2(), c.getCtrlY2(), c.getX2(), c.getY2()); } + + + /** + * Calculates the squared flatness of a cubic curve, directly + * specifying each coordinate value. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx1 the x coordinate of the first control point C1. + * @param cy1 the y coordinate of the first control point C1. + * @param cx2 the x coordinate of the second control point C2. + * @param cy2 the y coordinate of the second control point C2. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatnessSq(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { - // XXX Implement. - throw new Error("not implemented"); + return Math.max(Line2D.ptSegDistSq(x1, y1, x2, y2, cx1, cy1), + Line2D.ptSegDistSq(x1, y1, x2, y2, cx2, cy2)); } + + + /** + * Calculates the flatness of a cubic curve, directly specifying + * each coordinate value. The flatness is the maximal distance of a + * control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx1 the x coordinate of the first control point C1. + * @param cy1 the y coordinate of the first control point C1. + * @param cx2 the x coordinate of the second control point C2. + * @param cy2 the y coordinate of the second control point C2. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatness(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { return Math.sqrt(getFlatnessSq(x1, y1, cx1, cy1, cx2, cy2, x2, y2)); } + + + /** + * Calculates the squared flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * first control point C1 is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the second control point C2 + * is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the end point P2 is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatnessSq(double[] coords, int offset) { return getFlatnessSq(coords[offset++], coords[offset++], @@ -111,6 +379,39 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++]); } + + + /** + * Calculates the flatness of a cubic curve, specifying the + * coordinate values in an array. The flatness is the maximal + * distance of a control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * first control point C1 is located at coords[offset + + * 2], its y coordinate at coords[offset + + * 3]. The x coordinate of the second control point C2 + * is located at coords[offset + 4], its y + * coordinate at coords[offset + 5]. The x + * coordinate of the end point P2 is located at coords[offset + * + 6], its y coordinate at coords[offset + + * 7]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatness(double[] coords, int offset) { return Math.sqrt(getFlatnessSq(coords[offset++], coords[offset++], @@ -118,11 +419,43 @@ public abstract class CubicCurve2D implements Shape, Cloneable coords[offset++], coords[offset++], coords[offset++], coords[offset++])); } + + + /** + * Calculates the squared flatness of this curve. The flatness is + * the maximal distance of a control point to the line between start + * and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the square of the distance between C2 and the + * gray line, i.e. the squared length of the red line. + */ public double getFlatnessSq() { return getFlatnessSq(getX1(), getY1(), getCtrlX1(), getCtrlY1(), getCtrlX2(), getCtrlY2(), getX2(), getY2()); } + + + /** + * Calculates the flatness of this curve. The flatness is the + * maximal distance of a control point to the line between start and + * end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. In comparison to C1, + * control point C2 is father away from the gray line. Therefore, + * the result will be the distance between C2 and the gray line, + * i.e. the length of the red line. + */ public double getFlatness() { return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX1(), @@ -130,75 +463,266 @@ public abstract class CubicCurve2D implements Shape, Cloneable getX2(), getY2())); } - public void subdivide(CubicCurve2D l, CubicCurve2D r) + + /** + * Subdivides this curve into two halves. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + * @param left a curve whose geometry will be set to the left half + * of this curve, or null if the caller is not + * interested in the left half. + * + * @param right a curve whose geometry will be set to the right half + * of this curve, or null if the caller is not + * interested in the right half. + */ + public void subdivide(CubicCurve2D left, CubicCurve2D right) { - if (l == null) - l = new CubicCurve2D.Double(); - if (r == null) - r = new CubicCurve2D.Double(); // Use empty slots at end to share single array. double[] d = new double[] { getX1(), getY1(), getCtrlX1(), getCtrlY1(), getCtrlX2(), getCtrlY2(), getX2(), getY2(), 0, 0, 0, 0, 0, 0 }; subdivide(d, 0, d, 0, d, 6); - l.setCurve(d, 0); - r.setCurve(d, 6); + if (left != null) + left.setCurve(d, 0); + if (right != null) + right.setCurve(d, 6); } + + + /** + * Subdivides a cubic curve into two halves. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + * @param src the curve to be subdivided. + * + * @param left a curve whose geometry will be set to the left half + * of src, or null if the caller is not + * interested in the left half. + * + * @param right a curve whose geometry will be set to the right half + * of src, or null if the caller is not + * interested in the right half. + */ public static void subdivide(CubicCurve2D src, - CubicCurve2D l, CubicCurve2D r) + CubicCurve2D left, CubicCurve2D right) { - src.subdivide(l, r); + src.subdivide(left, right); } + + + /** + * Subdivides a cubic curve into two halves, passing all coordinates + * in an array. + * + *

A drawing that illustrates the effects of
+   * subdividing a CubicCurve2D + * + *

The left end point and the right start point will always be + * identical. Memory-concious programmers thus may want to pass the + * same array for both left and right, and + * set rightOff to leftOff + 6. + * + * @param src an array containing the coordinates of the curve to be + * subdivided. The x coordinate of the start point P1 is + * located at src[srcOff], its y at + * src[srcOff + 1]. The x coordinate of the + * first control point C1 is located at src[srcOff + + * 2], its y at src[srcOff + 3]. The + * x coordinate of the second control point C2 is located at + * src[srcOff + 4], its y at src[srcOff + + * 5]. The x coordinate of the end point is located at + * src[srcOff + 6], its y at src[srcOff + + * 7]. + * + * @param srcOff an offset into src, specifying + * the index of the start point’s x coordinate. + * + * @param left an array that will receive the coordinates of the + * left half of src. It is acceptable to pass + * src. A caller who is not interested in the left half + * can pass null. + * + * @param leftOff an offset into left, specifying the + * index where the start point’s x coordinate will be + * stored. + * + * @param right an array that will receive the coordinates of the + * right half of src. It is acceptable to pass + * src or left. A caller who is not + * interested in the right half can pass null. + * + * @param rightOff an offset into right, specifying the + * index where the start point’s x coordinate will be + * stored. + */ public static void subdivide(double[] src, int srcOff, double[] left, int leftOff, double[] right, int rightOff) { - // XXX Implement. - throw new Error("not implemented"); + // To understand this code, please have a look at the image + // "CubicCurve2D-3.png" in the sub-directory "doc-files". + double src_C1_x, src_C1_y, src_C2_x, src_C2_y; + double left_P1_x, left_P1_y; + double left_C1_x, left_C1_y, left_C2_x, left_C2_y; + double right_C1_x, right_C1_y, right_C2_x, right_C2_y; + double right_P2_x, right_P2_y; + double Mid_x, Mid_y; // Mid = left.P2 = right.P1 + + left_P1_x = src[srcOff]; + left_P1_y = src[srcOff + 1]; + src_C1_x = src[srcOff + 2]; + src_C1_y = src[srcOff + 3]; + src_C2_x = src[srcOff + 4]; + src_C2_y = src[srcOff + 5]; + right_P2_x = src[srcOff + 6]; + right_P2_y = src[srcOff + 7]; + + left_C1_x = (left_P1_x + src_C1_x) / 2; + left_C1_y = (left_P1_y + src_C1_y) / 2; + right_C2_x = (right_P2_x + src_C2_x) / 2; + right_C2_y = (right_P2_y + src_C2_y) / 2; + Mid_x = (src_C1_x + src_C2_x) / 2; + Mid_y = (src_C1_y + src_C2_y) / 2; + left_C2_x = (left_C1_x + Mid_x) / 2; + left_C2_y = (left_C1_y + Mid_y) / 2; + right_C1_x = (Mid_x + right_C2_x) / 2; + right_C1_y = (Mid_y + right_C2_y) / 2; + Mid_x = (left_C2_x + right_C1_x) / 2; + Mid_y = (left_C2_y + right_C1_y) / 2; + + if (left != null) + { + left[leftOff] = left_P1_x; + left[leftOff + 1] = left_P1_y; + left[leftOff + 2] = left_C1_x; + left[leftOff + 3] = left_C1_y; + left[leftOff + 4] = left_C2_x; + left[leftOff + 5] = left_C2_y; + left[leftOff + 6] = Mid_x; + left[leftOff + 7] = Mid_y; + } + + if (right != null) + { + right[rightOff] = Mid_x; + right[rightOff + 1] = Mid_y; + right[rightOff + 2] = right_C1_x; + right[rightOff + 3] = right_C1_y; + right[rightOff + 4] = right_C2_x; + right[rightOff + 5] = right_C2_y; + right[rightOff + 6] = right_P2_x; + right[rightOff + 7] = right_P2_y; + } } + + public static int solveCubic(double[] eqn) { return solveCubic(eqn, eqn); } + + public static int solveCubic(double[] eqn, double[] res) { - if (eqn[3] == 0) + double a, b, c, q, r, Q, R; + + double c3 = eqn[3]; + if (c3 == 0) return QuadCurve2D.solveQuadratic(eqn, res); - // XXX Implement. - throw new Error("not implemented"); + + // Divide the equation by the cubic coefficient. + c = eqn[0] / c3; + b = eqn[1] / c3; + a = eqn[2] / c3; + + // We now need to solve x^3 + ax^2 + bx + c = 0. + throw new Error("not implemented"); // FIXME } + + /** + * Determines whether a position lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a CubicCurve2D. + */ public boolean contains(double x, double y) { // XXX Implement. throw new Error("not implemented"); } + + + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a CubicCurve2D. + */ public boolean contains(Point2D p) { return contains(p.getX(), p.getY()); } + + public boolean intersects(double x, double y, double w, double h) { // XXX Implement. throw new Error("not implemented"); } + + public boolean intersects(Rectangle2D r) { return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } + + public boolean contains(double x, double y, double w, double h) { // XXX Implement. throw new Error("not implemented"); } + + public boolean contains(Rectangle2D r) { return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the illustration + * below shows, the invisible control points may cause the bounds to + * be much larger than the area that is actually covered by the + * curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle getBounds() { return getBounds2D().getBounds(); } + + public PathIterator getPathIterator(final AffineTransform at) { return new PathIterator() @@ -276,47 +800,135 @@ public abstract class CubicCurve2D implements Shape, Cloneable } }; } + + public PathIterator getPathIterator(AffineTransform at, double flatness) { return new FlatteningPathIterator(getPathIterator(at), flatness); } + /** - * Create a new curve of the same run-time type with the same contents as - * this one. + * Create a new curve with the same contents as this one. * - * @return the clone + * @return the clone. */ public Object clone() { try - { - return super.clone(); - } + { + return super.clone(); + } catch (CloneNotSupportedException e) - { - throw (Error) new InternalError().initCause(e); // Impossible - } + { + throw (Error) new InternalError().initCause(e); // Impossible + } } + /** - * STUBS ONLY + * A two-dimensional curve that is parameterized with a cubic + * function and stores coordinate values in double-precision + * floating-point format. + * + * @see CubicCurve2D.Float + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Double extends CubicCurve2D + public static class Double + extends CubicCurve2D { + /** + * The x coordinate of the curve’s start point. + */ public double x1; + + + /** + * The y coordinate of the curve’s start point. + */ public double y1; + + + /** + * The x coordinate of the curve’s first control point. + */ public double ctrlx1; + + + /** + * The y coordinate of the curve’s first control point. + */ public double ctrly1; + + + /** + * The x coordinate of the curve’s second control point. + */ public double ctrlx2; + + + /** + * The y coordinate of the curve’s second control point. + */ public double ctrly2; + + + /** + * The x coordinate of the curve’s end point. + */ public double x2; + + + /** + * The y coordinate of the curve’s end point. + */ public double y2; + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format. All points are + * initially at position (0, 0). + */ public Double() { } + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in double-precision floating-point format, specifying the + * initial position of each point. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s start + * point. + * + * @param y1 the y coordinate of the curve’s start + * point. + * + * @param cx1 the x coordinate of the curve’s first + * control point. + * + * @param cy1 the y coordinate of the curve’s first + * control point. + * + * @param cx2 the x coordinate of the curve’s second + * control point. + * + * @param cy2 the y coordinate of the curve’s second + * control point. + * + * @param x2 the x coordinate of the curve’s end + * point. + * + * @param y2 the y coordinate of the curve’s end + * point. + */ public Double(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -330,58 +942,154 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public double getY1() { return y1; } + + + /** + * Returns the curve’s start point. + */ public Point2D getP1() { return new Point2D.Double(x1, y1); } + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public double getCtrlX1() { return ctrlx1; } + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public double getCtrlY1() { return ctrly1; } + + + /** + * Returns the curve’s first control point. + */ public Point2D getCtrlP1() { return new Point2D.Double(ctrlx1, ctrly1); } + + /** + * Returns the x coordinate of the curve’s second + * control point. + */ public double getCtrlX2() { return ctrlx2; } + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public double getCtrlY2() { return ctrly2; } + + + /** + * Returns the curve’s second control point. + */ public Point2D getCtrlP2() { return new Point2D.Double(ctrlx2, ctrly2); } + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public double getY2() { return y2; } + + + /** + * Returns the curve’s end point. + */ public Point2D getP2() { return new Point2D.Double(x2, y2); } + + /** + * Changes the curve geometry, separately specifying each coordinate + * value. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -394,6 +1102,18 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the + * illustration below shows, the invisible control points may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle2D getBounds2D() { double nx1 = Math.min(Math.min(x1, ctrlx1), Math.min(ctrlx2, x2)); @@ -402,26 +1122,112 @@ public abstract class CubicCurve2D implements Shape, Cloneable double ny2 = Math.max(Math.max(y1, ctrly1), Math.max(ctrly2, y2)); return new Rectangle2D.Double(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Double + } + /** - * STUBS ONLY + * A two-dimensional curve that is parameterized with a cubic + * function and stores coordinate values in single-precision + * floating-point format. + * + * @see CubicCurve2D.Float + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Float extends CubicCurve2D + public static class Float + extends CubicCurve2D { + /** + * The x coordinate of the curve’s start point. + */ public float x1; + + + /** + * The y coordinate of the curve’s start point. + */ public float y1; + + + /** + * The x coordinate of the curve’s first control point. + */ public float ctrlx1; + + + /** + * The y coordinate of the curve’s first control point. + */ public float ctrly1; + + + /** + * The x coordinate of the curve’s second control point. + */ public float ctrlx2; + + + /** + * The y coordinate of the curve’s second control point. + */ public float ctrly2; + + + /** + * The x coordinate of the curve’s end point. + */ public float x2; + + + /** + * The y coordinate of the curve’s end point. + */ public float y2; + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format. All points are + * initially at position (0, 0). + */ public Float() { } + + /** + * Constructs a new CubicCurve2D that stores its coordinate values + * in single-precision floating-point format, specifying the + * initial position of each point. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s start + * point. + * + * @param y1 the y coordinate of the curve’s start + * point. + * + * @param cx1 the x coordinate of the curve’s first + * control point. + * + * @param cy1 the y coordinate of the curve’s first + * control point. + * + * @param cx2 the x coordinate of the curve’s second + * control point. + * + * @param cy2 the y coordinate of the curve’s second + * control point. + * + * @param x2 the x coordinate of the curve’s end + * point. + * + * @param y2 the y coordinate of the curve’s end + * point. + */ public Float(float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2) { @@ -435,58 +1241,154 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the x coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the y coordinate of the curve’s start + * point. + */ public double getY1() { return y1; } + + + /** + * Returns the curve’s start point. + */ public Point2D getP1() { return new Point2D.Float(x1, y1); } + + /** + * Returns the x coordinate of the curve’s first + * control point. + */ public double getCtrlX1() { return ctrlx1; } + + + /** + * Returns the y coordinate of the curve’s first + * control point. + */ public double getCtrlY1() { return ctrly1; } + + + /** + * Returns the curve’s first control point. + */ public Point2D getCtrlP1() { return new Point2D.Float(ctrlx1, ctrly1); } + + /** + * Returns the s coordinate of the curve’s second + * control point. + */ public double getCtrlX2() { return ctrlx2; } + + + /** + * Returns the y coordinate of the curve’s second + * control point. + */ public double getCtrlY2() { return ctrly2; } + + + /** + * Returns the curve’s second control point. + */ public Point2D getCtrlP2() { return new Point2D.Float(ctrlx2, ctrly2); } + + /** + * Returns the x coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the y coordinate of the curve’s end + * point. + */ public double getY2() { return y2; } + + + /** + * Returns the curve’s end point. + */ public Point2D getP2() { return new Point2D.Float(x2, y2); } + + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a double-precision floating-point number. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(double x1, double y1, double cx1, double cy1, double cx2, double cy2, double x2, double y2) { @@ -499,6 +1401,39 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = (float) x2; this.y2 = (float) y2; } + + + /** + * Changes the curve geometry, separately specifying each coordinate + * value as a single-precision floating-point number. + * + *

A drawing of a CubicCurve2D + * + * @param x1 the x coordinate of the curve’s new start + * point. + * + * @param y1 the y coordinate of the curve’s new start + * point. + * + * @param cx1 the x coordinate of the curve’s new + * first control point. + * + * @param cy1 the y coordinate of the curve’s new + * first control point. + * + * @param cx2 the x coordinate of the curve’s new + * second control point. + * + * @param cy2 the y coordinate of the curve’s new + * second control point. + * + * @param x2 the x coordinate of the curve’s new end + * point. + * + * @param y2 the y coordinate of the curve’s new end + * point. + */ public void setCurve(float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2) { @@ -511,6 +1446,18 @@ public abstract class CubicCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control points. As the + * illustration below shows, the invisible control points may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + *

An illustration of the bounds of a CubicCurve2D + */ public Rectangle2D getBounds2D() { float nx1 = (float) Math.min(Math.min(x1, ctrlx1), Math.min(ctrlx2, x2)); @@ -519,5 +1466,5 @@ public abstract class CubicCurve2D implements Shape, Cloneable float ny2 = (float) Math.max(Math.max(y1, ctrly1), Math.max(ctrly2, y2)); return new Rectangle2D.Float(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Float -} // class CubicCurve2D + } +} diff --git a/libjava/java/awt/geom/QuadCurve2D.java b/libjava/java/awt/geom/QuadCurve2D.java index e737ec1a4706..5bc63e6c6cfd 100644 --- a/libjava/java/awt/geom/QuadCurve2D.java +++ b/libjava/java/awt/geom/QuadCurve2D.java @@ -51,6 +51,7 @@ import java.util.NoSuchElementException; * alt="A drawing of a QuadCurve2D" /> * * @author Eric Blake (ebb9@email.byu.edu) + * @author Graydon Hoare (graydon@redhat.com) * @author Sascha Brawer (brawer@dandelis.ch) * * @since 1.2 @@ -129,7 +130,8 @@ public abstract class QuadCurve2D /** - * Changes the geometry of the curve. + * Changes the curve geometry, separately specifying each coordinate + * value. * * @param x1 the x coordinate of the curve’s new start * point. @@ -153,6 +155,23 @@ public abstract class QuadCurve2D double x2, double y2); + /** + * Changes the curve geometry, passing coordinate values in an + * array. + * + * @param coords an array containing the new coordinate values. The + * x coordinate of the new start point is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * new control point is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the new end point is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public void setCurve(double[] coords, int offset) { setCurve(coords[offset++], coords[offset++], @@ -161,6 +180,22 @@ public abstract class QuadCurve2D } + /** + * Changes the curve geometry, specifying coordinate values in + * separate Point objects. + * + *

A drawing of a QuadCurve2D + * + *

The curve does not keep any reference to the passed point + * objects. Therefore, a later change to p1, + * c p2 will not affect the curve + * geometry. + * + * @param p1 the new start point. + * @param c the new control point. + * @param p2 the new end point. + */ public void setCurve(Point2D p1, Point2D c, Point2D p2) { setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(), @@ -168,11 +203,29 @@ public abstract class QuadCurve2D } + /** + * Changes the curve geometry, specifying coordinate values in an + * array of Point objects. + * + *

A drawing of a QuadCurve2D + * + *

The curve does not keep references to the passed point + * objects. Therefore, a later change to the pts array + * or any of its elements will not affect the curve geometry. + * + * @param pts an array containing the points. The new start point + * is located at pts[offset], the new control + * point at pts[offset + 1], and the new end point + * at pts[offset + 2]. + * + * @param offset the offset of the start point in pts. + */ public void setCurve(Point2D[] pts, int offset) { - setCurve(pts[offset].getX(), pts[offset++].getY(), - pts[offset].getX(), pts[offset++].getY(), - pts[offset].getX(), pts[offset++].getY()); + setCurve(pts[offset].getX(), pts[offset].getY(), + pts[offset + 1].getX(), pts[offset + 1].getY(), + pts[offset + 2].getX(), pts[offset + 2].getY()); } @@ -188,6 +241,26 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of a quadratic curve, directly + * specifying each coordinate value. The flatness is the distance of + * the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. + * the squared length of the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx the x coordinate of the control point C. + * @param cy the y coordinate of the control point C. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatnessSq(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -195,6 +268,26 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of a quadratic curve, directly specifying + * each coordinate value. The flatness is the distance of the + * control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the distance between C and the gray line, i.e. the length of + * the red line. + * + * @param x1 the x coordinate of the start point P1. + * @param y1 the y coordinate of the start point P1. + * @param cx the x coordinate of the control point C. + * @param cy the y coordinate of the control point C. + * @param x2 the x coordinate of the end point P2. + * @param y2 the y coordinate of the end point P2. + */ public static double getFlatness(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -202,6 +295,32 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of a quadratic curve, specifying + * the coordinate values in an array. The flatness is the distance + * of the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. + * the squared length of the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * control point C is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the end point P2 is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatnessSq(double[] coords, int offset) { return Line2D.ptSegDistSq(coords[offset], coords[offset + 1], @@ -210,6 +329,32 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of a quadratic curve, specifying the + * coordinate values in an array. The flatness is the distance of + * the control point to the line between start and end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the the distance between C and the gray line, i.e. the length of + * the red line. + * + * @param coords an array containing the coordinate values. The + * x coordinate of the start point P1 is located at + * coords[offset], its y coordinate at + * coords[offset + 1]. The x coordinate of the + * control point C is located at coords[offset + 2], + * its y coordinate at coords[offset + 3]. The + * x coordinate of the end point P2 is located at + * coords[offset + 4], its y coordinate at + * coords[offset + 5]. + * + * @param offset the offset of the first coordinate value in + * coords. + */ public static double getFlatness(double[] coords, int offset) { return Line2D.ptSegDist(coords[offset], coords[offset + 1], @@ -218,6 +363,19 @@ public abstract class QuadCurve2D } + /** + * Calculates the squared flatness of this curve. The flatness is + * the distance of the control point to the line between start and + * end point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the square of the distance between C and the gray line, i.e. the + * squared length of the red line. + */ public double getFlatnessSq() { return Line2D.ptSegDistSq(getX1(), getY1(), @@ -226,6 +384,19 @@ public abstract class QuadCurve2D } + /** + * Calculates the flatness of this curve. The flatness is the + * distance of the control point to the line between start and end + * point. + * + *

A drawing that illustrates the flatness + * + *

In the above drawing, the straight line connecting start point + * P1 and end point P2 is depicted in gray. The result will be the + * the distance between C and the gray line, i.e. the length of the + * red line. + */ public double getFlatness() { return Line2D.ptSegDist(getX1(), getY1(), @@ -417,6 +588,16 @@ public abstract class QuadCurve2D } + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a QuadCurve2D. + */ public boolean contains(double x, double y) { // XXX Implement. @@ -424,6 +605,16 @@ public abstract class QuadCurve2D } + /** + * Determines whether a point lies inside the area that is bounded + * by the curve and the straight line connecting its end points. + * + *

A drawing of the area spanned by the curve + * + *

The above drawing illustrates in which area points are + * considered “contained” in a QuadCurve2D. + */ public boolean contains(Point2D p) { return contains(p.getX(), p.getY()); @@ -563,8 +754,7 @@ public abstract class QuadCurve2D /** - * Creates a new curve with the same contents as - * this one. + * Creates a new curve with the same contents as this one. * * @return the clone. */ diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1784509be61ad1db86eeb147e09f7ff45bafadd6 GIT binary patch literal 6280 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 B9~l4u literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-2.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddae9fc84f2e566ae6a8a1b1cc7fc8bfc21d688 GIT binary patch literal 5791 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 literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b200dad37a8e5608ed5914361cee047abef8ad56 GIT binary patch literal 13168 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 literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png new file mode 100644 index 0000000000000000000000000000000000000000..e57ffdc5cf0e8d0504ad40efa236c1a5a465a2c4 GIT binary patch literal 7839 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 literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png b/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png new file mode 100644 index 0000000000000000000000000000000000000000..701ab138f0b10c5d6bc22b96233e1ed06f84811d GIT binary patch literal 5112 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 literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-4.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-4.png new file mode 100644 index 0000000000000000000000000000000000000000..835c0643b29df677a50c9277cbc01b23877bfb79 GIT binary patch literal 7797 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 literal 0 Hc-jL100001 diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png new file mode 100644 index 0000000000000000000000000000000000000000..72110cd5a624d72d3a99692620316eba45c10f00 GIT binary patch literal 4757 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 Dg2UO6 literal 0 Hc-jL100001 -- 2.47.3