在矩形字段中查找矩形的最近可能位置

时间:2016-05-28 14:27:40

标签: java algorithm libgdx

我在2D城堡防御上编程,今天我遇到了一个问题,我无法找到一个好的解决方案。见下图:

enter image description here http://imgur.com/zOe2Muv

我想找到最接近的位置,将红色矩形放在这个矩形区域中而不重叠任何矩形。通过最接近的位置,我指的是最接近当前鼠标位置的位置,因此通常是与任何给定点最接近的位置。

该问题的正确算法是什么?

感谢!!!

1 个答案:

答案 0 :(得分:0)

这是一个优化问题,你的约束是线性的,你的目标函数是(分段)二次或线性的,这取决于你想要如何定义光标的距离。

假设矩形是由...定义的 x_i, y_i, w_i, h_i for i=1..n 并且红色矩形的大小为w, h,决策变量为红色矩形的x, y位置。

然后是非重叠约束:

所有x >= x_i + w_i

y >= y_i + h_ix <= x_i - wy <= y_i - hi=1..n

您可以通过多种方式定义目标(红色矩形与光标的距离):

  • 光标与红色矩形的最近点之间的适当Eucledian平方距离(我认为会产生分段二次函数)
  • Eucledian与红色矩形中心的平方距离(二次方)
  • 距离红色矩形中心的曼哈顿距离(分段线性)

然后,您可以使用quadratic programming solverMILP(混合整数线性编程)解算器来查找答案。如果矩形的数量不是太大(比如不到一百),那么即使使用GLPKLP Solve等免费解算器,它也会非常快。

请注意,要正确表达这些求解器的约束,您可能必须转换约束和目标,例如使用big M method作为约束,或transform将问题转换为线性目标。这意味着你将有额外的二进制变量,以及一些更多的约束(附加变量和约束的数量将与矩形的数量成比例)。