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