19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.os.Parcel; 2044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.os.Parcelable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * PointF holds two float coordinates 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornpublic class PointF implements Parcelable { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float x; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float y; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PointF() {} 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PointF(float x, float y) { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x = x; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y = y; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PointF(Point p) { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x = p.x; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y = p.y; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the point's x and y coordinates 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void set(float x, float y) { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x = x; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y = y; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the point's x and y coordinates to the coordinates of p 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void set(PointF p) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x = p.x; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y = p.y; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void negate() { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = -x; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = -y; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void offset(float dx, float dy) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += dx; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += dy; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the point's coordinates equal (x,y) 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean equals(float x, float y) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this.x == x && this.y == y; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy @Override 769f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy public boolean equals(Object o) { 779f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy if (this == o) return true; 789f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy if (o == null || getClass() != o.getClass()) return false; 799f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 809f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy PointF pointF = (PointF) o; 819f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 829f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy if (Float.compare(pointF.x, x) != 0) return false; 839f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy if (Float.compare(pointF.y, y) != 0) return false; 849f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 859f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy return true; 869f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy } 879f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 889f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy @Override 899f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy public int hashCode() { 909f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy int result = (x != +0.0f ? Float.floatToIntBits(x) : 0); 919f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0); 929f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy return result; 939f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy } 949f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 959f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy @Override 969f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy public String toString() { 979f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy return "PointF(" + x + ", " + y + ")"; 989f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy } 999f8af6546deb26d8bddb0c1b23d554fe5380b9d3Romain Guy 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the euclidian distance from (0,0) to the point 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float length() { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return length(x, y); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the euclidian distance from (0,0) to (x,y) 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static float length(float x, float y) { 11133253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller return (float) Math.hypot(x, y); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn /** 11544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * Parcelable interface methods 11644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn */ 11744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn @Override 11844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public int describeContents() { 11944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn return 0; 12044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 12144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 12244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn /** 12344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * Write this point to the specified parcel. To restore a point from 12444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * a parcel, use readFromParcel() 12544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * @param out The parcel to write the point's coordinates into 12644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn */ 12744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn @Override 12844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public void writeToParcel(Parcel out, int flags) { 12944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn out.writeFloat(x); 13044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn out.writeFloat(y); 13144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 13244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 13344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public static final Parcelable.Creator<PointF> CREATOR = new Parcelable.Creator<PointF>() { 13444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn /** 13544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * Return a new point from the data in the specified parcel. 13644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn */ 13744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public PointF createFromParcel(Parcel in) { 13844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn PointF r = new PointF(); 13944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn r.readFromParcel(in); 14044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn return r; 14144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 14244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 14344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn /** 14444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * Return an array of rectangles of the specified size. 14544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn */ 14644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public PointF[] newArray(int size) { 14744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn return new PointF[size]; 14844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 14944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn }; 15044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 15144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn /** 15244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * Set the point's coordinates from the data stored in the specified 15344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * parcel. To write a point to a parcel, call writeToParcel(). 15444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * 15544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn * @param in The parcel to read the point's coordinates from 15644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn */ 15744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public void readFromParcel(Parcel in) { 15844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn x = in.readFloat(); 15944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn y = in.readFloat(); 16044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 16144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn} 162