AffineTransformation

HimBromBeere

Top Contributor
Malzzeit,

ich habe - wie sollte es anders sein - ein für mich völlig unklares Problem. Eins vorweg: ich hasse das Versenden riesiger Codehaufen, aber in diesem komplexen Bsp. komm ich leider kaum drumherum, weil doch mittlerweile einige Klassen involviert sind;(. Ich versuche, mich kurz zu fassen:

In meiner Anwendung gibt es das Interface Geometry, welches u.a. die Methode
Code:
transform(AffineTransformation)
anbietet. Hier wird ein neues Punkt-Objekt mit den um AT veränderten Koordinaten erstellt und von der Methode zurückgegeben. Punkt ist eine Realisierung dieses Interfaces. Anschließend wird in einer Klasse GeoGraphics (erweitert Graphics2D um die Eigenschaft AffineTransformation af sowie einige weitere Methoden) dieser Punkt in eine Signatur umgewandelt (ein stinknormales Rectangle2D.Double).

Nun folgt der hierfür verantwortliche Code:
Java:
/**
 * Adds this geometry into the shapeList that belongs to this layer.<br> 
 * NOTE: Only geometries inside this list are drawable.
 */
public void addGeometry(Geometry geometry, String layerName) {
		
	Shape shape = null;
		
		
	if (geometry.getClass() == Point.class) {
		Point point = (Point) geometry.transform(af);	// geoPoint
		Point2D p = new Point2D.Double(point.getX(), point.getY());	// drawingPoint
			
		shape = new Rectangle2D.Double(p.getX() - 3, p.getY() - 3, 7, 7);	// rectangular signature
	}
}
Der ganze Spaß wird verwendet, um ein reales Objekt der Welt (in metrischen Koordinaten) auf den Bildschirm zu zeichnen (darum die Verwendung von Shape).
Nun habe ich jedoch in sporadischen Abtänden das Problem, dass meine übergebene Geometrie manchmal transformiert wird (das Objekt wird gezeichnet) und mal nicht. Paradoxerweise wird - wenn ich mein Programm debugge - IMMER das Gewünschte gezeichnet:eek:. Führe ich das Programm normal aus, geschieht das Zeichnen mal so und mal nicht.
Die eigentliche Tranformation geschieht hier:
Java:
@Override
public Point transform(AffineTransform af) {
	Point2D p = new Point2D.Double(this.X, this.Y);
	af.transform(p, p);
	if (DEBUG) System.out.println(
			"Point (" + this.X + "; " + this.Y + 
			")\t-->\ttransformed into Point(" + p.getX() + "; " + p.getY() + ")");
	return new Point(p.getX(), p.getY());		
}
Die Ausgabe bestätigt mir, dass die gewünschte Transformation manchmal schlichtweg nicht gemacht wird (die Koordinaten verändern sich nicht), aber - wie gesagt - NUR im nicht-Debug-Modus. ???:L

Ich weiß, das artet in Kristallkugelphilosophie aus, aber anders helfen kann ich mir in dem Fall nicht...


EDIT: um Eines gleichmal klarzustellen: die Transformation af ist immer die selbe, an der liegt es nicht...
Wenn ihr wollt, kann ich mal ein paar Beispielzahlen senden (einige Punkte inkl. der benötigten Tranformation).
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
OK... ich prezisiere das Ganze mal ein wenig auf eine einfache Frage:
Hatte schonmal jemand das Problem, dass beim Debugging etwas anderes gemacht wurde als beim normalen Ausführen?
 

Marco13

Top Contributor
Dem Symptomen nach klingt es nach irgendwas, was auf mehrere Threads zurückzuführen ist. Werden einige der Methoden von mehreren Threads aufgerufen (oder einem anderen als dem EDT)
 

HimBromBeere

Top Contributor
Nö, bisher alles in einem... an das Thema Threads wollte ich mich demnächst mal ranmachen, suche nur noch nach einer sinnvollen Strategie der Aufgabenaufteilung...

Btw.: Wer oder was ist EDT?
 

HimBromBeere

Top Contributor
So, hab das ganze mal in ´ne Testklasse geschaufelt...

Java:
// get real world extent and add a little offset
double minX = 4525291.0;
double minY = 5660151.0;
double maxX = 4624918.0;
double maxY = 5688977.0;
			
double currentXScale = 800 / (maxX - minX);
double currentYScale = 600 / (maxY - minY);
			
AffineTransform af = new AffineTransform();
// clear all current transformations
af.setToIdentity();
			
// allow only isotropic scaling
double scale = currentXScale < currentYScale ? currentXScale: currentYScale;
// mirror y-coord
af.scale(scale, -scale);
// translate to upper-left screen-corner 
af.translate(-minX, -maxY);
					
System.out.println(new Point(4525391.0, 5688877.0).transform(af));
Paradoxerweise geht das mit der Transformation auf diese Weise.


EDIT: So, nach vielen Änderungen sollte es doch nun endlich mal kompilierbar sein :D
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Hab´s nun endlich hinbekommen, es handelte sich schlichtweg um einen Doppelten Aufruf von AffineTransformation.transform(). Warum das allerdings manchmal trotzdem funktionierte wie gewünscht, weiß ich nicht.
 

Neue Themen


Oben