2017-03-03 10 views
1

私は職場のこの部分に苦労しているので、誰かが助けてくれることを願っています。私は意図的に仕事の内容を詳細には説明していません。問題。添付イメージに示すように四角形を1つのポリゴンにマージする必要がありますが、スイングキャンバスとそれからSVGエクスポートのためにポリゴンシェイプ(DOMオブジェクト)に書くことができるようにポイントのリストが必要です。java複数の四角形を1つのポリゴンにマージする方法

enter image description here

私は、各四角形すなわちの起源を知っています。左上のx座標とy座標(float x、float y)、各RectangleのWidth(float)とHeight(float)も同様にして、各Rectangleの4つのコーナーすべての座標を計算することができます。上、右、下、左 ie。トップ=原点= x、y、右= x +幅、底面= x +幅、y +高さ、左= x、y +高さ

私はList<Rectangle> rectanglesを持っており、このリストを単一のポリゴン(List<Points>ここでポイントは、赤い "x"で示された図に示すように各ポイントの座標(x、y)を表します。

次にこのポイントのリストを使用して、最終的にSVGでWebページを印刷するためのDOMです。最終結果はList of Points(つまり、SVGのPolygonシェイプを構築するためのx、y座標)でなければなりません。

私はこの回答を見ましたが、確かではないこれを私のケースに適用することができれば - それもJavaではなくPythonで書かれています。ここで

Merging multiple adjacent rectangles into one polygon

+1

あなたは組み込みのAPIを使用することができますか、これは何らかの種類の学校の割り当てですか? – MadProgrammer

+0

組み込みAPIはどれですか?これは学校の割り当てではありません。これは私が仕事のためにやるべき仕事の一部です。どうして質問が下されたのですか? – robbie70

+0

あなたは自分でコードを作成しようとするのではなく、あなたに答えを出すように人々に求めているからです。 – UnknowableIneffable

答えて

1

私の同僚と私が思いついたのソリューションです。それが他の誰かを助けることができると思う。

public class PolygonHelper { 

    public Polygon makePolygon(List<Rectangle> rectangles){ 
     List<Point> points = calcPoints(rectangles); 
     return new Polygon(points); 
    } 

    private List<Point> calcPoints(List<Rectangle> rectangles) { 
     List<Point> ret = new ArrayList<>(); 

     List<Float> yCoords = new ArrayList<>(getAllYCoords(rectangles)); 
     yCoords.sort(Comparator.naturalOrder()); 

     float previousLeftCoord = 0; 
     float previousRightCoord = 0; 

     for(float yCoord : yCoords) { 
      System.out.println("Considering yCoords "+ yCoord); 
      float minimumXLeftCoord = minXLeftCoord(yCoord, rectangles); 
      float maximumXRightCoord = maxXRightCoord(yCoord, rectangles); 
      System.out.println("min X: "+minimumXLeftCoord); 
      System.out.println("max X: "+maximumXRightCoord); 

      if(yCoord == yCoords.get(0)) { 
       ret.add(new Point(minimumXLeftCoord, yCoord)); 
       ret.add(new Point(maximumXRightCoord, yCoord)); 

      } else { 

       if(minimumXLeftCoord!=previousLeftCoord) { 
        ret.add(0, new Point(previousLeftCoord, yCoord)); 
        ret.add(0, new Point(minimumXLeftCoord, yCoord)); 
       } else { 
        ret.add(0, new Point(minimumXLeftCoord, yCoord)); 
       } 

       if(maximumXRightCoord!=previousRightCoord) { 
        ret.add(new Point(previousRightCoord, yCoord)); 
        ret.add(new Point(maximumXRightCoord, yCoord)); 
       } else { 
        ret.add(new Point(maximumXRightCoord, yCoord)); 
       } 

      } 

      previousLeftCoord = minimumXLeftCoord; 
      previousRightCoord = maximumXRightCoord; 
      System.out.println(ret); 
     } 

     return ret; 

    } 

    private Set<Float> getAllYCoords(List<Rectangle> rectangles) { 
     List<Float> allBottomYCoords = rectangles.stream().map(rectangle -> rectangle.getBottom().getY()).collect(Collectors.toList()); 
     List<Float> allTopYCoords = rectangles.stream().map(rectangle -> rectangle.getTop().getY()).collect(Collectors.toList()); 

     Set<Float> allCoords = new HashSet<>(); 
     allCoords.addAll(allTopYCoords); 
     allCoords.addAll(allBottomYCoords); 
     return allCoords; 
    } 

    private float minXLeftCoord(Float y, List<Rectangle> rectangles) { 
     return rectanglesAtY(y, rectangles).stream().map(rect -> rect.getLeft().getX()).min(Comparator.naturalOrder()).get(); 
    } 

    private float maxXRightCoord(Float y, List<Rectangle> rectangles) { 
     return rectanglesAtY(y, rectangles).stream().map(rect -> rect.getRight().getX()).max(Comparator.naturalOrder()).get(); 
    } 

    private List<Rectangle> rectanglesAtY(Float y, List<Rectangle> rectangles) { 
     List<Rectangle> rectsAtYExcBottomLines = rectsAtYExcBottomLines(y, rectangles); 

     if(rectsAtYExcBottomLines.size()>0) { 
      // there are rectangles that are not closing here, so ignore those that are closing. 
      return rectsAtYExcBottomLines; 
     } else { 
      // there are only rectangle bottom lines so we need to consider them. 
      return rectsAtYIncBottomLines(y, rectangles); 
     } 
    } 

    private List<Rectangle> rectsAtYExcBottomLines(Float y, List<Rectangle> rectangles) { 
     return rectangles.stream() 
       .filter(rect -> rect.getTop().getY()<=y && rect.getBottom().getY()>y).collect(Collectors.toList()); 
    } 

    private List<Rectangle> rectsAtYIncBottomLines(Float y, List<Rectangle> rectangles) { 
     return rectangles.stream() 
       .filter(rect -> rect.getTop().getY()<=y && rect.getBottom().getY()==y).collect(Collectors.toList()); 
    } 

} 
関連する問題