1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.graphics;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.util.FloatMath;
22
23
24/**
25 * PointF holds two float coordinates
26 */
27public class PointF implements Parcelable {
28    public float x;
29    public float y;
30
31    public PointF() {}
32
33    public PointF(float x, float y) {
34        this.x = x;
35        this.y = y;
36    }
37
38    public PointF(Point p) {
39        this.x = p.x;
40        this.y = p.y;
41    }
42
43    /**
44     * Set the point's x and y coordinates
45     */
46    public final void set(float x, float y) {
47        this.x = x;
48        this.y = y;
49    }
50
51    /**
52     * Set the point's x and y coordinates to the coordinates of p
53     */
54    public final void set(PointF p) {
55        this.x = p.x;
56        this.y = p.y;
57    }
58
59    public final void negate() {
60        x = -x;
61        y = -y;
62    }
63
64    public final void offset(float dx, float dy) {
65        x += dx;
66        y += dy;
67    }
68
69    /**
70     * Returns true if the point's coordinates equal (x,y)
71     */
72    public final boolean equals(float x, float y) {
73        return this.x == x && this.y == y;
74    }
75
76    @Override
77    public boolean equals(Object o) {
78        if (this == o) return true;
79        if (o == null || getClass() != o.getClass()) return false;
80
81        PointF pointF = (PointF) o;
82
83        if (Float.compare(pointF.x, x) != 0) return false;
84        if (Float.compare(pointF.y, y) != 0) return false;
85
86        return true;
87    }
88
89    @Override
90    public int hashCode() {
91        int result = (x != +0.0f ? Float.floatToIntBits(x) : 0);
92        result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0);
93        return result;
94    }
95
96    @Override
97    public String toString() {
98        return "PointF(" + x + ", " + y + ")";
99    }
100
101    /**
102     * Return the euclidian distance from (0,0) to the point
103     */
104    public final float length() {
105        return length(x, y);
106    }
107
108    /**
109     * Returns the euclidian distance from (0,0) to (x,y)
110     */
111    public static float length(float x, float y) {
112        return FloatMath.sqrt(x * x + y * y);
113    }
114
115    /**
116     * Parcelable interface methods
117     */
118    @Override
119    public int describeContents() {
120        return 0;
121    }
122
123    /**
124     * Write this point to the specified parcel. To restore a point from
125     * a parcel, use readFromParcel()
126     * @param out The parcel to write the point's coordinates into
127     */
128    @Override
129    public void writeToParcel(Parcel out, int flags) {
130        out.writeFloat(x);
131        out.writeFloat(y);
132    }
133
134    public static final Parcelable.Creator<PointF> CREATOR = new Parcelable.Creator<PointF>() {
135        /**
136         * Return a new point from the data in the specified parcel.
137         */
138        public PointF createFromParcel(Parcel in) {
139            PointF r = new PointF();
140            r.readFromParcel(in);
141            return r;
142        }
143
144        /**
145         * Return an array of rectangles of the specified size.
146         */
147        public PointF[] newArray(int size) {
148            return new PointF[size];
149        }
150    };
151
152    /**
153     * Set the point's coordinates from the data stored in the specified
154     * parcel. To write a point to a parcel, call writeToParcel().
155     *
156     * @param in The parcel to read the point's coordinates from
157     */
158    public void readFromParcel(Parcel in) {
159        x = in.readFloat();
160        y = in.readFloat();
161    }
162}
163