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

既存のすべてのポリゴンと同様に、新しいポリゴンから Area オブジェクトを作成します。既存のポリゴンから新しいポリゴンの面積を引きます。減算によって面積が変わると、ポリゴンが重なります。

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

キャンバスを 10 の領域に分割し、ポリゴンをそれぞれ独自の領域に制限できます。これを行うには、i値とランダムに生成された値の a %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

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 に答える