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.internal.nls.Messages;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class Line2D represents a line whose data is given in high-precision
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values appropriate for graphical operations.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Line2D implements Shape, Cloneable {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Class Float is the subclass of Line2D that has all of its data values
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stored with float-level precision.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since Android 1.0
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Float extends Line2D {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the starting point.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float x1;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the starting point.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float y1;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the end point.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float x2;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the end point.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public float y2;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new float-valued Line2D with its data values set to
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * zero.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Float() {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new float-valued Line2D with the specified endpoints.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Float(float x1, float y1, float x2, float y2) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLine(x1, y1, x2, y2);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new float-valued Line2D with the specified endpoints.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param p1
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the starting point.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param p2
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the end point.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Float(Point2D p1, Point2D p2) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLine(p1, p2);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX1() {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x1;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY1() {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y1;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX2() {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x2;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY2() {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y2;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP1() {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Float(x1, y1);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP2() {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Float(x2, y2);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLine(double x1, double y1, double x2, double y2) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = (float)x1;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = (float)y1;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = (float)x2;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = (float)y2;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Sets the data values that define the line.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLine(float x1, float y1, float x2, float y2) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = x1;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = y1;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = x2;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = y2;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rectangle2D getBounds2D() {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float rx, ry, rw, rh;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (x1 < x2) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rx = x1;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rw = x2 - x1;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rx = x2;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rw = x1 - x2;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (y1 < y2) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ry = y1;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rh = y2 - y1;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ry = y2;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rh = y1 - y2;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Rectangle2D.Float(rx, ry, rw, rh);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Class Double is the subclass of Line2D that has all of its data
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values stored with double-level precision.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since Android 1.0
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Double extends Line2D {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the starting point.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double x1;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the starting point.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double y1;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the end point.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double x2;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the end point.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double y2;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new double-valued Line2D with its data values set to
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * zero.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Double() {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new double-valued Line2D with the specified endpoints.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x1
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the starting point.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y1
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the starting point.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param x2
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the x coordinate of the end point.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param y2
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the y coordinate of the end point.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Double(double x1, double y1, double x2, double y2) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLine(x1, y1, x2, y2);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Instantiates a new double-valued Line2D with the specified endpoints.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param p1
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the starting point.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param p2
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the end point.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Double(Point2D p1, Point2D p2) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLine(p1, p2);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX1() {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x1;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY1() {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y1;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getX2() {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return x2;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public double getY2() {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return y2;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP1() {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Double(x1, y1);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Point2D getP2() {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Point2D.Double(x2, y2);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setLine(double x1, double y1, double x2, double y2) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = x1;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = y1;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = x2;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = y2;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rectangle2D getBounds2D() {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double rx, ry, rw, rh;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (x1 < x2) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rx = x1;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rw = x2 - x1;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rx = x2;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rw = x1 - x2;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (y1 < y2) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ry = y1;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rh = y2 - y1;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ry = y2;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rh = y1 - y2;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new Rectangle2D.Double(rx, ry, rw, rh);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Line2D path iterator
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The subclass of PathIterator to traverse a Line2D.
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Iterator implements PathIterator {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the start line point.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x1;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the start line point.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y1;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The x coordinate of the end line point.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double x2;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The y coordinate of the end line point.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double y2;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The path iterator transformation.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AffineTransform t;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The current segment index.
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructs a new Line2D.Iterator for given line and transformation.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param l
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the source Line2D object.
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param at
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            the AffineTransform object to apply rectangle path.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Iterator(Line2D l, AffineTransform at) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x1 = l.getX1();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y1 = l.getY1();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.x2 = l.getX2();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.y2 = l.getY2();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.t = at;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getWindingRule() {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return WIND_NON_ZERO;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isDone() {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return index > 1;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void next() {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int currentSegment(double[] coords) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isDone()) {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.4B=Iterator out of bounds
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int type;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == 0) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_MOVETO;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = x1;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = y1;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_LINETO;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = x2;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = y2;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.transform(coords, 0, coords, 0, 1);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int currentSegment(float[] coords) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isDone()) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.4B=Iterator out of bounds
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new NoSuchElementException(Messages.getString("awt.4B")); //$NON-NLS-1$
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int type;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == 0) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_MOVETO;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = (float)x1;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = (float)y1;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type = SEG_LINETO;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[0] = (float)x2;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                coords[1] = (float)y2;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.transform(coords, 0, coords, 0, 1);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return type;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new Line2D.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Line2D() {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the starting point.
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x coordinate of the starting point.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getX1();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the starting point.
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the y coordinate of the starting point.
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getY1();
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the x coordinate of the end point.
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the x2.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getX2();
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the y coordinate of the end point.
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the y coordinate of the end point.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract double getY2();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the p the starting point.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the p the starting point.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract Point2D getP1();
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the p end point.
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the p end point.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract Point2D getP2();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the line's endpoints.
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point.
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract void setLine(double x1, double y1, double x2, double y2);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the line's endpoints.
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p1
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the starting point.
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p2
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the end point.
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLine(Point2D p1, Point2D p2) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setLine(p1.getX(), p1.getY(), p2.getX(), p2.getY());
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the line's endpoints by copying the data from another Line2D.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param line
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the Line2D to copy the endpoint data from.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLine(Line2D line) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setLine(line.getX1(), line.getY1(), line.getX2(), line.getY2());
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rectangle getBounds() {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBounds2D().getBounds();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells where the point is with respect to the line segment, given the
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation of the line segment. If the ray found by extending the line
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * segment from its starting point is rotated, this method tells whether the
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ray should rotate in a clockwise direction or a counter-clockwise
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * direction to hit the point first. The return value is 0 if the point is
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the line segment, it's 1 if the point is on the ray or if the ray
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should rotate in a counter-clockwise direction to get to the point, and
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it's -1 if the ray should rotate in a clockwise direction to get to the
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point or if the point is on the line determined by the line segment but
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not on the ray from the segment's starting point and through its end
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point.
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 line segment.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the line segment.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the line segment.
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the line segment.
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the p coordinate of the test point.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the value that describes where the point is with respect to the
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment, given the orientation of the line segment.
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int relativeCCW(double x1, double y1, double x2, double y2, double px, double py) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A = (x2-x1, y2-y1) P = (px-x1, py-y1)
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x2 -= x1;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y2 -= y1;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        px -= x1;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        py -= y1;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double t = px * y2 - py * x2; // PxA
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (t == 0.0) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t = px * x2 + py * y2; // P*A
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t > 0.0) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                px -= x2; // B-A
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                py -= y2;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t = px * x2 + py * y2; // (P-A)*A
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (t < 0.0) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = 0.0;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return t < 0.0 ? -1 : (t > 0.0 ? 1 : 0);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells where the point is with respect to this line segment, given the
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation of this line segment. If the ray found by extending the line
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * segment from its starting point is rotated, this method tells whether the
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ray should rotate in a clockwise direction or a counter-clockwise
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * direction to hit the point first. The return value is 0 if the point is
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the line segment, it's 1 if the point is on the ray or if the ray
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should rotate in a counter-clockwise direction to get to the point, and
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it's -1 if the ray should rotate in a clockwise direction to get to the
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point or if the point is on the line determined by the line segment but
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not on the ray from the segment's starting point and through its end
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point.
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the p coordinate of the test point.
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the value that describes where the point is with respect to this
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment, given the orientation of this line segment.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int relativeCCW(double px, double py) {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return relativeCCW(getX1(), getY1(), getX2(), getY2(), px, py);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells where the point is with respect to this line segment, given the
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * orientation of this line segment. If the ray found by extending the line
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * segment from its starting point is rotated, this method tells whether the
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ray should rotate in a clockwise direction or a counter-clockwise
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * direction to hit the point first. The return value is 0 if the point is
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the line segment, it's 1 if the point is on the ray or if the ray
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should rotate in a counter-clockwise direction to get to the point, and
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it's -1 if the ray should rotate in a clockwise direction to get to the
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point or if the point is on the line determined by the line segment but
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not on the ray from the segment's starting point and through its end
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test point.
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the value that describes where the point is with respect to this
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         line segment, given the orientation of this line segment.
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int relativeCCW(Point2D p) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return relativeCCW(getX1(), getY1(), getX2(), getY2(), p.getX(), p.getY());
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells whether the two line segments cross.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the first segment.
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the first segment.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the first segment.
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the first segment.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x3
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the second segment.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y3
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the second segment.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x4
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the second segment.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y4
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the second segment.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true, if the two line segments cross.
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean linesIntersect(double x1, double y1, double x2, double y2, double x3,
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double y3, double x4, double y4) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A = (x2-x1, y2-y1) B = (x3-x1, y3-y1) C = (x4-x1, y4-y1) D = (x4-x3,
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * y4-y3) = C-B E = (x1-x3, y1-y3) = -B F = (x2-x3, y2-y3) = A-B Result
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is ((AxB) (AxC) <=0) and ((DxE) (DxF) <= 0) DxE = (C-B)x(-B) =
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * BxB-CxB = BxC DxF = (C-B)x(A-B) = CxA-CxB-BxA+BxB = AxB+BxC-AxC
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x2 -= x1; // A
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y2 -= y1;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x3 -= x1; // B
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y3 -= y1;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x4 -= x1; // C
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y4 -= y1;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double AvB = x2 * y3 - x3 * y2;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double AvC = x2 * y4 - x4 * y2;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Online
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (AvB == 0.0 && AvC == 0.0) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (x2 != 0.0) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (x4 * x3 <= 0.0)
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || ((x3 * x2 >= 0.0) && (x2 > 0.0 ? x3 <= x2 || x4 <= x2 : x3 >= x2
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                || x4 >= x2));
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (y2 != 0.0) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (y4 * y3 <= 0.0)
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || ((y3 * y2 >= 0.0) && (y2 > 0.0 ? y3 <= y2 || y4 <= y2 : y3 >= y2
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                || y4 >= y2));
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double BvC = x3 * y4 - x4 * y3;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (AvB * AvC <= 0.0) && (BvC * (AvB + BvC - AvC) <= 0.0);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells whether the specified line segments crosses this line segment.
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the test segment.
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the test segment.
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the test segment.
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the test segment.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true, if the specified line segments crosses this line segment.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersectsLine(double x1, double y1, double x2, double y2) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linesIntersect(x1, y1, x2, y2, getX1(), getY1(), getX2(), getY2());
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tells whether the specified line segments crosses this line segment.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test segment.
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true, if the specified line segments crosses this line segment.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws NullPointerException
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             if l is null.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersectsLine(Line2D l) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return linesIntersect(l.getX1(), l.getY1(), l.getX2(), l.getY2(), getX1(), getY1(),
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getX2(), getY2());
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and the line segment.
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the line segment.
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the line segment.
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the line segment.
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the line segment.
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the square of the distance between the point and the line
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment.
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double ptSegDistSq(double x1, double y1, double x2, double y2, double px,
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double py) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A = (x2 - x1, y2 - y1) P = (px - x1, py - y1)
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x2 -= x1; // A = (x2, y2)
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y2 -= y1;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        px -= x1; // P = (px, py)
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        py -= y1;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double dist;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (px * x2 + py * y2 <= 0.0) { // P*A
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dist = px * px + py * py;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            px = x2 - px; // P = A - P = (x2 - px, y2 - py)
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            py = y2 - py;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (px * x2 + py * y2 <= 0.0) { // P*A
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dist = px * px + py * py;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dist = px * y2 - py * x2;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dist = dist * dist / (x2 * x2 + y2 * y2); // pxA/|A|
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dist < 0) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dist = 0;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dist;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the distance between the point and the line segment.
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the line segment.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the line segment.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the line segment.
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the line segment.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the distance between the point and the line segment.
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double ptSegDist(double x1, double y1, double x2, double y2, double px, double py) {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.sqrt(ptSegDistSq(x1, y1, x2, y2, px, py));
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and this line segment.
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the the square of the distance between the point and this line
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment.
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptSegDistSq(double px, double py) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptSegDistSq(getX1(), getY1(), getX2(), getY2(), px, py);
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and this line segment.
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test point.
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance between the point and this line
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         segment.
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptSegDistSq(Point2D p) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptSegDistSq(getX1(), getY1(), getX2(), getY2(), p.getX(), p.getY());
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the distance between the point and this line segment.
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance between the point and this line segment.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptSegDist(double px, double py) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptSegDist(getX1(), getY1(), getX2(), getY2(), px, py);
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the distance between the point and this line segment.
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test point.
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance between the point and this line segment.
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptSegDist(Point2D p) {
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptSegDist(getX1(), getY1(), getX2(), getY2(), p.getX(), p.getY());
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and the line.
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the line segment.
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the line segment.
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the line segment.
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the line segment.
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance between the point and the line.
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double ptLineDistSq(double x1, double y1, double x2, double y2, double px,
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            double py) {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        x2 -= x1;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        y2 -= y1;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        px -= x1;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        py -= y1;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        double s = px * y2 - py * x2;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s * s / (x2 * x2 + y2 * y2);
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and the line.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x1
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the starting point of the line segment.
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y1
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the starting point of the line segment.
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x2
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the end point of the line segment.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y2
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the end point of the line segment.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance between the point and the line.
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static double ptLineDist(double x1, double y1, double x2, double y2, double px, double py) {
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.sqrt(ptLineDistSq(x1, y1, x2, y2, px, py));
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and the line
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determined by this Line2D.
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance between the point and the line
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         determined by this Line2D.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptLineDistSq(double px, double py) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptLineDistSq(getX1(), getY1(), getX2(), getY2(), px, py);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the square of the distance between the point and the line
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determined by this Line2D.
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test point.
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the square of the distance between the point and the line
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         determined by this Line2D.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptLineDistSq(Point2D p) {
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptLineDistSq(getX1(), getY1(), getX2(), getY2(), p.getX(), p.getY());
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the distance between the point and the line determined by this
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Line2D.
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param px
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the x coordinate of the test point.
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param py
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the y coordinate of the test point.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance between the point and the line determined by this
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Line2D.
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptLineDist(double px, double py) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptLineDist(getX1(), getY1(), getX2(), getY2(), px, py);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gives the distance between the point and the line determined by this
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Line2D.
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the test point.
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the distance between the point and the line determined by this
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Line2D.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public double ptLineDist(Point2D p) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ptLineDist(getX1(), getY1(), getX2(), getY2(), p.getX(), p.getY());
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(double px, double py) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(Point2D p) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(Rectangle2D r) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean contains(double rx, double ry, double rw, double rh) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersects(double rx, double ry, double rw, double rh) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intersects(new Rectangle2D.Double(rx, ry, rw, rh));
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean intersects(Rectangle2D r) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r.intersectsLine(getX1(), getY1(), getX2(), getY2());
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathIterator getPathIterator(AffineTransform at) {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Iterator(this, at);
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PathIterator getPathIterator(AffineTransform at, double flatness) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Iterator(this, at);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object clone() {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.clone();
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CloneNotSupportedException e) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new InternalError();
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
949