From 12be91a78c9f6caadd4024d3af5bc468f9a32130 Mon Sep 17 00:00:00 2001 From: Sascha Brawer <brawer@dandelis.ch> Date: Wed, 22 Oct 2003 10:54:19 +0200 Subject: [PATCH] QuadCurve2D.java (subdivide): Added documentation. 2003-10-22 Sascha Brawer <brawer@dandelis.ch> * java/awt/geom/QuadCurve2D.java (subdivide): Added documentation. java/awt/geom/doc-files/QuadCurve2D-3.png: New illustration. 2003-10-22 Sascha Brawer <brawer@dandelis.ch> * java/awt/geom/QuadCurve2D.java: Reformatted, wrote Javadoc. * java/awt/geom/doc-files: New directory. * java/awt/geom/doc-files/QuadCurve2D-1.png, java/awt/geom/doc-files/QuadCurve2D-2.png: New illustrations. 2003-10-22 Sascha Brawer <brawer@dandelis.ch> * java/awt/geom/QuadCurve2D.java (subdivide): Implement. 2003-10-22 Sascha Brawer <brawer@dandelis.ch> * java/awt/geom/QuadCurve2D.java (getFlatness, getFlatnessSq): Implement. From-SVN: r72791 --- libjava/ChangeLog | 20 + libjava/java/awt/geom/QuadCurve2D.java | 779 +++++++++++++++--- .../java/awt/geom/doc-files/QuadCurve2D-1.png | Bin 0 -> 6363 bytes .../java/awt/geom/doc-files/QuadCurve2D-2.png | Bin 0 -> 5872 bytes .../java/awt/geom/doc-files/QuadCurve2D-3.png | Bin 0 -> 12334 bytes 5 files changed, 706 insertions(+), 93 deletions(-) create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-1.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-2.png create mode 100644 libjava/java/awt/geom/doc-files/QuadCurve2D-3.png diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 7f53a3625640..1d3e7bbb0148 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,23 @@ +2003-10-22 Sascha Brawer <brawer@dandelis.ch> + + * java/awt/geom/QuadCurve2D.java (subdivide): Added documentation. + java/awt/geom/doc-files/QuadCurve2D-3.png: New illustration. + +2003-10-22 Sascha Brawer <brawer@dandelis.ch> + + * java/awt/geom/QuadCurve2D.java: Reformatted, wrote Javadoc. + * java/awt/geom/doc-files: New directory. + * java/awt/geom/doc-files/QuadCurve2D-1.png, + java/awt/geom/doc-files/QuadCurve2D-2.png: New illustrations. + +2003-10-22 Sascha Brawer <brawer@dandelis.ch> + + * java/awt/geom/QuadCurve2D.java (subdivide): Implement. + +2003-10-22 Sascha Brawer <brawer@dandelis.ch> + + * java/awt/geom/QuadCurve2D.java (getFlatness, getFlatnessSq): Implement. + 2003-10-22 Michael Koch <konqueror@gmx.de> * java/io/File.java diff --git a/libjava/java/awt/geom/QuadCurve2D.java b/libjava/java/awt/geom/QuadCurve2D.java index 6aed05907562..e737ec1a4706 100644 --- a/libjava/java/awt/geom/QuadCurve2D.java +++ b/libjava/java/awt/geom/QuadCurve2D.java @@ -1,5 +1,5 @@ /* QuadCurve2D.java -- represents a parameterized quadratic 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,124 +42,361 @@ 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 quadratic + * function. + * + * <p><img src="doc-files/QuadCurve2D-1.png" width="350" height="180" + * alt="A drawing of a QuadCurve2D" /> + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) + * + * @since 1.2 */ -public abstract class QuadCurve2D implements Shape, Cloneable +public abstract class QuadCurve2D + implements Shape, Cloneable { + /** + * Constructs a new QuadCurve2D. Typical users will want to + * construct instances of a subclass, such as {@link + * QuadCurve2D.Float} or {@link QuadCurve2D.Double}. + */ protected QuadCurve2D() { } + + /** + * Returns the <i>x</i> coordinate of the curve’s start + * point. + */ public abstract double getX1(); + + + /** + * Returns the <i>y</i> coordinate of the curve’s start + * point. + */ public abstract double getY1(); + + + /** + * Returns the curve’s start point. + */ public abstract Point2D getP1(); + + + /** + * Returns the <i>x</i> coordinate of the curve’s control + * point. + */ public abstract double getCtrlX(); + + + /** + * Returns the <i>y</i> coordinate of the curve’s control + * point. + */ public abstract double getCtrlY(); + + + /** + * Returns the curve’s control point. + */ public abstract Point2D getCtrlPt(); + + + /** + * Returns the <i>x</i> coordinate of the curve’s end + * point. + */ public abstract double getX2(); + + + /** + * Returns the <i>y</i> coordinate of the curve’s end + * point. + */ public abstract double getY2(); + + + /** + * Returns the curve’s end point. + */ public abstract Point2D getP2(); + + /** + * Changes the geometry of the curve. + * + * @param x1 the <i>x</i> coordinate of the curve’s new start + * point. + * + * @param y1 the <i>y</i> coordinate of the curve’s new start + * point. + * + * @param cx the <i>x</i> coordinate of the curve’s new + * control point. + * + * @param cy the <i>y</i> coordinate of the curve’s new + * control point. + * + * @param x2 the <i>x</i> coordinate of the curve’s new end + * point. + * + * @param y2 the <i>y</i> coordinate of the curve’s new end + * point. + */ public abstract void setCurve(double x1, double y1, double cx, double cy, double x2, double y2); + + public void setCurve(double[] coords, int offset) { setCurve(coords[offset++], coords[offset++], coords[offset++], coords[offset++], coords[offset++], coords[offset++]); } + + public void setCurve(Point2D p1, Point2D c, Point2D p2) { setCurve(p1.getX(), p1.getY(), c.getX(), c.getY(), p2.getX(), p2.getY()); } + + 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()); } + + + /** + * Changes the geometry of the curve to that of another curve. + * + * @param c the curve whose coordinates will be copied. + */ public void setCurve(QuadCurve2D c) { setCurve(c.getX1(), c.getY1(), c.getCtrlX(), c.getCtrlY(), c.getX2(), c.getY2()); } + + public static double getFlatnessSq(double x1, double y1, double cx, double cy, double x2, double y2) { - // XXX Implement. - throw new Error("not implemented"); + return Line2D.ptSegDistSq(x1, y1, x2, y2, cx, cy); } + + public static double getFlatness(double x1, double y1, double cx, double cy, double x2, double y2) { - return Math.sqrt(getFlatnessSq(x1, y1, cx, cy, x2, y2)); + return Line2D.ptSegDist(x1, y1, x2, y2, cx, cy); } + + public static double getFlatnessSq(double[] coords, int offset) { - return getFlatnessSq(coords[offset++], coords[offset++], - coords[offset++], coords[offset++], - coords[offset++], coords[offset++]); + return Line2D.ptSegDistSq(coords[offset], coords[offset + 1], + coords[offset + 4], coords[offset + 5], + coords[offset + 2], coords[offset + 3]); } + + public static double getFlatness(double[] coords, int offset) { - return Math.sqrt(getFlatnessSq(coords[offset++], coords[offset++], - coords[offset++], coords[offset++], - coords[offset++], coords[offset++])); + return Line2D.ptSegDist(coords[offset], coords[offset + 1], + coords[offset + 4], coords[offset + 5], + coords[offset + 2], coords[offset + 3]); } + + public double getFlatnessSq() { - return getFlatnessSq(getX1(), getY1(), getCtrlX(), getCtrlY(), - getX2(), getY2()); + return Line2D.ptSegDistSq(getX1(), getY1(), + getX2(), getY2(), + getCtrlX(), getCtrlY()); } + + public double getFlatness() { - return Math.sqrt(getFlatnessSq(getX1(), getY1(), getCtrlX(), getCtrlY(), - getX2(), getY2())); + return Line2D.ptSegDist(getX1(), getY1(), + getX2(), getY2(), + getCtrlX(), getCtrlY()); } - public void subdivide(QuadCurve2D l, QuadCurve2D r) + + /** + * Subdivides this curve into two halves. + * + * <p><img src="doc-files/QuadCurve2D-3.png" width="700" + * height="180" alt="A drawing that illustrates the effects of + * subdividing a QuadCurve2D" /> + * + * @param left a curve whose geometry will be set to the left half + * of this curve, or <code>null</code> 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 <code>null</code> if the caller is not + * interested in the right half. + */ + public void subdivide(QuadCurve2D left, QuadCurve2D right) { - if (l == null) - l = new QuadCurve2D.Double(); - if (r == null) - r = new QuadCurve2D.Double(); // Use empty slots at end to share single array. double[] d = new double[] { getX1(), getY1(), getCtrlX(), getCtrlY(), getX2(), getY2(), 0, 0, 0, 0 }; subdivide(d, 0, d, 0, d, 4); - l.setCurve(d, 0); - r.setCurve(d, 4); + if (left != null) + left.setCurve(d, 0); + if (right != null) + right.setCurve(d, 4); } - public static void subdivide(QuadCurve2D src, QuadCurve2D l, QuadCurve2D r) + + + /** + * Subdivides a quadratic curve into two halves. + * + * <p><img src="doc-files/QuadCurve2D-3.png" width="700" + * height="180" alt="A drawing that illustrates the effects of + * subdividing a QuadCurve2D" /> + * + * @param src the curve to be subdivided. + * + * @param left a curve whose geometry will be set to the left half + * of <code>src</code>, or <code>null</code> if the caller is not + * interested in the left half. + * + * @param right a curve whose geometry will be set to the right half + * of <code>src</code>, or <code>null</code> if the caller is not + * interested in the right half. + */ + public static void subdivide(QuadCurve2D src, QuadCurve2D left, + QuadCurve2D right) { - src.subdivide(l, r); + src.subdivide(left, right); } + + + /** + * Subdivides a quadratic curve into two halves, passing all + * coordinates in an array. + * + * <p><img src="doc-files/QuadCurve2D-3.png" width="700" + * height="180" alt="A drawing that illustrates the effects of + * subdividing a QuadCurve2D" /> + * + * <p>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 <code>left</code> and <code>right</code>, and + * set <code>rightOff</code> to <code>leftOff + 4</code>. + * + * @param src an array containing the coordinates of the curve to be + * subdivided. The <i>x</i> coordinate of the start point is + * located at <code>src[srcOff]</code>, its <i>y</i> at + * <code>src[srcOff + 1]</code>. The <i>x</i> coordinate of the + * control point is located at <code>src[srcOff + 2]</code>, its + * <i>y</i> at <code>src[srcOff + 3]</code>. The <i>x</i> + * coordinate of the end point is located at <code>src[srcOff + + * 4]</code>, its <i>y</i> at <code>src[srcOff + 5]</code>. + * + * @param srcOff an offset into <code>src</code>, specifying + * the index of the start point’s <i>x</i> coordinate. + * + * @param left an array that will receive the coordinates of the + * left half of <code>src</code>. It is acceptable to pass + * <code>src</code>. A caller who is not interested in the left half + * can pass <code>null</code>. + * + * @param leftOff an offset into <code>left</code>, specifying the + * index where the start point’s <i>x</i> coordinate will be + * stored. + * + * @param right an array that will receive the coordinates of the + * right half of <code>src</code>. It is acceptable to pass + * <code>src</code> or <code>left</code>. A caller who is not + * interested in the right half can pass <code>null</code>. + * + * @param rightOff an offset into <code>right</code>, specifying the + * index where the start point’s <i>x</i> 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"); + double x1, y1, xc, yc, x2, y2; + + x1 = src[srcOff]; + y1 = src[srcOff + 1]; + xc = src[srcOff + 2]; + yc = src[srcOff + 3]; + x2 = src[srcOff + 4]; + y2 = src[srcOff + 5]; + + if (left != null) + { + left[leftOff] = x1; + left[leftOff + 1] = y1; + } + + if (right != null) + { + right[rightOff + 4] = x2; + right[rightOff + 5] = y2; + } + + x1 = (x1 + xc) / 2; + x2 = (xc + x2) / 2; + xc = (x1 + x2) / 2; + y1 = (y1 + yc) / 2; + y2 = (y2 + yc) / 2; + yc = (y1 + y2) / 2; + + if (left != null) + { + left[leftOff + 2] = x1; + left[leftOff + 3] = y1; + left[leftOff + 4] = xc; + left[leftOff + 5] = yc; + } + + if (right != null) + { + right[rightOff] = xc; + right[rightOff + 1] = yc; + right[rightOff + 2] = x2; + right[rightOff + 3] = y2; + } } + + public static int solveQuadratic(double[] eqn) { return solveQuadratic(eqn, eqn); } + + public static int solveQuadratic(double[] eqn, double[] res) { double c = eqn[0]; double b = eqn[1]; double a = eqn[2]; if (a == 0) - { - if (b == 0) - return -1; - res[0] = -c / b; - return 1; - } + { + if (b == 0) + return -1; + res[0] = -c / b; + return 1; + } c /= a; b /= a * 2; double det = Math.sqrt(b * b - c); @@ -167,49 +404,74 @@ public abstract class QuadCurve2D implements Shape, Cloneable return 0; // For fewer rounding errors, we calculate the two roots differently. if (b > 0) - { - res[0] = -b - det; - res[1] = -c / (b + det); - } + { + res[0] = -b - det; + res[1] = -c / (b + det); + } else - { - res[0] = -c / (b - det); - res[1] = -b + det; - } + { + res[0] = -c / (b - det); + res[1] = -b + det; + } return 2; } + public boolean contains(double x, double y) { // XXX Implement. throw new Error("not implemented"); } + + 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 point. As the illustration + * below shows, the invisible control point may cause the bounds to + * be much larger than the area that is actually covered by the + * curve. + * + * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180" + * alt="An illustration of the bounds of a QuadCurve2D" /> + */ public Rectangle getBounds() { return getBounds2D().getBounds(); } + + public PathIterator getPathIterator(final AffineTransform at) { return new PathIterator() @@ -217,115 +479,190 @@ public abstract class QuadCurve2D implements Shape, Cloneable /** Current coordinate. */ private int current = 0; + public int getWindingRule() { return WIND_NON_ZERO; } + public boolean isDone() { return current >= 2; } + public void next() { current++; } + public int currentSegment(float[] coords) { int result; switch (current) - { - case 0: - coords[0] = (float) getX1(); - coords[1] = (float) getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = (float) getCtrlX(); - coords[1] = (float) getCtrlY(); - coords[2] = (float) getX2(); - coords[3] = (float) getY2(); - result = SEG_QUADTO; - break; - default: - throw new NoSuchElementException("quad iterator out of bounds"); - } + { + case 0: + coords[0] = (float) getX1(); + coords[1] = (float) getY1(); + result = SEG_MOVETO; + break; + + case 1: + coords[0] = (float) getCtrlX(); + coords[1] = (float) getCtrlY(); + coords[2] = (float) getX2(); + coords[3] = (float) getY2(); + result = SEG_QUADTO; + break; + + default: + throw new NoSuchElementException("quad iterator out of bounds"); + } if (at != null) at.transform(coords, 0, coords, 0, 2); return result; } + public int currentSegment(double[] coords) { int result; switch (current) - { - case 0: - coords[0] = getX1(); - coords[1] = getY1(); - result = SEG_MOVETO; - break; - case 1: - coords[0] = getCtrlX(); - coords[1] = getCtrlY(); - coords[2] = getX2(); - coords[3] = getY2(); - result = SEG_QUADTO; - break; - default: - throw new NoSuchElementException("quad iterator out of bounds"); - } + { + case 0: + coords[0] = getX1(); + coords[1] = getY1(); + result = SEG_MOVETO; + break; + + case 1: + coords[0] = getCtrlX(); + coords[1] = getCtrlY(); + coords[2] = getX2(); + coords[3] = getY2(); + result = SEG_QUADTO; + break; + + default: + throw new NoSuchElementException("quad iterator out of bounds"); + } if (at != null) at.transform(coords, 0, coords, 0, 2); return result; } }; } + + 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 + * Creates a new curve with the same contents as * this one. * - * @return the clone - * - * @exception OutOfMemoryError If there is not enough memory available. - * - * @since 1.2 + * @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 quadratic + * function and stores coordinate values in double-precision + * floating-point format. + * + * @see QuadCurve2D.Float + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Double extends QuadCurve2D + public static class Double + extends QuadCurve2D { + /** + * The <i>x</i> coordinate of the curve’s start point. + */ public double x1; + + + /** + * The <i>y</i> coordinate of the curve’s start point. + */ public double y1; + + + /** + * The <i>x</i> coordinate of the curve’s control point. + */ public double ctrlx; + + + /** + * The <i>y</i> coordinate of the curve’s control point. + */ public double ctrly; + + + /** + * The <i>x</i> coordinate of the curve’s end point. + */ public double x2; + + + /** + * The <i>y</i> coordinate of the curve’s end point. + */ public double y2; + + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in double-precision floating-point format. All points are + * initially at position (0, 0). + */ public Double() { } + + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in double-precision floating-point format, specifying the + * initial position of each point. + * + * @param x1 the <i>x</i> coordinate of the curve’s start + * point. + * + * @param y1 the <i>y</i> coordinate of the curve’s start + * point. + * + * @param cx the <i>x</i> coordinate of the curve’s control + * point. + * + * @param cy the <i>y</i> coordinate of the curve’s control + * point. + * + * @param x2 the <i>x</i> coordinate of the curve’s end + * point. + * + * @param y2 the <i>y</i> coordinate of the curve’s end + * point. + */ public Double(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -337,45 +674,115 @@ public abstract class QuadCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the <i>x</i> coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the <i>y</i> 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 <i>x</i> coordinate of the curve’s control + * point. + */ public double getCtrlX() { return ctrlx; } + + + /** + * Returns the <i>y</i> coordinate of the curve’s control + * point. + */ public double getCtrlY() { return ctrly; } + + + /** + * Returns the curve’s control point. + */ public Point2D getCtrlPt() { return new Point2D.Double(ctrlx, ctrly); } + + /** + * Returns the <i>x</i> coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the <i>y</i> 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 geometry of the curve. + * + * @param x1 the <i>x</i> coordinate of the curve’s new + * start point. + * + * @param y1 the <i>y</i> coordinate of the curve’s new + * start point. + * + * @param cx the <i>x</i> coordinate of the curve’s new + * control point. + * + * @param cy the <i>y</i> coordinate of the curve’s new + * control point. + * + * @param x2 the <i>x</i> coordinate of the curve’s new + * end point. + * + * @param y2 the <i>y</i> coordinate of the curve’s new + * end point. + */ public void setCurve(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -386,6 +793,18 @@ public abstract class QuadCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control point. As the + * illustration below shows, the invisible control point may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180" + * alt="An illustration of the bounds of a QuadCurve2D" /> + */ public Rectangle2D getBounds2D() { double nx1 = Math.min(Math.min(x1, ctrlx), x2); @@ -394,24 +813,91 @@ public abstract class QuadCurve2D implements Shape, Cloneable double ny2 = Math.max(Math.max(y1, ctrly), y2); return new Rectangle2D.Double(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Double + } + /** - * STUBS ONLY + * A two-dimensional curve that is parameterized with a quadratic + * function and stores coordinate values in single-precision + * floating-point format. + * + * @see QuadCurve2D.Double + * + * @author Eric Blake (ebb9@email.byu.edu) + * @author Sascha Brawer (brawer@dandelis.ch) */ - public static class Float extends QuadCurve2D + public static class Float + extends QuadCurve2D { + /** + * The <i>x</i> coordinate of the curve’s start point. + */ public float x1; + + + /** + * The <i>y</i> coordinate of the curve’s start point. + */ public float y1; + + + /** + * The <i>x</i> coordinate of the curve’s control point. + */ public float ctrlx; + + + /** + * The <i>y</i> coordinate of the curve’s control point. + */ public float ctrly; + + + /** + * The <i>x</i> coordinate of the curve’s end point. + */ public float x2; + + + /** + * The <i>y</i> coordinate of the curve’s end point. + */ public float y2; + + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in single-precision floating-point format. All points are + * initially at position (0, 0). + */ public Float() { } + + /** + * Constructs a new QuadCurve2D that stores its coordinate values + * in single-precision floating-point format, specifying the + * initial position of each point. + * + * @param x1 the <i>x</i> coordinate of the curve’s start + * point. + * + * @param y1 the <i>y</i> coordinate of the curve’s start + * point. + * + * @param cx the <i>x</i> coordinate of the curve’s control + * point. + * + * @param cy the <i>y</i> coordinate of the curve’s control + * point. + * + * @param x2 the <i>x</i> coordinate of the curve’s end + * point. + * + * @param y2 the <i>y</i> coordinate of the curve’s end + * point. + */ public Float(float x1, float y1, float cx, float cy, float x2, float y2) { @@ -423,45 +909,116 @@ public abstract class QuadCurve2D implements Shape, Cloneable this.y2 = y2; } + + /** + * Returns the <i>x</i> coordinate of the curve’s start + * point. + */ public double getX1() { return x1; } + + + /** + * Returns the <i>y</i> 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 <i>x</i> coordinate of the curve’s control + * point. + */ public double getCtrlX() { return ctrlx; } + + + /** + * Returns the <i>y</i> coordinate of the curve’s control + * point. + */ public double getCtrlY() { return ctrly; } + + + /** + * Returns the curve’s control point. + */ public Point2D getCtrlPt() { return new Point2D.Float(ctrlx, ctrly); } + + /** + * Returns the <i>x</i> coordinate of the curve’s end + * point. + */ public double getX2() { return x2; } + + + /** + * Returns the <i>y</i> 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 geometry of the curve, specifying coordinate values + * as double-precision floating-point numbers. + * + * @param x1 the <i>x</i> coordinate of the curve’s new + * start point. + * + * @param y1 the <i>y</i> coordinate of the curve’s new + * start point. + * + * @param cx the <i>x</i> coordinate of the curve’s new + * control point. + * + * @param cy the <i>y</i> coordinate of the curve’s new + * control point. + * + * @param x2 the <i>x</i> coordinate of the curve’s new + * end point. + * + * @param y2 the <i>y</i> coordinate of the curve’s new + * end point. + */ public void setCurve(double x1, double y1, double cx, double cy, double x2, double y2) { @@ -472,6 +1029,30 @@ public abstract class QuadCurve2D implements Shape, Cloneable this.x2 = (float) x2; this.y2 = (float) y2; } + + + /** + * Changes the geometry of the curve, specifying coordinate values + * as single-precision floating-point numbers. + * + * @param x1 the <i>x</i> coordinate of the curve’s new + * start point. + * + * @param y1 the <i>y</i> coordinate of the curve’s new + * start point. + * + * @param cx the <i>x</i> coordinate of the curve’s new + * control point. + * + * @param cy the <i>y</i> coordinate of the curve’s new + * control point. + * + * @param x2 the <i>x</i> coordinate of the curve’s new + * end point. + * + * @param y2 the <i>y</i> coordinate of the curve’s new + * end point. + */ public void setCurve(float x1, float y1, float cx, float cy, float x2, float y2) { @@ -482,6 +1063,18 @@ public abstract class QuadCurve2D implements Shape, Cloneable this.x2 = x2; this.y2 = y2; } + + + /** + * Determines the smallest rectangle that encloses the + * curve’s start, end and control point. As the + * illustration below shows, the invisible control point may cause + * the bounds to be much larger than the area that is actually + * covered by the curve. + * + * <p><img src="doc-files/QuadCurve2D-2.png" width="350" height="180" + * alt="An illustration of the bounds of a QuadCurve2D" /> + */ public Rectangle2D getBounds2D() { float nx1 = (float) Math.min(Math.min(x1, ctrlx), x2); @@ -490,5 +1083,5 @@ public abstract class QuadCurve2D implements Shape, Cloneable float ny2 = (float) Math.max(Math.max(y1, ctrly), y2); return new Rectangle2D.Float(nx1, ny1, nx2 - nx1, ny2 - ny1); } - } // class Float -} // class CubicCurve2D + } +} diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2ec0ea9cbc4bb0516c12cd357ba63b0aa27404 GIT binary patch literal 6363 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 literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png new file mode 100644 index 0000000000000000000000000000000000000000..496180c44746f3f265dbd03b606064e07998a58f GIT binary patch literal 5872 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 O9hK$PVKuVm;r|0<r2;qr literal 0 HcmV?d00001 diff --git a/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png b/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a7557ba7bafd1b658aedf94074fb6307083c1c1f GIT binary patch literal 12334 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%0AfN?-^LZwH(tb%_fM2 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 Fe*m<6wJQJs literal 0 HcmV?d00001 -- GitLab