簡體   English   中英

如何避免多邊形重疊

[英]How to avoid overlapping polygon

我創建了一個程序,每次用戶按下按鈕時都會自動繪制許多多邊形。 多邊形的點是使用隨機函數自動生成的。 問題在於,由於多邊形的點是隨機生成的,因此某些多邊形與其他多邊形重疊。 如何避免這種情況,使每個顯示的多邊形都不會重疊?

.....
List<Polygon> triangles = new LinkedList<Polygon>(); 
Random generator = new Random();

public void paintComponent(Graphics g) {

   for(int i = 0; i < 10; i++) {
      double xWidth = generator.nextDouble() * 40.0 + 10.0;
      double yHeight = generator.nextDouble() * 40.0 + 10.0;

      xCoord[0] = generator.nextInt(MAX_WIDTH);
      yCoord[0] = generator.nextInt(MAX_HEIGHT); 

      xCoord[1] = (int) (xCoord[0] - xWidth);
      xCoord[2] = (int) (xCoord[1] + (xWidth/2));       

      yCoord[1] = yCoord[0];
      yCoord[2] = (int) (yCoord[1] - yHeight);     

      triangles.add( new Polygon(xCoord,yCoord, 3));          
   }

   Graphics2D g2 = (Graphics2D) g;
   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   g2.setStroke(new BasicStroke(1)); 
   g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.00f));
   g2.setPaint(Color.black);//set the polygon line 

   for (Polygon triangle : triangles)  g2.drawPolygon(triangle);

   Polygon[] triArray = triangles.toArray(new Polygon[triangles.size()]);
   for (Polygon p:triArray) triangles.remove (p);

}

在Polygon Collision上查看游戲編程Wiki:

http://gpwiki.org/index.php/Polygon_Collision

您可以將畫布分成10個區域,並將每個多邊形限制在各自的區域。 為此,您可以使用i值和隨機生成的值的%100 (或其他合適的大小),然后將它們應用於x坐標和y坐標(如果適用)。 結果將是一個約束類似(不大於網格單元)但形狀隨機的多邊形的網格。

編輯:

再來看一遍,我愚弄了一下,就采用了上面介紹的一般概念,並刺探了一個實現:

public void paintComponent(Graphics g) {
    int[] xCoord = new int[3];
    int[] yCoord = new int[3];
    int colCnt = 5;
    int rowCnt = 2;
    int maxCellWidth = getWidth() / colCnt;
    int maxCellHeight = getHeight() / rowCnt;

    for (int i = 0; i < (colCnt * rowCnt); i++) {
        int xMultiple = i % colCnt;
        int yMultiple = i / colCnt;
        for (int j = 0; j < 3; j++) {
         xCoord[j] = generator.nextInt(maxCellWidth)
                   + (maxCellWidth * xMultiple);
             yCoord[j] = generator.nextInt(maxCellHeight)
                   + (maxCellHeight * yMultiple);
        }
        triangles.add(new Polygon(xCoord, yCoord, 3));
    }
    //... the rest of your method
}

如您所見,與您生成第一個點然后將其余點相對於第一個點的方法相反,所有的Polygon都有隨機生成的所有點。 但是,由於多邊形以網格狀圖案布局,因此失去了隨機性。

從新多邊形以及所有現有多邊形創建Area對象。 從現有多邊形中減去新多邊形的面積。 如果減法更改了面積,則多邊形重疊。

Area newArea = new Area(newPolygon);
Area existingArea = new Area(existingPolygon);
Area existingAreaSub = new Area(existingPolygon); existingAreaSub.subtract(newArea);
boolean intersects = existingAreaSub.equals(existingArea);

您可以實現方法Polycon.containsPoint( x, y )並重復隨機生成,直到此方法對所有繪制的Polycon.containsPoint( x, y )返回false為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM