Objekttransformationen - mathematisch

Kel

Aktives Mitglied
Ich erzeuge ein Rechteckobjekt mit einem Eckpunkt, einer Höhe und einer Breite

Java:
import java.awt.Point;

public class Rechteck {
	
	// Der Eckpunkt ist der obere , linke Punkt des Rechteckes 
	private Point eckPunkt;
	private double hoehe;
	private double breite;
	
	// Rechteck: Konstruktor der alle Variablen der Klasse Rechteck setzt
	public Rechteck(int x, int y, double hoehe, double breite) {
		this.eckPunkt = new Point(x, y);
		this.hoehe = hoehe;
		this.breite = breite;
	}
	
	/* Rechteck: Es sollen sechs verschiedene Strecken erzeugt werden können
	*  Die Vier Kanten des 	Rechteckes und die zwei Diagonalen
	*  f soll daher hier wie eine ganzzahlige Zahl behandelt werden
	*/
	@Override
	public Strecke generiereStrecke(float f) {
		return null;
	}
	
	public static void main (String[] args) {
		Rechteck rechteck = new Rechteck(3,3,2.0,4.0);
	}

}

Nun soll das ganze Ding gedreht werden:
Code:
void drehen(int winkel)
Die Methode soll das Objekt in 90 Grad Schritten drehen(daher den Eckpunkt oder PunktA. Beim
Kreis macht eine Drehung keinen Unterschied)

Als Anhaltspunkt hab ich das hier Drehmatrix ? Wikipedia
Aber ich hab ja hier kein kartesisches Koordinatensystem. Da steh ich im Moment ziemlich auf dem Schlauch ... :rtfm:

Ich soll dazu noch die Methoden:
Code:
void skalieren(float f)
Die Methode soll das Objekt skalieren, daher die Breite und Höhe skalieren, den Radius skalieren
oder den Abstand von PunktB zu PunktA verändern.

Code:
void verschieben(Point p)
Die Methode soll das Objekt um die in p angegebenen Koordinaten verschieben. Daher den
Mittelpunkt, eckPunkt oder beide Punkte einer Strecke
Die dürften aber nicht das große Problem darstellen,
Code:
höhe*x, breite*x
und
Code:
setEckPunkt(x, y)
dürften das lösen.
 
G

Gast2

Gast
das skalieren und verschieben schaut gut aus.

Das drehen ist da schon nen etwas größeres Problem ;)
Dein Rechteck hat die Eigenschaften eckpunkt, höhe und breite. Wie willst du da die Drehung reinbringen? Der Eckpunkt sowie höhe und Breite ändern sich nicht durch eine Drehung.
Würdest du dein Rechteck durch 2 Punkte definieren könntest du den zweiten punkt um x Grad rotieren lassen, aber so seh ich da keine Möglichkeit das darzustellen.
 

Kel

Aktives Mitglied
Würdest du dein Rechteck durch 2 Punkte definieren könntest du den zweiten punkt um x Grad rotieren lassen, aber so seh ich da keine Möglichkeit das darzustellen.
Eventuell hab ich die vorhergehende Aufgabenstellung auch falsch verstanden,

Code:
void zeichnen() {}:
Gibt: „Rechteck mit a=… und b=… wurde gezeichnet“ aus.

Ich schätze mal, ich sollte schon dort die 2 Punkte definieren (a, b).
a = links unten, b = rechts oben?
 

Kel

Aktives Mitglied
Ein Punkt ist ja bereits definiert, eckPunkt(x, y) ist links oben.
Rechts unten wäre dann
Code:
x + breite, y - hoehe
.

Okay dann hätte ich 2 Punkte, wie gehts damit weiter?
Würdest du dein Rechteck durch 2 Punkte definieren könntest du den zweiten punkt um x Grad rotieren lassen, aber so seh ich da keine Möglichkeit das darzustellen.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ja du hast 2 Punkte.
Die Drehung verläuft um PunktA, der bleibt also in jedem Fall wo er ist. PunktB verschiebt sich.
Mal dir die Möglichkeiten (sind ja nur 4) auf nem Papier auf, und schau dir an wo PunktB landet bei einer Drehung um 90, 180, 270 und 360 Grad.
Da sollte dir dann recht schnell nen Muster klar werden ;)

Ne elegange Lösung kannst du per sinus/cosinus hinkriegen, aber das braucht nicht zwangsläufig.
 

Kel

Aktives Mitglied
Die sinus/cosinux-Lösung wäre mir lieber, der Winkel kann bei der Methode ja frei angegeben werden.

Gefunden hab ich das hier: Koordinatentransformation ? Wikipedia
Nur irgendwie weiss ich nicht, was ich da jetzt rechnen muss, die Umsetzung mit Math.x-Funktionen dürfte ja kein Problem sein.

Sieht dass dann so aus?
Java:
x' = x*cos(Winkel) + y*sin(Winkel);
y' = -x*sin(Winkel) + y*cos(Winkel);
Für den neu rotierten Punkt, abhängig vom Winkel. Am Eckpunkt wird ja rotiert, der ändert sich also nicht.
 
Zuletzt bearbeitet:
G

Gast2

Gast
nein, der Winkel ist nicht komplett frei. In der aufgabe steht doch:
Die Methode soll das Objekt in 90 Grad Schritten drehen

EDIT:
Schau dir halt an was bei deinen Rechnungen rauskommt wenn du die Winkel 90, 180, 270 und 360 einsetzt. Das vergleichste dann mit deinen Zeichnungen auf dem Papier und fertig biste ;)
 

Kel

Aktives Mitglied
nein, der Winkel ist nicht komplett frei. In der aufgabe steht doch:
In der Übung wird 100% auf variable Winkel eingegangen und Übungsgruppenleiter streiten sich grade, wie die Aufgabe überhaupt genau gemeint ist :noe:.

Mit einer variablen Lösung wäre ich also auf der sicheren Seiten.

Schau dir halt an was bei deinen Rechnungen rauskommt wenn du die Winkel 90, 180, 270 und 360 einsetzt. Das vergleichste dann mit deinen Zeichnungen auf dem Papier und fertig biste ;)
Danke für den Tipp :).
 
G

Gast2

Gast
Wenn der Winkel variabel sein soll, dann brauchst du für die Eckpunkte vermutlich eher Point.Double als Eckpunkt um kommazahlen abbilden zu können.
Du denkst dir dann von PunktA zu PunktB eine Linie und kannst die dann x Grad um PunktA rotieren lassen. Mit etwas sinus/cosinus/pythagoras sollte das schon gehn ;)
 

muckelzwerg

Bekanntes Mitglied
Prüf mal, ob es bei der Übung vielleicht darum geht, die entsprechenden affinen Abbildungen zu lernen.
Dafür würdest Du eine Matrixklasse brauchen (die gibts wie Sand am Meer) und eine Klasse für Deine Punkte.
Jede Transformation (Drehung, Skalierung ...) wird dann durchgeführt, indem jeder Punkt des Rechtecks mit den jeweiligen Matrizen multipliziert wird.
Grundsätzlich beziehen sich die Matrizen, die Du dafür findest, alle auf den Ursprung. Du musst also vorher Dein Rechteck auf dem Nullpunkt zentrieren und hinterher wieder zurückschieben.

Wieso hast Du kein kartesisches Koordinatensystem?
 

Kel

Aktives Mitglied
Mit etwas sinus/cosinus/pythagoras sollte das schon gehn ;)
Hab ich schon erwähnt, dass ich davon gar keine Ahnung habe? :oops:

Prüf mal, ob es bei der Übung vielleicht darum geht, die entsprechenden affinen Abbildungen zu lernen.
Dafür würdest Du eine Matrixklasse brauchen (die gibts wie Sand am Meer) und eine Klasse für Deine Punkte.
Interessante Idee, Matrixkram könnte es sein.

Jede Transformation (Drehung, Skalierung ...) wird dann durchgeführt, indem jeder Punkt des Rechtecks mit den jeweiligen Matrizen multipliziert wird.
Welche jeweiligen Matrizen frag ich mich da?

Grundsätzlich beziehen sich die Matrizen, die Du dafür findest, alle auf den Ursprung. Du musst also vorher Dein Rechteck auf dem Nullpunkt zentrieren und hinterher wieder zurückschieben.
Das würde sich ja noch relativ leicht realisieren lassen.

Wieso hast Du kein kartesisches Koordinatensystem?
Ich hab schon eins, aber nur gedanklich. Wird ja nichts real gezeichnet oder so.
 
Zuletzt bearbeitet:

muckelzwerg

Bekanntes Mitglied
Die Matrizen enthalten letztlich auch nichts anderes, als die Formeln, die Du sowieso bereits gefunden hast.
Die Uni Oldenburg hat ein gutes E-Learning-Modul zu dem Thema, mit Beispielen und prima Applets. Wenn Du das durcharbeitest, solltest Du es auf jeden Fall schaffen und gleichzeitigt so viel wie möglich verstehen/lernen können.
Grafiti: 2D-Transformationen
 

Ähnliche Java Themen

Neue Themen


Oben