Koordinatentransformation

Diskutiere Koordinatentransformation im Plauderecke Forum; Heili, heilö, ich weiß nicht wohin mit dem Thema, also stelle ich es einfach mal in die Plauderecke rein :) Es geht um das Thema Transformation...

  1. bloebb
    bloebb Neues Mitglied
    Heili, heilö,

    ich weiß nicht wohin mit dem Thema, also stelle ich es einfach mal in die Plauderecke rein :)

    Es geht um das Thema Transformation von Koordinatensystemen.

    Es gibt die unterschiedlichsten Arten, z. B. das kartesische Koordinatensystem, das 2dimensionale (planare) Polarkoordinatensystem, Kugelkoordinatensystem, Zylinderkoordinatensystem, ... Und die Basisvektoren eines jedes dieser Systeme kann man in die Basisvektoren eines anderen Systems transformieren. D. h. man hat eine n:m-Beziehung.

    Ich bin mal so lustig und mache ein Beispiel:

    System 1 ist ein 3dimensionales kartesisches Koordinatensystem. Die Basisvektoren sind immer:
    e1 = (1, 0, 0) in Richtung x-Achse
    e2 = (0, 1, 0) in Richtung y-Achse
    e3 = (0, 0, 1) in Richtung z-Achse
    Das System ist ein orthonormales System, also müssen alle Basisvektoren Einheitsvektoren sein, außerdem müssen sie alle normal aufeinander stehen.

    System 2 ist ein Kugelkoordinatensystem. Im Gegensatz zu einem kartesischen Koordinatensystem hängen die Basisvektoren von einem Raumpunkt ab. Zu jedem Raumpunkt gibt es ein spezielles Koordinatensystem.
    g1 = Normalvektor; zeigt radial nach außen
    g2 = Tangentialvektor; zeigt tangential nach unten (abhängig vom Winkel theta - runter von der karthesischen z-Achse)
    g3 = Tangentialvektor; zeigt tangential nach hinten (abhängig vom Wingel phi - auf der karthesischen xy-Ebene)
    Das System ist orthogonal, die Vektoren müssen nicht alle zwangsläufig Einheitsvektoren sein, allerdings stehen sie normal aufeinander.

    Für die Umrechnungen benötigte Formeln:
    x1 = x = r * sin(theta) * cos(phi)
    x2 = y = r * sin(theta) * sin(phi)
    x3 = z = r * cos(theta)
    bzw umgekehrt:
    q1 = r = sqrt(x^2 + y^2 + z^2)
    q2 = theta = ... schießmichtot ...
    q3 = phi = arctan(y/x)

    Für die Umformung benötigte Formel:
    gi = @x1/@qi * e1 + @x2/@qi * e2 + @x3/@qi * e3
    mit i = 1 ... 3
    Das sind also 3 partielle Ableitungen. Für alle 3 Basisvektoren hat man also 3 solche Formeln. Insgesamt also 3x3=9 partielle Ableitungen, die man dann in eine Matrix reinstopfen kann:
    (
    (1, 0, 0),
    (0, r^2, 0),
    (0, 0, r^2 * sin^2(theta)
    )
    Soviel zum Thema Mathe.

    Jetzt meine Frage: wie würdet ihr so eine m:n-Beziehung am besten objektorientiert programmieren?
     
    Zuletzt bearbeitet: 13. Nov. 2017
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. bloebb
    bloebb Neues Mitglied
    Es gibt auf jeden Fall zu jedem Koordinatensystem eine eigene Klasse. Ev. können die noch von einer abstrakten Klasse erben oder ein Interface implementieren, damit man sieht, diese Dinger haben irgendetwas gemein.

    Zu meinem Beispiel:

    class CartesianCoordSys {
    private x: double
    private y: double
    private z: double
    public double getX() { .. }
    public double getY() { ... }
    public double getZ() { ... }
    }

    class SphericalCoordSys {
    private r: double
    private theta: double
    private phi: double
    }
     
    Zuletzt bearbeitet: 13. Nov. 2017
  4. bloebb
    bloebb Neues Mitglied
    Dann muss es vermutlich noch eine Matrix-Klasse geben:

    class Matrix {
    private double[][] v
    public Matrix {
    this.v = new double[3][3]
    }
    public void set(int i, int j, double v) {
    this.v[j] = v
    }
    public double get(int i, int j) {
    return this.v[j]
    }
    }
     
  5. bloebb
    bloebb Neues Mitglied
    Wie gehts jetzt weiter?

    Wo definiere ich die Transformationsmatrix?
    Wo führe ich die Transformation der Basisvektoren durch?

    Nachdem das eine n:m-Beziehung ist, soll ich dann für diese beiden Sachen eine eigene Klasse definieren?

    Gibt es für solche Problemstellungen ev. ein Design-Pattern?
     
  6. mrBrown
    mrBrown Bekanntes Mitglied
    Entweder für jedes System gibt es Methoden, die in jedes andere System konvertiert, etwa so wie TimeUnit, oder es gibt ein „Grundsystem“, und jedes andere kann in dieses und aus diesem konvertiert werden.

    Beide Möglichkeiten kann man entweder mit Methoden in den Systemen selber oder mit extra Konvertern umsetzen, oder auch Mischung aus beidem.
     
  7. bloebb
    bloebb Neues Mitglied
    Hört sich übel an.

    Angenommen, ich habe bereits 4 unterschiedliche Typen von Koordinatensystemen, und jetzt kommt ein 5ter Typ hinzu. Dann müsste ich alle anderen 4 Klassen umschreiben.

    Das sollte man nicht machen. Wenn ein Ding erst mal getestet ist, sollte man es möglichst nicht mehr anrühren. Und in diesem Fall wäre es ganz übel, da man immer ALLE Klassen überarbeiten müsste, wenn ein neues System hinzukommt.
     
  8. mrBrown
    mrBrown Bekanntes Mitglied
    Die Einwände sind mir alle bekannt, ich hab auch nicht gesagt, dass es die ideale Variante ist oder das es alle möglichen Umsetzungen sind ;)

    Aber wenn die dir Vor- und Nachteile der verschiedenen Varianten bekannt sind, wie wäre denn dein Vorschlag?


    BTW:
    Andersrum: wenn es getestet ist, kann man es problemlos anrühren.
     
  9. bloebb
    bloebb Neues Mitglied
    Naja, ich glaube, das würde mehr so in die prozedurale Programmierung gehen, wenn man die Koordinatensystemeklassen alle immer nur ein einziges mal definiert, und sie dann für immer und ewig unangetastet lässt, dafür aber je Konvertierung eine eigene zusätzliche Klasse definiert. Und der Methode dieser Klasse übergibt man dann jene beiden Koordinatensystemeobjekte, zwischen denen man konvertieren möchte.

    class CartesianSphericalConverter {
    public ??? convert(CartesianCoordSys from, SphericalCoordSys to) {
    }
    }

    Irgendwie in diese Richtung vielleicht. Dann würden diese Converterklasse ev. auch wieder alle von einer abstrakten Klasse erben oder eine gemeinsame Schnittstelle implementieren.

    Aber das schaut mir nicht nach einem typischen objektorientierten Programmierstil aus, oder? Der Vorteil aber wäre natürlich, dass einmal definierte Klassen nicht mehr umgeändert werden müssten.
     
  10. mrBrown
    mrBrown Bekanntes Mitglied
    Wenn es für alle Objekte gibt, ist’s doch Objektorientiert? ;)


    Warum sollte denn der Converter beide Systeme bekommen?
    Reicht es nicht, dass er das alte bekommt, und das neue zurückgibt?

    Ergänzt sich dann auch wunderbar mit dem Strategiepattern.

    Wie denn jetzt? Ist das nicht mehr anfassen gut oder schlecht? :p
     
  11. bloebb
    bloebb Neues Mitglied
    Ja, ich glaube es läuft wirklich auf eigene Converter-Klassen hinaus, die das Strategy-Pattern implementieren.
     
Die Seite wird geladen...

Koordinatentransformation - Ähnliche Themen

Koordinatentransformationen
Koordinatentransformationen im Forum Spiele- und Multimedia-Programmierung
Koordinatentransformation
Koordinatentransformation im Forum Mathematik
Kreis auf Linie platzieren (-> Koordinatentransformation?)
Kreis auf Linie platzieren (-> Koordinatentransformation?) im Forum Spiele- und Multimedia-Programmierung
Thema: Koordinatentransformation