point RectF Distance - Android Graphics

Android examples for Graphics:Path Point

Description

point RectF Distance

Demo Code

/*/*ww w  .  ja va  2 s  .c  om*/
 BlueFlyVario flight instrument - http://www.alistairdickie.com/blueflyvario/
 Copyright (C) 2011-2012 Alistair Dickie

 BlueFlyVario is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 BlueFlyVario is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with BlueFlyVario.  If not, see <http://www.gnu.org/licenses/>.
 */
import android.graphics.RectF;

public class Main{
    public static double pointRectFDistance(Point2d p, RectF rect) {
        double min = Double.MAX_VALUE;
        Line2d[] lines = getLines(rect);
        for (int i = 0; i < lines.length; i++) {
            Line2d line = lines[i];
            double dist = pointLineDistance(line, p, true);
            if (dist < min) {
                min = dist;
            }
        }

        return min;

    }
    public static Line2d[] getLines(RectF rect) {
        Line2d[] lines = new Line2d[4];
        lines[0] = new Line2d(new Point2d(rect.left, rect.top),
                new Point2d(rect.right, rect.top));
        lines[1] = new Line2d(new Point2d(rect.right, rect.top),
                new Point2d(rect.right, rect.bottom));
        lines[2] = new Line2d(new Point2d(rect.right, rect.bottom),
                new Point2d(rect.left, rect.bottom));
        lines[3] = new Line2d(new Point2d(rect.left, rect.bottom),
                new Point2d(rect.left, rect.top));
        return lines;

    }
    public static double pointLineDistance(Point2d u, Point2d v, Point2d p,
            boolean isSegment) {
        double dist = crossProduct(u, v, p) / distance(u, v);
        if (isSegment) {
            double dot1 = dotProduct(u, v, p);
            if (dot1 > 0)
                return distance(v, p);

            double dot2 = dotProduct(v, u, p);
            if (dot2 > 0)
                return distance(u, p);
        }
        return Math.abs(dist);
    }
    public static double pointLineDistance(Line2d line, Point2d p,
            boolean isSegment) {
        return pointLineDistance(line.u, line.v, p, isSegment);
    }
    public static double crossProduct(Point2d pointA, Point2d pointB,
            Point2d pointC) {
        Point2d AB = new Point2d();
        Point2d AC = new Point2d();
        AB.x = pointB.x - pointA.x;
        AB.y = pointB.y - pointA.y;
        AC.x = pointC.x - pointA.x;
        AC.y = pointC.y - pointA.y;
        return AB.x * AC.y - AB.y * AC.x;

    }
    public static double distance(Point2d pointA, Point2d pointB) {
        double d1 = pointA.x - pointB.x;
        double d2 = pointA.y - pointB.y;

        return Math.sqrt(d1 * d1 + d2 * d2);
    }
    public static double dotProduct(Point2d pointA, Point2d pointB,
            Point2d pointC) {
        Point2d AB = new Point2d();
        Point2d BC = new Point2d();
        AB.x = pointB.x - pointA.x;
        AB.y = pointB.y - pointA.y;
        BC.x = pointC.x - pointB.x;
        BC.y = pointC.y - pointB.y;
        return AB.x * BC.x + AB.y * BC.y;

    }
}

Related Tutorials