我正在创造一个游戏。游戏的玩家必须留在广场内。我想通知他们距离广场周边最近点的距离,如果距离变为0,请阻止它们离开。
我需要找到给定点距离边界最近点的距离。
我有一个正方形。该广场的中心位于(0,0)。这意味着右上角位于(侧面的1/2,侧面的1/2),左下角位于( - 侧面的1/2, - 侧面的1/2)。随着地图在整个游戏中缩小,我必须保持这个值抽象。
给定一个点,X和Y,我将如何找到最近的坐标点,以便我可以测量它的距离?
Psuedocode或Java答案将不胜感激。
谢谢!
答案 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的绝对值,但您可以通过反转相应的减法来避免采用绝对值。 (哪些反转取决于坐标轴的运行方式。)我也忽略了对点进行分类的问题。你必须对各地的标志保持一致。