2012-01-25 61 views
1

我有很多矩形,并且试图生成一个不在它们中的任意点。我创建了这样做的方法,但现在看来,这是导致我的申请,冻结,因为它要经过大量的点产生一个有效的点之前:java:生成一个不在矩形内的随机点

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; 
    } 

有什么我做错误,还是有更有效的方式来做到这一点,以便它不会冻结我的应用程序?

+0

我假设你想要在一个矩形R1内生成一个点,这个矩形R1是在其他的rectagle R2之外的。如果是这样,你应该告诉我们R1 R2的相对大小,如果R2在R1内部 – leonbloy

+4

想象一下,如果for循环的第一次迭代设置“okPoint = false”,则执行此代码。什么时候再次设置为“真”? – nos

+0

矩形的大小是多少?我的意思是,如果它非常接近975x650,那么概率很低,您将需要大量迭代。 – rodrigoap

回答

8

该代码产生无限循环,如果你不第一次尝试成功,okPoint =真必须是内部的块。当你修复这个问题时,看看你的表现如何。 当你检查多个矩形而不是一个矩形时,我想不出更快的方式。

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 ... 
} 
+0

这不会选择等概率的所有点;这可能或可能不关心OP,但我会认为这是意图。 –

+0

好吧..这是真的,但问题是只有'角'的概率增加了一倍。它可以通过约束其他轴来修复..例如:如果选择的空间高于选择x的距离(rectangle.x,空间。宽度),如果选择下面的空间选择x从(0,rectangle.x + rectangle.width) – Ficik

+0

我重新考虑它..你是对的..概率将不相等 – Ficik

0

生成一个随机点。然后检查它是否在矩形的范围内。如果是:

  1. 设centerX和centerY为矩形中心点的x和y。
  2. 如果randPointX <的centerX然后让randPointX = randPointX - 的centerX
  3. 如果randPointX>的centerX然后让randPointX = randPointX +的centerX
  4. 做同样用于Y坐标
  5. ,你需要做的边界再次检查,看看是否该点在更大的视图之外(我假设的屏幕)。只需扭曲坐标。所以如果randPointX是负数,然后让它等于max_X + randPointX
+0

这不会以相等的概率生成所有可能的点,甚至在某些情况下甚至不会终止(例如,选择矩形的中心)。 –