• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Programmieraufgabe Berechnung eines Rechtecks

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
Hallo zusammen.

Wir haben im Studium über die Feiertage die Aufgabe gestellt bekommen, Klassen zu verschiedenen geometrischen Formen zu erstellen. Mitgeliefert sind die Klassen Point2D, Vector2D und Shape2D, wobei Shape2D die Superklasse der zu erstellenden Klassen Rectangle, Square, Ellipse und Circle ist. Die Klassen Point2D und Vector2D stellen bereits eine Reihe von Methoden zur Verfügung.

Mein Problem ist jetzt: Ich komme beim Besten Willen nicht drauf, wie ich einen der Eckpunkte berechnen kann. Vorgegeben (durch den Konstruktor) sind der Mittelpunkt, Breite und Länge und der Neigungswinkel der Form zur X-Achse. Zwar fallen mir schon ein oder zwei Möglichkeiten ein, was ich machen könnte (z. B. Umkehrung des Neigungswinkels, Addition der halben Breite zum Mittelpunkt, umgekehrter Neigungswinkel + 90 °, Addition der halben Höhe, um auf die untere linke Ecke zu kommen), aber ich kann mir nicht vorstellen, dass das so kompliziert sein soll. Es geht um einen Kurs Grundlagen Programmierung 1 und bislang waren die Aufgaben immer mit Hilfe der bereits zur Verfügung gestellten Funktionalität (also ohne große mathematische Verrenkungen) lösbar. Ich habe eher den Eindruck, dass ich hier grade ein Brett vor dem Kopf habe :confused:

Die für die Klasse Rectangle vorgeschriebenen Methoden:
double area()

double circumference()

double height()

Point2D pointA()

Point2D pointB()

Point2D pointC()

Point2D pointD()

void scale(double factor)
Scales the object with respect to its origin.
String toString()

double width()

Die von der Klasse Vector2D zur Verfügung gestellten Methoden:
static double addAngles(double angle1, double angle2)

Point2D freeVectorTip()
Returns the tip of the free vector of the current vector.

Vector2D report()
Shows a report on the vector on the output stream.

Vector2D rotate(double angle)
Rotates the object around its origin (counterclockwise).

Vector2D rotate(double angle, Point2D centre)
Rotates the vector around a point (counterclockwise).

Vector2D scale(double factor)
Scales the vector with respect to its initial point.

String toString()
Returns a textual representation of the vector.

Vector2D translate(Vector2D vector)
Translates the object according to the given vector.

Wenn jemand von euch eine Idee hat, die mich weiterbringt, wäre ich wirklich sehr dankbar!
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Aus den gegebeben Informationen errechnest du die Eckpunkte des zugehörigen achsenparallenen (= 'nicht rotierten') Rechteckes.
Diese rotierst du dann um den angegebenen Winkel z.b. über die zugehörige Rotationsmatrix mit der schon vorgegebenen Methode. Das Ergebnis ist dann was du suchst.
 
Zuletzt bearbeitet:

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
  • Thread Starter Thread Starter
  • #3
Danke dir schonmal. Hatte auch schon überlegt, das so zu machen.
Inzwischen habe ich erstmal mit der Klasse für die Ellipse angefangen. Dort sind die vier Schnittpunkte der beiden Achsen mit dem Umkreis zu berechnen. In dem Fall habe ich es tatsächlich über die Klasse Vector2D gelöst:

[src=java]public Point2D pointA() {
return new Vector2D(origin(), height / 2, angle()).rotate(270).tip;
}[/src]

Also der Vektor vom Mittelpunkt ausgehend, mit der halben Gesamthöhe als Vektorlänge, im "Winkel der Ellipse" (analog zum Neigungswinkel des Rechtecks), rotiert um 90 Grad im Uhrzeigersinn, und davon der Endpunkt. Ich nehme an, dass das Rechteck also doch auf ähnliche Art und Weise zu lösen ist (oder aber diese Lösung zumindest legitim ist).

Werde mir das aber mal ansehen, welche der beiden Varianten schneller zum Ziel führt.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Kann grad nicht nachvollziehen was du da berechnest. Aber vier Schnittpunkte muss es ja nicht unbedingt geben, es kann Null bis Vier Schnittpunkte geben.
Der Umkreis ist unabhängig von der Rotation der Ellipse. Der Weg der einem da als erstes einfällt ist wohl die Schnittpunkte ganz normal algebraisch zu berechnen aus der Kreisgleichung.
 

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
  • Thread Starter Thread Starter
  • #5
