Anklicken von Elementen im transfomierten Koordinatensystem

KCL

Grünschnabel
Hallo zusammen!

Ich bräuchte eure Hilfe.

Ich bin gerade dabei, ein Programm zu schreiben, in dem eine Datei eingelesen wird, die im Grunde genommen unr daten über Linienelemente enthält (es handelt sich dabei um ein Straßennetz). Danach sollen die Linien vom Benutzer angeklick werden können.

Da die Koordinaten der unterschiedlichen Netze sehr unterschiedlich sind, skaliere und verschiebe ich sie vor der Darstellung. Zusätzlich gebe ich dem User die Möglichkeit mit der Maus zusätzlich Verschiebungen aufzubringen.

Das Problem ist jetzt, dass ich beim Anklicken die Koordinaten im transformierten Koordinatensystem bekomme, die natürlich nicht mit denen der hinterlegten Line2D-Elemente übereinstimmen, mit denen ich sie vergleichen will.

Ich habe schon versucht, mir die jeweils aktuelle Transformation zu speichern und diese invers auf den geklickten Punkt anzuwenden, aber irgendwie funktioniert das auch nicht, denn die Koordinaten, die ich dadurch erhalte haben noch weniger mit den richtigen Werten zu tun.

Habt ihr eine Idee, was ich noch ausprobieren könnte?

Danke!
 
Okay, hat sich halbwegs erledigt. Wenn ich die Verschiebung durch die Maus ausschalte funktioniert es. Der Fehler muss also irgendwo in dieser Funktion liegen. Ich habe auch schon eine Idee, wo...
 
Doch nicht erledigt. Ich war am Freitag so froh, dass ich die Linien anklicken kann, dass ich nicht weiter darauf geachtet habe, was danach passiert.

Anscheinend wird die Grafik beim ersten Aufruf von paintComponent() aus irgendeinem Grund nur skaliert, nicht aber transliert gezeichnet. Das Anklicken funktioniert.

Sobald nun aber repaint() aufgerufen wird springt die Grafik in das translierte KOSY und die Koordinaten lassen sich nicht mehr rückrechnen.

Woran könnte das liegen?

Hier die relevanten Abschnitte aus meinem Code:
Java:
	public void paintComponent(Graphics g){
		super.paintComponents(g);
		
		Graphics2D g2d =(Graphics2D) g;
				
		g2d.scale(pxl/spread, -pxl/spread);
		
		if(minX < 0){
			g2d.translate(minX, (-maxY - minY));
		}
		else{
			g2d.translate(0, (-maxY - minY));
		}

		curTrans = g2d.getTransform();
...
}

	public void mousePressed(MouseEvent e){
            if(e.getButton() == MouseEvent.BUTTON1){
			Point2D click = e.getPoint();
			Point point = new Point();
			try {
				curTrans.inverseTransform(click, point);
			} catch (NoninvertibleTransformException e1) {
				e1.printStackTrace();
			}
			double eps = 1;
			
			for(int i = 0; i < lines.size(); i++){
				if(Math.abs(lines.elementAt(i).ptSegDist(point))<eps){
                                       /*
                                      *Aufruf eines Dialog zum weiteren Bearbeiten des Linienelements
                                      */
					break;
				}
			}
		}
	}

minX, minY, maxY und spread werden beim Kostruktoraufruf einmal berechnet und bleiben dann konstant.
pxl ist ebenfall einer Konstante, lines ein Vector von Line-Elementen.
 
Zurück