java:生成一个不在矩形内的随机点

时间:2012-01-25 14:29:14

标签: java awt point

我有许多矩形,我正在尝试生成一个不在其中任何一个内部的随机点。我创建了一个方法来执行此操作,但似乎这导致我的应用程序冻结,因为它必须在生成有效点之前经过大量的点:

public Point getLegalPoint() {
           Random generator = new Random();
           Point point;
           boolean okPoint = true;
           do {
                   point = new Point(generator.nextInt(975), generator.nextInt(650));
                   for (int i = 0; i < buildingViews.size(); i++) {
                           if (buildingViews.get(i).getBuilding().getRectangle()
                                           .contains(point)) {
                                   okPoint = false;
                                   break;
                           }

                   }
           } while (okPoint == false);
           return point;
   }

我做错了什么,或者是否有更有效的方法来做它以免它冻结我的应用程序?

3 个答案:

答案 0 :(得分:8)

如果您在第一次尝试时没有成功,此代码将导致无限循环, okPoint = true 必须位于 do 阻止。了解修复时的性能。 当你检查多个矩形而不只是一个矩形时,我想不出更快的方法。

答案 1 :(得分:0)

我会尝试这样的事情: 选择该点是在rectange(nextInt(4))的左侧/右侧/上/左侧,然后选择该区域中的随机点

代码:

public Point getLegalPoint(int x, int y, int width, int height){
  Random generator = new Random();
  int position = generator.nextInt(4); //0: top; 1: right; 2: bottom; 3:right
  if (position == 0){
    return new Point(generator.nextInt(975),y-generator.nextInt(y);
  } else if (position == 2){
    return new Point(generator.nextInt(975),y+height+(generator.nextInt(650-(y+height)));
  } 
   ... same for x ...
}

答案 2 :(得分:0)

生成随机点。然后检查它是否在矩形的边界内。如果是的话:

  1. 让centerX和centerY为矩形中心点的x和y。
  2. 如果randPointX&lt;然后让centerX让randPointX = randPointX - centerX
  3. 如果randPointX&gt;然后让centerX让randPointX = randPointX + centerX
  4. 对于y纵坐标执行相同的操作
  5. 你需要再次检查边界以查看该点是否在较大的视图之外(我假设的屏幕)。只需扭曲坐标。所以如果randPointX是负数,那么让它等于max_X + randPointX