19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Denis M. Kishenko
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.geom;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Rectangle;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Shape;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.NoSuchElementException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.Crossing;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class QuadCurve2D is a Shape that represents a segment of a quadratic
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (Bezier) curve. The curved segment is determined by three points: a start
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * point, an end point, and a control point. The line from the control point to
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the starting point gives the tangent to the curve at the starting point, and
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the line from the control point to the end point gives the tangent to the
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * curve at the end point.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class QuadCurve2D implements Shape, Cloneable {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Class Float is the subclass of QuadCurve2D that has all of its data
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values stored with float-level precision.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since Android 1.0
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Float extends QuadCurve2D {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the starting point of the curved segment.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float x1;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the starting point of the curved segment.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float y1;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the control point.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float ctrlx;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the control point.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float ctrly;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the end point of the curved segment.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float x2;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the end point of the curved segment.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float y2;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new float-valued QuadCurve2D with all coordinate
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * values set to zero.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Float() {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new float-valued QuadCurve2D with the specified
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * coordinate values.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point of the curved
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point of the curved
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrlx
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the control point.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrly
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the control point.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point of the curved segment.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point of the curved segment.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Float(float x1, float y1, float ctrlx, float ctrly, float x2, float y2) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setCurve(x1, y1, ctrlx, ctrly, x2, y2);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX1() {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x1;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY1() {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y1;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getCtrlX() {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ctrlx;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getCtrlY() {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ctrly;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX2() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x2;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY2() {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y2;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP1() {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Float(x1, y1);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getCtrlPt() {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Float(ctrlx, ctrly);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP2() {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Float(x2, y2);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setCurve(double x1, double y1, double ctrlx, double ctrly, double x2, double y2) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = (float)x1;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = (float)y1;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrlx = (float)ctrlx;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrly = (float)ctrly;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = (float)x2;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = (float)y2;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the data values of the curve.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point of the curved
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point of the curved
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrlx
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the control point.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrly
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the control point.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point of the curved segment.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point of the curved segment.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setCurve(float x1, float y1, float ctrlx, float ctrly, float x2, float y2) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = x1;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = y1;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrlx = ctrlx;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrly = ctrly;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = x2;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = y2;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rectangle2D getBounds2D() {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float rx0 = Math.min(Math.min(x1, x2), ctrlx);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float ry0 = Math.min(Math.min(y1, y2), ctrly);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float rx1 = Math.max(Math.max(x1, x2), ctrlx);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float ry1 = Math.max(Math.max(y1, y2), ctrly);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Rectangle2D.Float(rx0, ry0, rx1 - rx0, ry1 - ry0);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Class Double is the subclass of QuadCurve2D that has all of its data
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values stored with double-level precision.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since Android 1.0
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Double extends QuadCurve2D {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the starting point of the curved segment.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double x1;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the starting point of the curved segment.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double y1;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the control point.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double ctrlx;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the control point.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double ctrly;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the end point of the curved segment.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double x2;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the end point of the curved segment.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double y2;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new double-valued QuadCurve2D with all coordinate
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * values set to zero.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Double() {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new double-valued QuadCurve2D with the specified
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * coordinate values.
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point of the curved
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point of the curved
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            segment.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrlx
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the control point.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ctrly
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the control point.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point of the curved segment.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point of the curved segment.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Double(double x1, double y1, double ctrlx, double ctrly, double x2, double y2) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setCurve(x1, y1, ctrlx, ctrly, x2, y2);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX1() {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x1;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY1() {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y1;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getCtrlX() {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ctrlx;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getCtrlY() {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ctrly;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX2() {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x2;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY2() {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y2;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP1() {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Double(x1, y1);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getCtrlPt() {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Double(ctrlx, ctrly);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP2() {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Double(x2, y2);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setCurve(double x1, double y1, double ctrlx, double ctrly, double x2, double y2) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = x1;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = y1;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrlx = ctrlx;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.ctrly = ctrly;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = x2;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = y2;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rectangle2D getBounds2D() {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double rx0 = Math.min(Math.min(x1, x2), ctrlx);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double ry0 = Math.min(Math.min(y1, y2), ctrly);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double rx1 = Math.max(Math.max(x1, x2), ctrlx);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double ry1 = Math.max(Math.max(y1, y2), ctrly);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Rectangle2D.Double(rx0, ry0, rx1 - rx0, ry1 - ry0);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * QuadCurve2D path iterator
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The PathIterator for a Quad2D curve.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Iterator implements PathIterator {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The source QuadCurve2D object.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        QuadCurve2D c;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The path iterator transformation.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The current segment index.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructs a new QuadCurve2D.Iterator for given curve and
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * transformation
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param q
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the source QuadCurve2D object.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param t
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the AffineTransform that acts on the coordinates before
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            returning them (or null).
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Iterator(QuadCurve2D q, AffineTransform t) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.c = q;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.t = t;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getWindingRule() {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return WIND_NON_ZERO;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (index > 1);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void next() {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int currentSegment(double[] coords) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isDone()) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.4B=Iterator out of bounds
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int type;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == 0) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_MOVETO;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = c.getX1();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = c.getY1();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = 1;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_QUADTO;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = c.getCtrlX();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = c.getCtrlY();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[2] = c.getX2();
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[3] = c.getY2();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = 2;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.transform(coords, 0, coords, 0, count);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int currentSegment(float[] coords) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isDone()) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.4B=Iterator out of bounds
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int type;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == 0) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_MOVETO;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = (float)c.getX1();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = (float)c.getY1();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = 1;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_QUADTO;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = (float)c.getCtrlX();
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = (float)c.getCtrlY();
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[2] = (float)c.getX2();
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[3] = (float)c.getY2();
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                count = 2;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.transform(coords, 0, coords, 0, count);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new quadratic curve.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected QuadCurve2D() {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the starting point.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x coordinate of the starting point.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getX1();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the starting point.
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the y coordinate of the starting point.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getY1();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the starting point.
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the starting point.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract Point2D getP1();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the control point.
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x coordinate of the control point.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getCtrlX();
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the control point.
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return y coordinate of the control point.
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getCtrlY();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the control point.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the control point.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract Point2D getCtrlPt();
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the end point.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x coordinate of the end point.
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getX2();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the end point.
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the y coordinate of the end point.
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getY2();
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the end point.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the end point.
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract Point2D getP2();
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data of the curve.
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the curved segment.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the curved segment.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrlx
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the control point.
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrly
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the control point.
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the curved segment.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the curved segment.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract void setCurve(double x1, double y1, double ctrlx, double ctrly, double x2,
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y2);
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data of the curve.
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p1
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the starting point of the curved segment.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cp
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the control point.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p2
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the end point of the curved segment.
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if any of the three points is null.
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurve(Point2D p1, Point2D cp, Point2D p2) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurve(p1.getX(), p1.getY(), cp.getX(), cp.getY(), p2.getX(), p2.getY());
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data of the curve by reading the data from an array of values.
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The values are read in the same order as the arguments of the method
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link QuadCurve2D#setCurve(double, double, double, double, double, double)}
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * .
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param coords
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of values containing the new coordinates.
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset of the data to read within the array.
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {@code coords.length} < offset + 6.
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the coordinate array is null.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurve(double[] coords, int offset) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurve(coords[offset + 0], coords[offset + 1], coords[offset + 2], coords[offset + 3],
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[offset + 4], coords[offset + 5]);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data of the curve by reading the data from an array of points.
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The values are read in the same order as the arguments of the method
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link QuadCurve2D#setCurve(Point2D, Point2D, Point2D)}.
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param points
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points containing the new coordinates.
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset of the data to read within the array.
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if points.length < offset + 3.
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the point array is null.
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurve(Point2D[] points, int offset) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurve(points[offset + 0].getX(), points[offset + 0].getY(), points[offset + 1].getX(),
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                points[offset + 1].getY(), points[offset + 2].getX(), points[offset + 2].getY());
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the data of the curve by copying it from another QuadCurve2D.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param curve
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the curve to copy the data points from.
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the curve is null.
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurve(QuadCurve2D curve) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurve(curve.getX1(), curve.getY1(), curve.getCtrlX(), curve.getCtrlY(), curve.getX2(),
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curve.getY2());
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the square of the distance from the control point to the straight
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * line segment connecting the start point and the end point for this curve.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance from the control point to the straight
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment connecting the start point and the end point.
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getFlatnessSq() {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDistSq(getX1(), getY1(), getX2(), getY2(), getCtrlX(), getCtrlY());
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the square of the distance from the control point to the straight
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * line segment connecting the start point and the end point.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the curved segment.
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the curved segment.
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrlx
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the control point.
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrly
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the control point.
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the curved segment.
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the curved segment.
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance from the control point to the straight
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment connecting the start point and the end point.
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double getFlatnessSq(double x1, double y1, double ctrlx, double ctrly, double x2,
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y2) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDistSq(x1, y1, x2, y2, ctrlx, ctrly);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the square of the distance from the control point to the straight
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * line segment connecting the start point and the end point by reading the
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * coordinates of the points from an array of values. The values are read in
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same order as the arguments of the method
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link QuadCurve2D#getFlatnessSq(double, double, double, double, double, double)}
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * .
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param coords
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points containing the coordinates to use for the
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            calculation
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset of the data to read within the array
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance from the control point to the straight
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment connecting the start point and the end point.
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {@code coords.length} < offset + 6.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the coordinate array is null.
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double getFlatnessSq(double coords[], int offset) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDistSq(coords[offset + 0], coords[offset + 1], coords[offset + 4],
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[offset + 5], coords[offset + 2], coords[offset + 3]);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the distance from the control point to the straight line segment
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connecting the start point and the end point of this QuadCurve2D.
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the distance from the control point to the straight line
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment connecting the start point and the end point of this
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         QuadCurve2D.
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double getFlatness() {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDist(getX1(), getY1(), getX2(), getY2(), getCtrlX(), getCtrlY());
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the distance from the control point to the straight line segment
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connecting the start point and the end point.
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the curved segment.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the curved segment.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrlx
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the control point.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctrly
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the control point.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the curved segment.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the curved segment.
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the distance from the control point to the straight line
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment connecting the start point and the end point.
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double getFlatness(double x1, double y1, double ctrlx, double ctrly, double x2,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y2) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDist(x1, y1, x2, y2, ctrlx, ctrly);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the the distance from the control point to the straight line segment
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connecting the start point and the end point. The values are read in the
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * same order as the arguments of the method
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link QuadCurve2D#getFlatness(double, double, double, double, double, double)}
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * .
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param coords
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of points containing the coordinates to use for the
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            calculation.
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset of the data to read within the array.
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the distance from the control point to the straight line
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment connecting the start point and the end point.
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {code coords.length} < offset + 6.
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the coordinate array is null.
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double getFlatness(double coords[], int offset) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Line2D.ptSegDist(coords[offset + 0], coords[offset + 1], coords[offset + 4],
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[offset + 5], coords[offset + 2], coords[offset + 3]);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the data for two quadratic curves by dividing this curve in two.
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The division point is the point on the curve that is closest to this
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * curve's control point. The data of this curve is left unchanged.
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the QuadCurve2D where the left (start) segment's data is
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the QuadCurve2D where the right (end) segment's data is
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if either curve is null.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void subdivide(QuadCurve2D left, QuadCurve2D right) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        subdivide(this, left, right);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the data for two quadratic curves by dividing a source curve in
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two. The division point is the point on the curve that is closest to the
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * source curve's control point. The data of the source curve is left
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unchanged.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the curve that provides the initial data.
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the QuadCurve2D where the left (start) segment's data is
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the QuadCurve2D where the right (end) segment's data is
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if one of the curves is null.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void subdivide(QuadCurve2D src, QuadCurve2D left, QuadCurve2D right) {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x1 = src.getX1();
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y1 = src.getY1();
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx = src.getCtrlX();
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy = src.getCtrlY();
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x2 = src.getX2();
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y2 = src.getY2();
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx1 = (x1 + cx) / 2.0;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy1 = (y1 + cy) / 2.0;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx2 = (x2 + cx) / 2.0;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy2 = (y2 + cy) / 2.0;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cx = (cx1 + cx2) / 2.0;
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cy = (cy1 + cy2) / 2.0;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (left != null) {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left.setCurve(x1, y1, cx1, cy1, cx, cy);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (right != null) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right.setCurve(cx, cy, cx2, cy2, x2, y2);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the data for two quadratic curves by dividing a source curve in
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * two. The division point is the point on the curve that is closest to the
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * source curve's control point. The data for the three curves is read and
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written from arrays of values in the usual order: x1, y1, cx, cy, x2, y2.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param src
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array that gives the data values for the source curve.
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param srcoff
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the src array to read the values from.
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array where the coordinates of the start curve should be
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param leftOff
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the left array to start writing the values.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array where the coordinates of the end curve should be
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            written.
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rightOff
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the offset in the right array to start writing the values.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {@code src.length} < srcoff + 6 or if {@code left.length}
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             < leftOff + 6 or if {@code right.length} < rightOff + 6.
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if one of the arrays is null.
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void subdivide(double src[], int srcoff, double left[], int leftOff,
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double right[], int rightOff) {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x1 = src[srcoff + 0];
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y1 = src[srcoff + 1];
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx = src[srcoff + 2];
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy = src[srcoff + 3];
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x2 = src[srcoff + 4];
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y2 = src[srcoff + 5];
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx1 = (x1 + cx) / 2.0;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy1 = (y1 + cy) / 2.0;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cx2 = (x2 + cx) / 2.0;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double cy2 = (y2 + cy) / 2.0;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cx = (cx1 + cx2) / 2.0;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cy = (cy1 + cy2) / 2.0;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (left != null) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 0] = x1;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 1] = y1;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 2] = cx1;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 3] = cy1;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 4] = cx;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            left[leftOff + 5] = cy;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (right != null) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 0] = cx;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 1] = cy;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 2] = cx2;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 3] = cy2;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 4] = x2;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right[rightOff + 5] = y2;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds the roots of the quadratic polynomial. This is accomplished by
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finding the (real) values of x that solve the following equation:
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * eqn[2]*x*x + eqn[1]*x + eqn[0] = 0. The solutions are written back into
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the array eqn starting from the index 0 in the array. The return value
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * tells how many array elements have been changed by this method call.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eqn
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            an array containing the coefficients of the quadratic
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            polynomial to solve.
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the number of roots of the quadratic polynomial.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {@code eqn.length} < 3.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if the array is null.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int solveQuadratic(double eqn[]) {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return solveQuadratic(eqn, eqn);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds the roots of the quadratic polynomial. This is accomplished by
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * finding the (real) values of x that solve the following equation:
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * eqn[2]*x*x + eqn[1]*x + eqn[0] = 0. The solutions are written into the
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * array res starting from the index 0 in the array. The return value tells
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * how many array elements have been written by this method call.
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eqn
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            an array containing the coefficients of the quadratic
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            polynomial to solve.
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param res
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array that this method writes the results into.
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the number of roots of the quadratic polynomial.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ArrayIndexOutOfBoundsException
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if {@code eqn.length} < 3 or if {@code res.length} is less
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             than the number of roots.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if either array is null.
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int solveQuadratic(double eqn[], double res[]) {
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Crossing.solveQuad(eqn, res);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(double px, double py) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Crossing.isInsideEvenOdd(Crossing.crossShape(this, px, py));
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(double rx, double ry, double rw, double rh) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cross = Crossing.intersectShape(this, rx, ry, rw, rh);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cross != Crossing.CROSSING && Crossing.isInsideEvenOdd(cross);
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersects(double rx, double ry, double rw, double rh) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cross = Crossing.intersectShape(this, rx, ry, rw, rh);
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cross == Crossing.CROSSING || Crossing.isInsideEvenOdd(cross);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(Point2D p) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return contains(p.getX(), p.getY());
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersects(Rectangle2D r) {
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intersects(r.getX(), r.getY(), r.getWidth(), r.getHeight());
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(Rectangle2D r) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight());
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rectangle getBounds() {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBounds2D().getBounds();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathIterator getPathIterator(AffineTransform t) {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Iterator(this, t);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathIterator getPathIterator(AffineTransform t, double flatness) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FlatteningPathIterator(getPathIterator(t), flatness);
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object clone() {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.clone();
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CloneNotSupportedException e) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new InternalError();
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
919