似乎应该有一些方便的方法来做到这一点?
我找不到一个,所以我将以下算法汇总在一起。内存/计算最佳吗?
感谢:
编辑:原始算法是愚蠢的错误,也许这更好?
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;
}
}
答案 0 :(得分:2)
只需取最近点,然后到达距离。 在我的头顶:
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 :(得分:1)
一个优化是在结束之前不使用平方根。如果你只是比较距离平方然后返回最小距离平方的sqrt,你只需要做一个sqrt。
编辑:这是从点到线段(矩形边缘)的距离的一个很好的例子。您可以使用它,并对其进行修改,以便返回平方距离。然后比较它们并返回最小距离平方的sqrt。
答案 2 :(得分:1)
自然的方法是考虑广场外的八个区域,四个角和四个侧面。这给出了正方形边界的最短距离。如果该点位于正方形内(可能是一个按钮),则距离为零,但如果需要距离则最短直到四个边界。