Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:找到点和矩形之间最短距离的最佳方法?_Android_Math - Fatal编程技术网

Android:找到点和矩形之间最短距离的最佳方法?

Android:找到点和矩形之间最短距离的最佳方法?,android,math,Android,Math,似乎应该有一些方便的方法来做到这一点 我找不到一个,所以我拼凑了下面的算法。它是内存/计算最优的吗 谢谢: 编辑:原来的算法是愚蠢的错误,也许这更好 public static float minDistance(RectF rect, PointF point) { if(rect.contains(point.x, point.y)) { //North line float distance = point.y - rect.top;

似乎应该有一些方便的方法来做到这一点

我找不到一个,所以我拼凑了下面的算法。它是内存/计算最优的吗

谢谢:

编辑:原来的算法是愚蠢的错误,也许这更好

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;
    }
}
公共静态浮点数距离(RectF rect,PointF point)
{
if(矩形包含(点x、点y))
{
//北线
浮动距离=点y-直线顶部;
//东线
距离=数学最小值(距离,点x-直线左);
//南线
距离=数学最小值(距离,直底点y);
//西线
距离=数学最小值(距离,右直-点x);
返回距离;
}
其他的
{
浮貂,貂皮;
if(点x<直线左)
{
minX=rect.left;
} 
else if(点x>右直)
{
minX=rect.right;
} 
其他的
{
minX=点x;
}
if(点y<直线顶部)
{
minY=rect.top;
} 
else if(点y>直线底部)
{
minY=矩形底部;
} 
其他的
{
minY=点y;
}
float vectrox=point.x-minX;
float vectorY=point.y-minY;
浮点距离=(浮点)数学sqrt((vectorX*vectorX)+(vectorY*vectorY));
返回距离;
}
}

一种优化方法是在结束前不使用平方根。如果您只是比较距离平方,然后返回最小距离平方的sqrt,那么您只需执行一个sqrt

编辑:这是一个从点到线段(矩形边缘)距离的好例子。您可以使用它,并对其进行修改,使其返回距离的平方。然后比较它们并返回最小距离平方的sqrt


只需选取最近的点,然后计算到该点的距离即可。 不经意间:

    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));
float closestX,closestY;
如果(点x>=x1&&point.x=y1&&point.yx2){
closestX=x2;
}否则{
closestX=点x;
}
如果(点yy2点)发生其他情况{
closestY=y2;
}否则{
closestY=点y;
}
浮点向量=点x-闭合点x;
float vectorY=点Y-闭合;
浮动距离=sqrtf((vectorX*vectorX)+(vectorY*vectorY));

自然方法是考虑方格外的八个区域,四个角和四个侧向。这使得到广场边界的距离尽可能短。如果点位于正方形(可能是按钮)内,则距离为零,但如果需要距离,则距离是到四个边界的最短直线

我认为这是失败的,如果在直肠内?对于矩形内的点,这将始终给出距离0?它仅给出到矩形最近角的距离。如果它在两个角之间的线上呢?距离应该是零。回想起来,我的也是愚蠢的错误。因为它不适用于垂直线(提供无限斜率),而矩形有两条。@ab11:是的,如果点在矩形内,则距离为0。我假设这是“点到矩形的距离”测试中的预期行为,除非该点是获取点和周长之间的距离,而不是矩形的形状。是的,我的意思是距离周界的距离,我应该澄清一下。注意,你选择的答案给出的是到矩形最近角的距离,而不是到周界的距离。