Formen drehen und auf JPanel zeichnen

Status
Nicht offen für weitere Antworten.

Nicole81

Aktives Mitglied
Hallo,

Ich habe ein JPanel auf das ich Punkte zeichnen kann. Diese verbinden sich dann per g.drawLine zu irgendwelchen Formen. Jetzt möchte ich diese Objekte drehen. Eigentlich kein Problem, Mittelpunkt bestimmen, Objekt in den Nullpunkt verschieben, auf jeden Punkt die Rotationsmatrix anwenden und wieder zurückschieben.

Wenn ich das so machen (mit meinen Code) wird das Objekt allerdings von Schritt zu Schritt kleiner bis am Ende alle Punkte aufeinander liegen?

Kann mir wer helfen wo liegt mein Denk (Syntax) -Fehler???

Code:
private int PointCounter;
private int[][] Points;
private int lx, ly, hx, hy, vcenter, hcenter;

// methoden zum punkte hinzufügen, entfernen etc...
// paint methode zum punkte und linien zeichnen sind hier

public void calcBounds()  	// wird bei mousePressed aufgerufen
{
		lx = getWidth();
		ly = getHeight();
		hx = 0;
		hy = 0;
		
                                                //calc bounds from support points
			for (int i=0; i<PointCounter; i++)
			{		
				if (Points[i][X] < lx)
					lx = Points[i][X];
				if (Points[i][X] > hx)
					hx = Points[i][X];
				
				if (Points[i][Y] < ly)
					ly = Points[i][Y];
				if (Points[i][Y] > hy)
					hy = Points[i][Y];
			}
		
		// calc center
		vcenter = lx + ((hx-lx) /2);
		hcenter = ly + ((hy-ly) /2);
}

public void rotate()  // wird bei mouseDragegd aufgerufen
{
			for (int i=0; i<PointCounter; i++)
			{
				// translate points to center, rotate an translate back
				Points[i][X] -= vcenter;
				Points[i][Y] -= hcenter;
				Points[i][X] = (int) (Math.cos(Math.toRadians(1)) * Points[i][X] + Math.sin(Math.toRadians(1)) * Points[i][Y]);
				Points[i][Y] = (int) (-Math.sin(Math.toRadians(1)) * Points[i][X] + Math.cos(Math.toRadians(1)) * Points[i][Y]);
				Points[i][X] += vcenter;
				Points[i][Y] += hcenter;
			}
}

Vielen Dank!
 

Marco13

Top Contributor
Der Fehler liegt vermutlich darin, dass dur die gedrehten Punkte drehst. Jedesmal, wenn du dein Objekt durch eine Matrix schickst, enstehen WINZIG kleine (Ab-)rundungsfehler. Bei jedem Dreh-Schritt summieren sich damit die Fehler auf.

Abhilfe: Erstelle dir EINMAL das "Basis-Objekt", und speichere dir zusätzlich den aktuellen Drehwinkel (und/oder die Matrix). (Du könntest das Objekt in eine eigene Klasse packen, von der du dir nacheinander alle Punkte als "Point2D"-Objekte holen kannst, und für die Matrix könntest (solltest) du eine AffineTransform verwenden)

Dann kannst du sinngemäß (!!! wirklich nur sinngemäß !!!) sowas machen wie
Code:
GeometricObject basisObjekt = erstelle();
float aktuellerWinkel = 0;

...
public void paint...(Graphics g)
{
    GeometricObject gedrehtesObjekt = new GeometricObject(basisObjekt); // Kopie erstellen
    gedrehtesObject.drehe(aktuellerWinkel); // Darin werden die Punkte von "gedrehtesObjekt" mit der Matrix multipliziert
    zeichne(gedrehtesObjekt);
}

In der mouseDragged-Methode würdest du dann nurnoch 'aktuellerWinkel' verändern, und eine neuzeichnen auslösen.
 

Nicole81

Aktives Mitglied
Danke für die Antworten.

@wildcard:
wenn ich das graphics objekt drehe, dann gehen mir ja die punkte verloren oder? ich brauche allerdings auch vom gedrehten objekt die koordinaten der punkte in meinem array.

@marco13
danke, hört sich gut an.
also im prnzip drehen ich immer von meinem basis objekt aus wenn ich das richtig verstanden hab. werde mal versuchen das so einzubauen.

grüße nicole
 

WieselAc

Top Contributor
Es könnte schon reichen die ganze Zeit mit double kooridnaten zu verwenden (also dein Punkt Array auf double umstellen) und dann immer erst zum Zeichen den Wert auf int runden.
 

Nicole81

Aktives Mitglied
Hallöle ich habe das jetzt so ähnlich gemacht wie marco13 es beschrieben hat, aber jetzt habe ich ein neues Problem und bräuchte nochmal Hilfe :oops:

Ich drehe jetzt immer von den original Punkten aus, vorher verschiebe ich um die berechnete Objektmitte und wieder zurück.
So, das Objekt dreht jetzt ohne kleiner zu werden allerdings nicht in sich selbst sondern um den als Mitte berechneten Ursprung?!?

Vorher hat es in sich gedreht aber es wurde kleiner?!?!
Ich verstehs gerade nicht mehr ???:L

