Java 如何避免多边形重叠

Java 如何避免多边形重叠,java,drawing,overlap,Java,Drawing,Overlap,我创建了一个程序,每当用户按下一个按钮时自动绘制许多多边形。多边形的点是使用随机函数自动生成的。问题是,由于多边形的点是随机生成的,因此某些多边形与其他多边形重叠。如何避免这种情况,使每个多边形都不重叠地显示 ..... List<Polygon> triangles = new LinkedList<Polygon>(); Random generator = new Random(); public void paintComponent(Graphics g)

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

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

}
。。。。。
列表三角形=新建LinkedList();
随机生成器=新随机();
公共组件(图形g){
对于(int i=0;i<10;i++){
double xWidth=generator.nextDouble()*40.0+10.0;
双Y高度=发电机.nextDouble()*40.0+10.0;
xCoord[0]=生成器.nextInt(最大宽度);
yCoord[0]=发电机的下一个色调(最大高度);
xCoord[1]=(int)(xCoord[0]-xWidth);
xCoord[2]=(int)(xCoord[1]+(xWidth/2));
yCoord[1]=yCoord[0];
yCoord[2]=(int)(yCoord[1]-yHeight);
添加(新多边形(xCoord,yCoord,3));
}
图形2d g2=(图形2d)g;
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
g2.设定行程(新基本行程(1));
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.00f));
g2.setPaint(Color.black);//设置多边形线
对于(多边形三角形:三角形)g2.drawPolygon(三角形);
多边形[]triArray=三角形.toArray(新多边形[triangles.size()]);
对于(多边形p:triArray)三角形。删除(p);
}

查看关于多边形碰撞的游戏编程wiki:


查看关于多边形碰撞的游戏编程wiki:


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

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

您可以将画布分成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
}
公共组件(图形g){
int[]xCoord=新的int[3];
int[]yCoord=新int[3];
int colCnt=5;
int rowCnt=2;
int maxCellWidth=getWidth()/colCnt;
int maxCellHeight=getHeight()/rowCnt;
对于(int i=0;i<(colCnt*rowCnt);i++){
int xMultiple=i%colCnt;
int-yMultiple=i/colCnt;
对于(int j=0;j<3;j++){
xCoord[j]=生成器.nextInt(maxCellWidth)
+(最大单元格宽度*X倍);
yCoord[j]=生成器.nextInt(最大单元高度)
+(最大单元高度*Y倍数);
}
添加(新多边形(xCoord,yCoord,3));
}
//…你剩下的方法
}

如您所见,所有多边形都随机生成了所有点,这与您生成第一个点然后使其余点相对于第一个点的方法不同。然而,当多边形以类似网格的模式排列时,会失去一种随机性

您可以将画布分成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
}
公共组件(图形g){
int[]xCoord=新的int[3];
int[]yCoord=新int[3];
int colCnt=5;
int rowCnt=2;
int maxCellWidth=getWidth()/colCnt;
int maxCellHeight=getHeight()/rowCnt;
对于(int i=0;i<(colCnt*rowCnt);i++){
int xMultiple=i%colCnt;
int-yMultiple=i/colCnt;
对于(int j=0;j<3;j++){
xCoord[j]=生成器.nextInt(maxCellWidth)
+(最大单元格宽度*X倍);
yCoord[j]=生成器.nextInt(最大单元高度)
+(最大单元高度*Y倍数);
}
添加(新多边形(xCoord,yCoord,3));
}
//…你剩下的方法
}

如您所见,所有多边形都随机生成了所有点,这与您生成第一个点然后使其余点相对于第一个点的方法不同。然而,当多边形以类似网格的模式排列时,会失去一种随机性

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

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

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

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

所以重申一下(这样我就不必长时间阅读代码),你正在生成10边的多边形,你不希望它们重叠吗?是的。我的JPanel的大小是600*600,我希望多边形不重叠地显示出来。所以重申一下(这样我就不必长时间阅读代码),你正在生成10边的多边形,你呢