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 android.filterfw.geometry.Point;
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.geometry.Quad;
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/**
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class Rectangle extends Quad {
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Rectangle() {
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Rectangle(float x, float y, float width, float height) {
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super(new Point(x, y),
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              new Point(x + width, y),
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              new Point(x, y + height),
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              new Point(x + width, y + height));
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Rectangle(Point origin, Point size) {
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super(origin,
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              origin.plus(size.x, 0.0f),
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              origin.plus(0.0f, size.y),
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn              origin.plus(size.x, size.y));
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static Rectangle fromRotatedRect(Point center, Point size, float rotation) {
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point p0 = new Point(center.x - size.x/2f, center.y - size.y/2f);
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point p1 = new Point(center.x + size.x/2f, center.y - size.y/2f);
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point p2 = new Point(center.x - size.x/2f, center.y + size.y/2f);
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point p3 = new Point(center.x + size.x/2f, center.y + size.y/2f);
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Rectangle(p0.rotatedAround(center, rotation),
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             p1.rotatedAround(center, rotation),
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             p2.rotatedAround(center, rotation),
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             p3.rotatedAround(center, rotation));
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    private Rectangle(Point p0, Point p1, Point p2, Point p3) {
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        super(p0, p1, p2, p3);
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public static Rectangle fromCenterVerticalAxis(Point center, Point vAxis, Point size) {
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point dy = vAxis.scaledTo(size.y / 2.0f);
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        Point dx = vAxis.rotated90(1).scaledTo(size.x / 2.0f);
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Rectangle(center.minus(dx).minus(dy),
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             center.plus(dx).minus(dy),
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             center.minus(dx).plus(dy),
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                             center.plus(dx).plus(dy));
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float getWidth() {
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return p1.minus(p0).length();
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public float getHeight() {
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return p2.minus(p0).length();
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Point center() {
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return p0.plus(p1).plus(p2).plus(p3).times(0.25f);
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Rectangle scaled(float s) {
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Rectangle(p0.times(s), p1.times(s), p2.times(s), p3.times(s));
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    @Override
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    public Rectangle scaled(float x, float y) {
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return new Rectangle(p0.mult(x, y), p1.mult(x, y), p2.mult(x, y), p3.mult(x, y));
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    //public Rectangle rotated(float radians) {
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      // TODO: Implement this.
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    //}
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
96