x 和 y 的计算使用完全相同的方法,所以我们现在只关注 x。
Random rand = new Random();
float x1 = Math.min(corner1.x, corner2.x);
float x2 = Math.max(corner1.x, corner2.x);
float deltaX = x2 - x1;
float offsetX = rand.nextFloat() * deltaX;
float randomX = x1 + offsetX;
这有效地对 x 值进行排序,以便将较小的值称为x1,将较大的值称为x2,并计算它们之间的差异并将其存储在deltaX 中。
然后使用java.util.Random.nextFloat() 计算一个随机值,它返回一个介于 0.0(含)和 1.0(不含)之间的值,并将随机值乘以 delta。这给了我们一个随机值offsetX,它介于零和两个值之间的总差之间。
最后,我们必须将此随机偏移添加到最小 x 值 x1,以便随机点确实位于矩形内,介于 x1(包括)和 x2(不包括)之间。
请注意,我已将其直接写入 Stack Overflow,没有进行任何测试,因此这是您编写一些单元测试以确保您使用的任何方法都适用于各种值(负数、正数)的好机会,两者的混合,零坐标等)。
(顺便说一句,我假设 Vector2 类来自 libgdx API,因为核心 Java 8 API 中没有这样的类。)
更新
即使不使用Math.min 和Math.max 对值进行排序(我已经通过单元测试确认了这一点),算法也可以工作,因此您可以简化方法:
public static float pickRandomPointBetween(float corner1, float corner2) {
if (corner1 == corner2) {
return corner1;
}
float delta = corner2 - corner1;
float offset = rand.nextFloat() * delta;
return corner1 + offset;
}
同样的方法适用于一对 x 或 y 值,并且无论corner1 的值是否小于、大于或等于corner2 的值都适用。请注意,检查corner1 == corner2 只是一种效率快捷方式,如果您知道您永远不会(或几乎永远不会)将相等的值传递给此方法,则可以将其删除。 (无论是否使用快捷方式,单元测试都会通过。)
要完成您的要求,您将在两个矩形角内创建一个随机点,如下所示:
float randomX = pickRandomPointBetween(corner1.x, corner2.x);
float randomY = pickRandomPointBetween(corner1.y, corner2.y);
Vector2 randomPoint = new Vector2(randomX, randomY);
但是为了保持你的代码整洁,这个逻辑可能应该放在一个专门的方法中,并给出一个清晰的名称。