2D-Grafik AffineTransform - Punkte abfragen nach transform()

Hallo,

ich arbeite gerade an einem Programm, welches ein Kreisdiagramm erstellt.
Für die unterschiedlichen Kreissektoren lasse ich eine Linie immer nach einer bestimmte Gradzahl drehen und dann zeichnen.

Aber wie kann ich jetzt die Points abfragen, wo sich die Linie befindet?

In meinem Code sieht es wie folgt aus:

Die Werte percent, size, g2, p1, p2 sind natürlich alle zugeordnet, etc.

Java:
AffineTransformation at = new AffineTransformation();
at.rotate(Math.toRadians(percent), size, size);
g2.transform(at);
g2.draw(new Line2D.Double(p1, p2));

KSKB kann auf Wunsch geliefert werden.


Vielen Dank schon mal im Voraus!
 
So direkt geht das erstmal nicht. Wenn man die Punkte wirklich braucht, muss man die Endpunkte der Linie wohl einzeln mit at#transform(srcPoint, dstPoint) transformieren.

Wenn es "größere" Objekte wären, könnte man mit at#createTransformedShape(...) ein transformiertes Shape erstellen und sich die Punkte da mit einem PathIterator abholen, aber für eine Linie wäre das ein Krampf...

BTW: Wenn da nicht irgendwo noch ein
g2.setTransform(someTransformThatWasStoredPreviously);
oder
g2.dispose();
steht werden die Drehungen "aufeinandergerechnet", was wohl nicht gewünscht ist...
 
Ah, vielen Dank!
Ich bin grade am Durchprobieren der Methoden und werde mir diese als nächstes vornehmen.

Und doch es ist gewünscht, dass die Drehungen sich aufrechnen. 😉

Edit: Leider hat das nicht wirklich funktioniert.
Ich werde mal einen Umweg probieren und wahrscheinlich auch eigene Methoden programmieren müssen...
 
Zuletzt bearbeitet:
Das geht schon so nach dem Prinzip, hier ein Beispielkomponent (die StringLabels sind ein bisschen versetzt, die richtig zu berechnen ist glaub ich etwas komplizierter). Die Rotationen werden dabei aufeinander gerechnet, es wird aber für jede ein eigenes transformed Shape erstellt.

Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.swing.JPanel;


public class KreisDiagrammPanel extends JPanel
{
	Map<String,Integer> sector=new TreeMap<String,Integer>();
	/**
	 * Create the panel.
	 */
	public KreisDiagrammPanel()
	{
		
	}
	
	public void addSector(String name, int weight)
	{
		sector.put(name, weight);
		repaint();
	}
	
	@Override
	public void paintComponent(Graphics graphics)
	{
		Graphics2D g=(Graphics2D)graphics;
		
		Rectangle clipBounds=g.getClipBounds();
		Rectangle bounds=clipBounds;
		if(bounds.height!=bounds.width)
		{
			int min=Math.min(bounds.height, bounds.width);
			bounds=new Rectangle(min,min);
			bounds.translate((clipBounds.width-bounds.width)/2,(clipBounds.height-bounds.height)/2);
		}
		
		Point center=new Point((int)bounds.getCenterX(),(int)bounds.getCenterY());
		Point twelve=new Point((int)bounds.getCenterX(),0);
		
		g.drawOval(bounds.x,bounds.y, bounds.width, bounds.height);
		
		double sum=0;
		for(Integer i:sector.values())
		{
			sum+=i;
		}
		
		
		Line2D.Double line=new Line2D.Double(center, twelve);
		AffineTransform af=new AffineTransform();
		Shape last=line;
		
		for(Entry<String,Integer> entry:sector.entrySet())
		{
			double percent=entry.getValue()/sum;
			double angle=percent*360;
			
			af.rotate(Math.toRadians(angle), center.x, center.y);
			Shape s=af.createTransformedShape(line);
			
			g.draw(s);
			g.drawString(entry.getKey(), (int)s.getBounds().getCenterX(),(int)s.getBounds().getCenterY());
			last=s;
		}	
	}		
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben