在正方形中找到最近的边界点

时间:2016-12-03 22:56:17

标签: java geometry

我正在创造一个游戏。游戏的玩家必须留在广场内。我想通知他们距离广场周边最近点的距离,如果距离变为0,请阻止它们离开。

我需要找到给定点距离边界最近点的距离。

我有一个正方形。该广场的中心位于(0,0)。这意味着右上角位于(侧面的1/2,侧面的1/2),左下角位于( - 侧面的1/2, - 侧面的1/2)。随着地图在整个游戏中缩小,我必须保持这个值抽象。

给定一个点,X和Y,我将如何找到最近的坐标点,以便我可以测量它的距离?

Psuedocode或Java答案将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

上述解决方案似乎过于复杂。

首先要注意的是,从任何边缘到该点的最短距离始终是从该边缘到该点的相邻线。所以我会一直计算每个边缘的距离,然后选择要显示的最短边距。这应该是一个简单的计算。

距离上边缘的最小距离:(w * 1/2) - yposition

距离左边缘的最小距离:xposition - (-w * 1/2)

距右边最小距离:(w * 1/2) - xposition

距底边最小距离:yposition - (-w * 1/2)

w是正方形的总宽度。

这看起来是对的吗?你明白了。你希望所有的距离都是一个正数,我认为上面已经完成,但可能是错误的。

答案 1 :(得分:2)

假设您的方块与坐标轴对齐。 (如果没有,首先旋转整个问题)。然后将平面分成九个部分:正方形内部,正方形的上方和左侧,正上方等:

        .      .
        .      .
        .      .
        |      |
     1  |   2  |  3
...-----+------+-----...
        |      |
     4  |   5  |  6
        |      |
...-----+------+-----...
     7  |   8  |  9
        |      |
        .      .
        .      .
        .      .

然后通过将坐标与形成正方形的线进行比较来对点进行分类。如果该点落在区域1,3,7或9中,则该正方形上的最近点是对应的顶点。如果它落在区域2,4,6或8中,则最近的点是对应侧的投影。 (只需用边的坐标替换点中的适当坐标。)在区域5中,您必须确定哪一侧最接近。这可以通过简单减去适当的坐标来完成。一旦识别出最近的一侧,替换坐标就完成了。

由于区域5是最复杂的(与您的问题最相关),我的方法如下:

让点具有坐标(X,Y),并且正方形的边位于坐标y = Y top ,y = Y bottom ,并且类似地对于x 。然后比较| X - X left |,| X - X right |,| Y - Y top |和| Y - Y <子>底 |决定哪个更接近。说它是顶级的。那么正方形上最近的点是(X,Y top ),点和边之间的距离只是| Y - Y top |

在我的叙述性描述中,我只使用了区域5的绝对值,但您可以通过反转相应的减法来避免采用绝对值。 (哪些反转取决于坐标轴的运行方式。)我也忽略了对点进行分类的问题。你必须对各地的标志保持一致。