165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.geometry;
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.lang.Math;
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/**
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class Point {
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float x;
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float y;
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point() {
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point(float x, float y) {
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        this.x = x;
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        this.y = y;
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public void set(float x, float y) {
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        this.x = x;
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        this.y = y;
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public boolean IsInUnitRange() {
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return x >= 0.0f && x <= 1.0f &&
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn               y >= 0.0f && y <= 1.0f;
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point plus(float x, float y) {
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point(this.x + x, this.y + y);
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point plus(Point point) {
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return this.plus(point.x, point.y);
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point minus(float x, float y) {
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point(this.x - x, this.y - y);
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point minus(Point point) {
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return this.minus(point.x, point.y);
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point times(float s) {
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point(this.x * s, this.y * s);
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point mult(float x, float y) {
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point(this.x * x, this.y * y);
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float length() {
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return (float)Math.sqrt(x*x + y*y);
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float distanceTo(Point p) {
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return p.minus(this).length();
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point scaledTo(float length) {
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return this.times(length / this.length());
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point normalize() {
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return this.scaledTo(1.0f);
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point rotated90(int count) {
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        float nx = this.x;
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        float ny = this.y;
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        for (int i = 0; i < count; ++i) {
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            float ox = nx;
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            nx = ny;
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn            ny = -ox;
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        }
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point(nx, ny);
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point rotated(float radians) {
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        // TODO(renn): Optimize: Keep cache of cos/sin values
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Point((float)(Math.cos(radians) * x - Math.sin(radians) * y),
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                         (float)(Math.sin(radians) * x + Math.cos(radians) * y));
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point rotatedAround(Point center, float radians) {
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return this.minus(center).rotated(radians).plus(center);
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public String toString() {
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return "(" + x + ", " + y + ")";
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
114