Code:
	public void calcBounds()   // wird bei mousePressed aufgerufen
	{
		lx = getWidth();
		ly = getHeight();
		hx = 0;
		hy = 0;
		
			for (int i=0; i<PointCounter; i++)
			{		
				if (Points[i][X] < lx)
					lx = Points[i][X];
				if (Points[i][X] > hx)
					hx = Points[i][X];
				
				if (Points[i][Y] < ly)
					ly = Points[i][Y];
				if (Points[i][Y] > hy)
					hy = Points[i][Y];
			}
		
		// calc center
		vcenter = lx + ((hx-lx) /2);
		hcenter = ly + ((hy-ly) /2);
	}

	public void setStartCoords(int x, int y)  // wird bei mousePressed aufgerufen und nach rotate
	{
		StartCoordX = x;
		StartCoordY = y;
	}

	public void copyPoints()  // wird bei mousePressed aufgerufen - speichert das original "Objekt"
	{
		CopyPoints = new int[PointCounter][2];
		
		for (int i=0; i<PointCounter; i++)
		{
			CopyPoints[i][X] = Points[i][X];
			CopyPoints[i][Y] = Points[i][Y];
		}
	}

	public void rotate(int x, int y)   // wird bei mouseDragged aufgerufen
	{		
		if (x > StartCoordX || y > StartCoordY)
		{
			RotationAngel = RotationAngel + (x-StartCoordX > y-StartCoordY ? x-StartCoordX : y-StartCoordY);
			if (RotationAngel > 359)
				RotationAngel = RotationAngel - 360;
		}
		else if (x < StartCoordX || y < StartCoordY)
		{
			RotationAngel = RotationAngel - (StartCoordX-x > StartCoordY-y ? StartCoordX-x : StartCoordY-y);
			if (RotationAngel < 0)
				RotationAngel = RotationAngel + 360;
		}
		

			for (int i=0; i<PointCounter; i++)
			{
				Points[i][X] -= vcenter;
				Points[i][Y] -= hcenter;
				Points[i][X] = (int) (Math.cos(Math.toRadians(RotationAngel)) * CopyPoints[i][X] + Math.sin(Math.toRadians(RotationAngel)) * CopyPoints[i][Y]);
				Points[i][Y] = (int) (-Math.sin(Math.toRadians(RotationAngel)) * CopyPoints[i][X] + Math.cos(Math.toRadians(RotationAngel)) * CopyPoints[i][Y]);
				Points[i][X] += vcenter;
				Points[i][Y] += hcenter;
			}

		setStartCoords(x, y);
		repaint();
	}

Danke und Liebe Grüße Nicole
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
L JPanel Formen paralell anordnen AWT, Swing, JavaFX & SWT 9
E Darstellung komplexer Formen, z.B. gebogener Pfeil AWT, Swing, JavaFX & SWT 2
data89 Verbindungslinien zwischen Formen auf einer "Zeichenfläche" AWT, Swing, JavaFX & SWT 2
P Formen in verschiedee Richtungen aufziehen AWT, Swing, JavaFX & SWT 2
onek2705 ButtonArray drehen AWT, Swing, JavaFX & SWT 5
N Bild Drehen AWT, Swing, JavaFX & SWT 1
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
J Images drehen AWT, Swing, JavaFX & SWT 5
M Java FX 3D kamera drehen oder lieber die Gruppe drehen AWT, Swing, JavaFX & SWT 10
B Graphics2D Componente Drehen AWT, Swing, JavaFX & SWT 2
TheSorm Rectangle drehen AWT, Swing, JavaFX & SWT 9
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
C Rechteck drehen AWT, Swing, JavaFX & SWT 1
B 2D-Grafik String drehen/platzieren/formatieren in bestimmten Bereich AWT, Swing, JavaFX & SWT 1
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
F 2D-Grafik Punkte um Mittelpunkt drehen AWT, Swing, JavaFX & SWT 11
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
S Objekt durch Tasteneingabe mehrmals drehen AWT, Swing, JavaFX & SWT 9
M Rechtecke drehen AWT, Swing, JavaFX & SWT 15
P JComponent / JLabel drehen (Rotation) AWT, Swing, JavaFX & SWT 2
S Bild in Richtung Mauszeiger drehen AWT, Swing, JavaFX & SWT 2
D Swing Spielfeld drehen von Pentago endet in einer Katastrophe AWT, Swing, JavaFX & SWT 2
Jats 2D-Grafik Quadrat/Dreieck um Mittelpunkt drehen AWT, Swing, JavaFX & SWT 10
B 2D-Grafik Zeilen drehen im JEditorPane AWT, Swing, JavaFX & SWT 3
G Grafikobjekt drehen AWT, Swing, JavaFX & SWT 6
M Rechteck "umdrehen"/über die Kante drehen AWT, Swing, JavaFX & SWT 4
G Swing JLabel drehen für Kartenspiel AWT, Swing, JavaFX & SWT 9
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
multiholle Swing Panel um 90° drehen AWT, Swing, JavaFX & SWT 5
O JLabel um 90 Grad drehen ? AWT, Swing, JavaFX & SWT 9
E Bild drehen AWT, Swing, JavaFX & SWT 4
R Rechteck drehen! AWT, Swing, JavaFX & SWT 4
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
S wie Jpanel drehen AWT, Swing, JavaFX & SWT 4
J swing komponenten drehen? AWT, Swing, JavaFX & SWT 11
K Graphics drehen? AWT, Swing, JavaFX & SWT 7
B Ein Image Objekt drehen? AWT, Swing, JavaFX & SWT 2
N Bild drehen (AffinTransform etc.) AWT, Swing, JavaFX & SWT 2
N Bild drehen AWT, Swing, JavaFX & SWT 7
thE_29 Bild drehen AWT, Swing, JavaFX & SWT 6
C Koordinatensystem drehen AWT, Swing, JavaFX & SWT 3
B Text drehen AWT, Swing, JavaFX & SWT 4
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
kilopack15 JPanel im laufenden Zustand einfärben AWT, Swing, JavaFX & SWT 2
kilopack15 JPanel Farbverwaltung AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben