Android: оптимальный способ найти кратчайшее расстояние между Point и Rect? - PullRequest
2 голосов
/ 21 января 2011

Кажется, должен быть какой-то удобный способ сделать это?

Я не смог найти один, поэтому я собрал нижеприведенный алгоритм. Это память / оптимально в вычислительном отношении?

Спасибо:

Редактировать: оригинальный алгоритм был тупо неправильным, может быть, это лучше?

public static float minDistance(RectF rect, PointF point)
{
    if(rect.contains(point.x, point.y))
    {
        //North line 
        float distance = point.y - rect.top;

        //East line
        distance = Math.min(distance, point.x - rect.left);

        //South line
        distance = Math.min(distance, rect.bottom - point.y);

        //West line
        distance = Math.min(distance, rect.right - point.x);

        return distance;
    }
    else
    {
        float minX, minY;

        if (point.x < rect.left) 
        {
            minX = rect.left;
        } 
        else if (point.x > rect.right) 
        {
            minX = rect.right;
        } 
        else 
        {
            minX = point.x;
        }

        if (point.y < rect.top) 
        {
            minY = rect.top;
        } 
        else if (point.y > rect.bottom) 
        {
            minY = rect.bottom;
        } 
        else 
        {
            minY = point.y;
        }

        float vectorX = point.x - minX;
        float vectorY = point.y - minY;

        float distance = (float) Math.sqrt((vectorX * vectorX) + (vectorY * vectorY)); 

        return distance;
    }
}

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Просто возьмите ближайшую точку и затем определите расстояние до нее.От макушки моей головы:

    float closestX, closestY;

    if(point.x >= x1 && point.x <= x2 && point.y >= y1 && point.y <= y2)
    {
         float bestDistance = point.y - y1;
         bestDistance = Math.min(distance, y2 - point.y);
         bestDistance = Math.min(distance, point.x - x1);
         bestDistance = Math.min(distance, x2 - point.x);

         return bestDistance;
    }

    if (point.x < x1) {
        closestX = x1;
    } else if (point.x > x2) {
        closestX = x2;
    } else {
        closestX = point.x;
    }

    if (point.y < x1) {
        closestY = y1;
    } else if (point.y > y2) {
        closestY = y2;
    } else {
        closestY = point.y;
    }

    float vectorY = point.x - closestX;
    float vectorY = point.Y - closestY;

    float distance = sqrtf((vectorX * vectorX) + (vectorY * vectorY));
1 голос
/ 01 августа 2012

Естественный подход заключается в рассмотрении восьми областей за пределами квадрата, четырех углов и четырех боковых. Это дает кратчайшее возможное расстояние до границы квадрата. Если точка находится внутри квадрата (возможно, кнопки), тогда расстояние равно нулю, но если требуется расстояние, это самая короткая прямая к четырем границам.

1 голос
/ 21 января 2011

Одна оптимизация - не использовать квадратный корень до конца.Если вы просто сравниваете квадрат расстояния и затем возвращаете квадрат наименьшего квадрата расстояния, вам нужно сделать только один квадрат.

Редактировать: Вот хороший пример расстояния от точки до отрезка (края)прямой).Вы можете использовать его и изменить так, чтобы вместо этого он возвращал квадрат расстояния.Затем сравните их все и верните квадрат минимального квадрата расстояния.

Расстояние между точкой и отрезком

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...