2017-05-20 6 views
0

ポリゴンを描画してAffineTransformで回転させたいと思います。Java:AffineTransformポリゴンを回転し、その点を取得します。

float theta = 90; 
Polygon p = new Polygon(new int[]{0, 4, 4, 0}, new int[]{0, 0, 4, 4}, 4); 
AffineTransform transform = new AffineTransform(); 
transform.rotate(Math.toRadians(theta), p.xpoints[0], p.ypoints[0]); 
Shape transformed = transform.createTransformedShape(p); 
g2.fill(transformed); 

しかし、私は私が多角形と同じ方法でポイントを(transformed.xpoints [0])にアクセスできるようにしたいです。これを見る1つの方法は、シェイプをポリゴンに変換することですが、私が知る限りこれは不可能です。

最適な選択肢は何ですか?

脇の下として、これは四角形のポリゴン(四角形)で作成されたフラクタルツリーを作成するための演習です。私は左上点と右上点に枝をそれぞれアンカーするためにポリゴンを使用することを選択しました。これが不必要に複雑な場合は、私に教えてください。

答えて

2

あなたがそうのように、だけでなく、個々のポイントを変換するためにAffineTransformを使用することができます。

Point2D[] srcPoints = new Point2D[] { new Point(0, 0), new Point(4, 0), new Point(4, 4), new Point(4, 0) }; 
Point2D[] destPoints = new Point2D[4]; 
transform.transform(srcPoints, 0, destPoints, 0, 4); 

結果destPoints配列は、その後、次のようになります。

[Point2D.Float[-0.0, 0.0], Point2D.Float[-0.0, 4.0], Point2D.Float[-4.0, 4.0], Point2D.Float[-0.0, 4.0]] 
+0

優秀、ありがとうございます!それは私が探していたものでした。 –

2

あなたは座標を形成し得ることができますパスはcreateTransformedShape(...)によって返されます。

Path2D.Double transformed = (Path2D.Double) transform.createTransformedShape(p); 

List<Double> xpointsList = new ArrayList<>(); 
List<Double> ypointsList = new ArrayList<>(); 
PathIterator pi = transformed.getPathIterator(null); 

while(!pi.isDone()){ 
    double[] coords = new double[6]; 
    int type = pi.currentSegment(coords); 
    if(type == PathIterator.SEG_MOVETO || type == PathIterator.SEG_LINETO){ // The only types we're interested in given the original shape 
     xpointsList.add(coords[0]); 
     ypointsList.add(coords[1]); 
    } 
    pi.next(); 
} 

私はこれをしばらくしていないが、あなたが望むものを達成するためのより簡単な方法があるかもしれない。また、Path2D.Doubleへのキャスティングは理想的ではありません。

+0

ありがとうございます!ジョーの答えは私が探していたものに少し近いので選んだ。 –

関連する問題