如何避免重叠多边形

时间:2009-10-09 21:32:45

标签: java drawing overlap

我创建了一个程序,可以在每次用户按下按钮时自动绘制多个多边形。使用随机函数自动生成多边形的点。问题在于,由于多边形的点是随机生成的,因此一些多边形与其他多边形重叠。如何避免这种情况,以便显示每个多边形而不重叠?

.....
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);

}

4 个答案:

答案 0 :(得分:1)

查看Polygon Collision上的游戏编程维基:

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

答案 1 :(得分:1)

您可以将画布分成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
}

正如您所看到的,所有多边形都会随机生成所有点,而不是生成第一个点然后相对于第一个点生成其余点的方法。然而,随着多边形以网格状图案布局,存在失去随机性的感觉。

答案 2 :(得分:1)

从新多边形以及所有现有多边形创建区域对象。 从现有的多边形区域中减去新的多边形区域。如果减法改变了区域,则多边形重叠。

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

答案 3 :(得分:0)

您可以实现方法Polycon.containsPoint( x, y )并重复随机生成,直到此方法为所有绘制的多边形返回false

相关问题