AWT Probleme mit Zeichnen des Rectangle2D. Rotation stimmt nicht überein

knowledge

Bekanntes Mitglied
Hallo,

an der Uni verwenden wir ein kleines Framework, dass ich jetzt etwas ausbauen will. Die folgende Methode zeichnet ein Fahrzeug.
Ich wollte ein Rechteck (Rectangle2D) darüberlegen um bei der Fahrt der Fahrzeuge dieses zur Kollisionsprüfung nutzten zu können. Blöderweise wird dieses Rechteck (Variable s im Quellcode) aber verschoben dargestellt und liegt nicht genau über dem
Fahrzeug während der Fahrt sondern dreht sich komisch mit.

Wo liegt hier der Fehler? Anbei auch ein Screenshot des Fahrzeugs mit dem gezeichneten schwarzen Rechteck drüber


Java:
public void paint (Graphics2D graphics2D) {
		scaleX=getMassstab();
		graphics2D.scale(scaleX, scaleX);
		graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		graphics2D.setPaint( LkwColor ); 
		graphics2D.setStroke( new BasicStroke( 0.1f , BasicStroke.CAP_BUTT , BasicStroke.JOIN_BEVEL ) ); 
		graphics2D.rotate(winkel*Math.PI/180, x, y) ;
		
		
		Rectangle2D.Double LkwRect = new Rectangle2D.Double (x-0.5*laenge, y-0.5*breite  ,laenge, breite ) ;
		Rectangle2D.Double lkwRectInside = new Rectangle2D.Double (x-0.45*laenge, y-0.42*breite  ,0.9*laenge, 0.9*breite ) ;
		graphics2D.fill(LkwRect);
		graphics2D.setPaint(new Color(255,0,0,255));
		Rectangle2D.Double LkwRect1 = new Rectangle2D.Double (x+0.5*laenge, y-0.35*breite  ,laenge*0.15, breite*0.7 ) ;
		
		Rectangle2D.Double lkwrad1 = new Rectangle2D.Double (x-0.35*laenge, y-0.55*breite  ,laenge*0.2, breite*0.1 ) ;
		Rectangle2D.Double lkwrad2 = new Rectangle2D.Double (x-0.35*laenge, y+0.5*breite  ,laenge*0.2, breite*0.1 ) ;
		
		
		
		Rectangle2D.Double lkwrad3 = new Rectangle2D.Double (x+0.52*laenge, y-0.47*breite  ,laenge*0.1, breite*0.1 ) ;
		Rectangle2D.Double lkwrad4= new Rectangle2D.Double (x+0.52*laenge, y+0.37*breite  ,laenge*0.1, breite*0.1 ) ;
		
		graphics2D.fill(LkwRect1);
		graphics2D.setPaint(new Color(0,0,0,255));
		
		
		
		AffineTransform t = AffineTransform.getRotateInstance(winkel*Math.PI/180,x,y);
		Shape s = t.createTransformedShape(new Rectangle2D.Double (x-0.5*laenge, y-0.5*breite  ,laenge*1.15, breite*1.01 ));
		
		//Shape s = t.createTransformedShape(new Rectangle2D.Double (x-0.5*laenge, y-0.5*breite  ,laenge*1.15, breite*1.01 ));
		collisionRectangle = s.getBounds2D();
		
		graphics2D.draw(LkwRect);
		graphics2D.draw(lkwRectInside);		
		graphics2D.fill(lkwrad1);
		graphics2D.fill(lkwrad2);
		graphics2D.fill(lkwrad3);
		graphics2D.fill(lkwrad4);
		graphics2D.fill(s);
		
		
		graphics2D.draw(LkwRect1);		
		if (lkwfahrt==true) {			
			
		}		
		graphics2D.rotate(-winkel*Math.PI/180, x, y);
		graphics2D.scale(1/scaleX, 1/scaleX);		
	}
 

Anhänge

  • fahrzeug.png
    fahrzeug.png
    13 KB · Aufrufe: 37
Oder hat jemand ne einfache Möglichkeit parat wie ich ein Rechteck um die Fahrzeuge zeichnen kann. Dieses Rechteck will ich wie gesagt für die Kollisionsprüfung verwenden
 
Hallo Knowledge,

wir können z.B. den ursprünglichen Transform vor dem ersten rotate sicherstellen:
Java:
        AffineTransform transformSave = graphics2D.getTransform();
        graphics2D.rotate(winkel * Math.PI / 180, x, y);
und ihn dann zurücksetzen, bevor wir den rotierten Shape zeichnen:
Java:
        graphics2D.setTransform(transformSave);
        graphics2D.fill(s);
Hier ist noch ein Thread dazu, der dich interessieren könnte: http://www.java-forum.org/spiele-multimedia-programmierung/115640-probleme-affinetransform.html

Gruß,
André
 
Hallo,

danke für die schnelle Antwort. Das klappt schonmal sehr gut 🙂


Wie kann ich das transformierte Rectangle2D abspeichern? t.createTransformedShape gibt mir ja nur ein Shape zurück.

Shape s = t.createTransformedShape(new Rectangle2D.Double (x-0.5*laenge, y-0.5*breite ,laenge*1.15, breite ).getBounds2D());

Ich will das umschließende Rectangle von jedem Fahrzeug abspeichern um dann mittels intersects eine Kollisionsprüfung durchzuführen. Das Shape beinhaltet aber nur einen Path2D...

Gruß und Danke
 
Dachte das ist ein Ansatz. Aber das rectangle2D ist sehr viel größer als wenn ich nur fill(s) aufrufe

Java:
 graphics2D.setTransform(transformSave);
 graphics2D.fill(s.getBounds2D());
 
Hallo,

danke für die Antwort. Ok, es wird also nur die Zeichnung rotiert und nciht wirklich das Rectangle2D. So richtig schlau geworden bin ich aber nicht. Es muss doch einen einfachen Weg geben nur das Rectangle2D zu drehen und nicht nur die Zeichnung... Das sich also nicht nur das überlagernde schwarze Rechteck mitdreht, was ja klappt, sondern auch die zugrundeliegende geom. Representation des Rectangle. Evtl. noch ein Hinweis?
 
Sehr cool. Danke. Das hat wirklich weitergeholfen. Kollisionsprüfung über Area intersect funktioniert wunderbar. Was mich aber trotzdem noch verwundert das die getBounds2D() von der Area trotzdem komisch aussehen, während die Area selber perfekt über meinen Symbolen als Rechteck liegt ist das Rechteck was getBouns2D zurückliefert viel größer... Da würd mich mal interessieren woran das liegt. Prinzipiell sollte mein Problem aber gelöst sein.
 

Zurück
Oben