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。我假设这是“点到矩形的距离”测试中的预期行为,除非该点是获取点和周长之间的距离,而不是矩形的形状。是的,我的意思是距离周界的距离,我应该澄清一下。注意,你选择的答案给出的是到矩形最近角的距离,而不是到周界的距离。