2017-05-20 3 views
0

Ich möchte ein Polygon zeichnen und drehen Sie es mit AffineTransform wie folgt.Java: AffineTransform drehen Polygon, dann erhalten Sie ihre Punkte

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

aber dann würde Ich mag Lage sein, die Punkte für den Zugriff (transformed.xpoints [0]) in der gleichen Weise, die ich als Polygon tat. Eine Möglichkeit, dies zu betrachten, wäre, die Form in ein Polygon zu verwandeln - aber soweit ich weiß, ist das nicht möglich.

Was ist die beste Option?

Als Nebenbemerkung: Dies ist eine Übung zum Erstellen eines fraktalen Baumes aus 4-seitigen Polygone (Rechtecke). Ich habe ausgewählt, Polygone zu verwenden, um Zweige an den oberen linken bzw. oberen rechten Punkten zu verankern. Wenn das unnötig kompliziert ist, lassen Sie es mich wissen.

Antwort

2

können Sie die AffineTransform verwenden, um die einzelnen Punkte auch zu verwandeln, etwa so:

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

Das resultierende destPoints Array sieht dann wie folgt aus:

[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

Ausgezeichnet, danke! Das war genau das, wonach ich suchte. –

2

Sie können die Koordinaten der Form erhalten Pfad zurückgegeben von 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(); 
} 

Ich habe das schon lange nicht mehr gemacht, vielleicht gibt es einen einfacheren Weg, um das zu erreichen, was Sie wollen. Auch das Gießen nach Path2D.Double ist nicht ideal.

+0

Danke! Ich habe Joes Antwort gewählt, weil es ein bisschen näher an dem ist, wonach ich gesucht habe. –

Verwandte Themen