0

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

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

5 回答 5

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
}

如您所见,所有多边形的所有点都是随机生成的,这与您生成第一个点然后将其余点相对于第一个点的方法相反。然而,由于多边形以网格状图案布置,因此失去了一种随机性。

于 2009-10-09T22:07:07.377 回答
1

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

Area newArea = new Area(newPolygon);
Area existingArea = new Area(existingPolygon);
Area existingAreaSub = new Area(existingPolygon); existingAreaSub.subtract(newArea);
boolean intersects = existingAreaSub.equals(existingArea);
于 2009-10-10T06:59:04.360 回答
1

查看 Polygon Collision 上的游戏编程 wiki:

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

于 2009-10-09T21:41:21.580 回答
0

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

于 2009-10-09T21:42:02.663 回答
-1

我已经通过使用 JTS在 Android 中使用 Kotlin 实现了这一点(请参阅 github 项目),请参见此处

步骤 1: 将 JTS 库添加到您的项目中

implementation group: 'org.locationtech.jts', name: 'jts-core', version: '1.15.0'

第2步:

为两个多边形创建 JTS 多边形对象

// create polygons One
        var polygoneOneArray: ArrayList<Coordinate> = ArrayList()
        for (points in polygonOnePointsList) {
            polygoneOneArray.add(Coordinate(points.latitude(), points.longitude()))
        }
        val polygonOne: org.locationtech.jts.geom.Polygon = GeometryFactory().createPolygon(
                polygoneOneArray.toTypedArray()
        )

// create polygons Two
        var polygoneTwoArray: ArrayList<Coordinate> = ArrayList()
        for (points in polygoneTwoPointsList) {
            polygoneTwoArray.add(Coordinate(points.latitude(), points.longitude()))
        }
        val polygonTwo: org.locationtech.jts.geom.Polygon = GeometryFactory().createPolygon(
                polygoneTwo.toTypedArray()
        )

第 3 步:

获取两个多边形的公共区域

val intersection: org.locationtech.jts.geom.Geometry = polygonOne.intersection(polygonTwo)

第4步:

从 polygonTwo 中删除公共区域

 val difference: org.locationtech.jts.geom.Geometry = polygonTwo.difference(intersection)

第五步:

合并多边形一并更新多边形二

val union: org.locationtech.jts.geom.Geometry = mergePolygonList.get(0).polygons.union(difference)

第五步:

现在从几何中选择点并绘制最终合并的多边形

   val array: ArrayList<Coordinate> = union.coordinates.toList() as ArrayList<Coordinate>
    val pointList: ArrayList<Point> = ArrayList()
    for (item in array) {
        pointList.add(Point.fromLngLat(item.y, item.x))
    }
    var list: ArrayList<List<Point>> = ArrayList<List<Point>>()
    list.add(pointList)
    style.addSource(
            GeoJsonSource(
                    "source-id${timeStamp}",
                    Feature.fromGeometry(Polygon.fromLngLats(list))
            )
    )
于 2021-08-18T08:04:25.690 回答