2012-01-25 65 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

這不會以相等的概率生成所有可能的點,甚至在某些情況下甚至不會終止(例如,選擇矩形的中心)。 –