2017-05-20 6 views
0

Je voudrais dessiner un Polygone et le faire pivoter avec AffineTransform comme ça.Java: AffineTransform fait tourner Polygon, puis obtient ses points

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

Cependant, je voudrais être en mesure d'accéder aux points (transformed.xpoints [0]) de la même manière que je l'ai fait en tant que Polygon. Une façon de voir cela serait de transformer la forme en un polygone - mais autant que je sache, ce n'est pas possible.

Quelle est la meilleure option?

En tant que sidenote: il s'agit d'un exercice de création d'un arbre fractal composé de polygones à quatre côtés (rectangles). J'ai choisi d'utiliser les polygones pour ancrer les branches respectivement en haut à gauche et en haut à droite. Si cela est inutilement compliqué, faites le moi savoir.

Répondre

2

Vous pouvez utiliser le AffineTransform pour transformer les points individuels et, comme ceci:

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

Le tableau destPoints résultant ressemble alors à ceci:

[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

Excellent, merci! C'était juste ce que je cherchais. –

2

Vous pouvez obtenir les coordonnées former le chemin renvoyé par 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(); 
} 

Je n'ai pas fait cela depuis un moment, il pourrait y avoir un moyen plus facile d'obtenir ce que vous voulez. En outre, le casting à Path2D.Double n'est pas idéal.

+0

Merci! J'ai choisi la réponse de Joe parce que c'est un peu plus proche de ce que je cherchais. –