Was ich meine sind die vier Schnittpunkte der Haupt- und Nebenachse mit der Konturlinie der Ellipse. Und da muss es natürlich vier von geben. Was ich in der Berechnung oben mache, ist:

1.) Ich bilde einen Vektor, ausgehend vom Ursprung der Ellipse, mit der halben Höhe der Ellipse als Länge und in Richtung des Neigungswinkels der Ellipse
2.) Ich drehe diesen Vektor um 90 ° im Uhrzeigersinn (bzw. 270 ° gegen den Uhrzeigersinn), also orthogonal zur Hauptachse
3.) Damit zeigt der Endpunkt dieses Vektors zum Punkt A der Ellipse (also zum unteren Schnittpunkt der Nebenachse mit dem Umkreis)

Das gleiche mache entsprechend für die anderen drei Punkte.

Der Umkreis ist unabhängig von der Rotation der Ellipse.
Mit Umkreis meine ich (wie oben geschrieben) quasi die Konturlinie der Ellipse. Ich kenne den Fachbegriff da nicht. Und diese Konturlinie ist natürlich nicht unabhängig von der Rotation.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Ok, du willst die Scheitelpunkte berechnen, vermute ich.
Was du da rechnest leuchtet mir nicht ein, wie nimmst du denn sinnvoll einen Winkel als Richung?

Edit: Außer du meinst das so: Der Vector hat als Konstruktor einen Parameter für die Rotation mit drin. Ja gut, dann kannst du den natürlich damit füttern und halbe höhe nach oben halbe nach unten etc. aber halt rotiert.


Das von mir beschriebene Vorgehen funktioniert jedenfalls für jede der Formen. Du gehst davon aus, dass die Form nicht rotiert ist und (0,0) als Mittelpunkt hat. Dann berechnest du was auch immer du berechnen willst, das Ergebnis rotierst und verschiebst du dann (in dieser Reihenfolge).




Ist mir persönlich so jedenfalls zu viel Rätsel raten was gemeint sein könnte um da noch weiter mit einzusteigen.
 
Zuletzt bearbeitet:

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
  • Thread Starter Thread Starter
  • #7
Ich verstehe deinen Ansatz und hatte den wie gesagt ja auch schon im Kopf.

Für meine eigene Idee habe ich mich an die von den zur Verfügung gestellten Klassen bereitgestellten Methoden gehalten. Die Konstruktoren der Klasse Vector2D akzeptieren entweder einen Anfangs- und einen Endpunkt als Argumente oder einen Anfangspunkt, eine Länge und einen Winkel (im Sinne einer Neigung, also quasi eine Richtung). Die Klasse Shape2D arbeitet ebenfalls mit einer Neigung (relativ zur X-Achse). Entsprechend kann ich mit der Neigung der Form einen Vektor erstellen, der genau parallel zur Kante DB der Form durch den Mittelpunkt M verläuft. Wenn ich die Länge dieses Vektors entsprechend der halben Kantenlänge von AC wähle und den Vektor anschließend um 90 ° im Uhrzeigersinn drehe (die Klasse Vector2D stellt eine entsprechende Methode zur Verfügung), zeigt die Spitze des Vektors auf Punkt A.

Wenn ich die Werte entsprechend der benötigten Kantenlängen und der notwendigen Rotationen anpasse, komme ich mit dem gleichen Verfahren auch auf die anderen Punkte.

Ellipse.png

[EDIT:]

Ist mir persönlich so jedenfalls zu viel Rätsel raten was gemeint sein könnte um da noch weiter mit einzusteigen.

Schade. Aber ist natürlich auch immer schwierig in zwei Sätzen zu erklären, wenn ich mich seit 3 Tagen einarbeite. Danke dir trotzdem fürs Mitdenken.

[EDIT 2:]
Inzwischen bin ich mit den geforderten Formen (Ellipse, Kreis, Rechteck, Quadrat) auf die gleiche Art und Weise wie hier beschrieben fertig und bekomme auch überall den erwünschten Output (wir haben eine Musterausgabe der mitgelieferten Testerklasse zur Verfügung gestellt bekommen).
Nun ist in der Aufgabenstellung davon die Rede, dass wir am Besten die bestehende Testerklasse noch erweitern sollten, weil bewusst noch nicht alle Stolperfallen abgedeckt sind. Mir sind allerdings jetzt so bei der Bearbeitung keine Stolperfallen aufgefallen, die ich für gefährlich halten würde :unknown: Hat da vielleicht noch jemand einen Tipp?
 
Zuletzt bearbeitet:
Oben