Ergebnis 1 bis 7 von 7

Thema: Programmieraufgabe Berechnung eines Rechtecks

  1. #1
    Brillenschlange Avatar von Kenobi van Gin
    Registriert seit
    Jul 2013
    Ort
    .\
    Beiträge
    3.487
    ngb:news Artikel
    1

    Programmieraufgabe Berechnung eines Rechtecks

    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

    Die für die Klasse Rectangle vorgeschriebenen Methoden:

    Spoiler: 

    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:

    Spoiler: 

    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!

  2. #2
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.369
    ngb:news Artikel
    2

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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.
    Für diesen Beitrag bedanken sich Jester, Kenobi van Gin, MingsPing
    Geändert von BurnerR (29.12.19 um 12:24 Uhr)

  3. #3
    Brillenschlange

    (Threadstarter)

    Avatar von Kenobi van Gin
    Registriert seit
    Jul 2013
    Ort
    .\
    Beiträge
    3.487
    ngb:news Artikel
    1

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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:

    Code (Java):
    1. public Point2D pointA() {
    2.     return new Vector2D(origin(), height / 2, angle()).rotate(270).tip;
    3. }
    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.

  4. #4
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.369
    ngb:news Artikel
    2

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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.

  5. #5
    Brillenschlange

    (Threadstarter)

    Avatar von Kenobi van Gin
    Registriert seit
    Jul 2013
    Ort
    .\
    Beiträge
    3.487
    ngb:news Artikel
    1

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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.

    Zitat Zitat von BurnerR Beitrag anzeigen
    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.

  6. #6
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.369
    ngb:news Artikel
    2

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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.
    Geändert von BurnerR (29.12.19 um 17:37 Uhr)

  7. #7
    Brillenschlange

    (Threadstarter)

    Avatar von Kenobi van Gin
    Registriert seit
    Jul 2013
    Ort
    .\
    Beiträge
    3.487
    ngb:news Artikel
    1

    Re: Programmieraufgabe Berechnung eines Rechtecks

    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.

    Klicke auf die Grafik für eine größere Ansicht 

Name:	Ellipse.png 
Hits:	5 
Größe:	10,6 KB 
ID:	55851

    [EDIT:]

    Zitat Zitat von BurnerR Beitrag anzeigen
    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 Hat da vielleicht noch jemand einen Tipp?
    Für diesen Beitrag bedankt sich BurnerR
    Geändert von Kenobi van Gin (29.12.19 um 17:49 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •