Koordinaten von Eckpunkten mit Rotation berechnen (Rechteck)

  • Hi,

    Ich habe ein Rechteck, mit einer Rotation (Mittelpunkt links obere Ecke). Ich kenne die Rotation, sowie auch die Position.
    Wie sollte ich jetzt am Besten die Position von den Eckpunkten des Rechtecks berechnen?

    Bin noch Schüler und in Mathe nicht der Beste [Blockierte Grafik: http://www.xnamag.de/forum/images/smiles/icon_smile.gif
    Hoffe jemand kann helfen!

    Mfg V8II

    2 Mal editiert, zuletzt von V8II (11. April 2012 um 16:24)

  • Ich bin mir nicht ganz sicher wie du das meinst.. Willst du ein Rechteck um einen Punkt rotieren lassen?
    Das würde mit einer Rotationsmatrix gehen.

    Spoiler anzeigen
    [autoit]

    Global Const $nDegToRad = ACos(-1) / 180
    $nDegree = 45 ; Winkel in Grad
    $nX_Rot = 0 ;Rotationspunkt - X_Koordinate
    $nY_Rot = 0 ;Rotationspunkt - Y_Koordinate

    [/autoit] [autoit][/autoit] [autoit]

    $nAngle = $nDegree * $nDegToRad ; Umrechnung in Radiant

    [/autoit] [autoit][/autoit] [autoit]

    $nX_Old = 10 ;Alter Punkt - X_Koordinate
    $nY_Old = 5 ;Alter Punkt - Y_Koordinate

    [/autoit] [autoit][/autoit] [autoit]

    $nX_New = Cos($nAngle) * ($nX_Old - $nX_Rot) - Sin($nAngle) * ($nY_Old - $nY_Rot) + $nX_Rot
    $nY_New = Sin($nAngle) * ($nX_Old - $nX_Rot) + Cos($nAngle) * ($nY_Old - $nY_Rot) + $nY_Rot

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($nX_Old & " : " & $nY_Old & @CRLF & $nX_New & " : " & $nY_New & @CRLF)

    [/autoit]


    Oder das ganze als Funktion:

    Spoiler anzeigen
    [autoit]

    Func _Rotate2DPoint($nX_Old, $nY_Old, $nAlpha, $nX_Rot = 0, $nY_Rot = 0)
    ; -Author: name22 (http://www.autoit.de)
    Local $aPointNew[2]
    $aPointNew[0] = Cos($nAlpha) * ($nX_Old - $nX_Rot) - Sin($nAlpha) * ($nY_Old - $nY_Rot) + $nX_Rot
    $aPointNew[1] = Sin($nAlpha) * ($nX_Old - $nX_Rot) + Cos($nAlpha) * ($nY_Old - $nY_Rot) + $nY_Rot
    Return $aPointNew
    EndFunc

    [/autoit]


    Du müsstest dann nur noch alle Punkte des Rechtecks um dessen Mittelpunkt rotieren lassen. Die 4 Punkte des originalen Rechtecks zu berechnen sollte ja nicht allzu schwer sein (jenachdem welche Daten du von dem Rechteck hast) ;).

  • Kannst du näher definieren, was ein Rechteck mit einer bestimmten Rotation und Position ist?

    Denn, wenn du die Rotation und auch die Position kennst, solltest du doch die Eckpunkte auch kennen!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ah, ich sollte erwähnen, dass sich das Rechteck in einem Koordinatensystem befindet und ich die Position der Links oberen Ecke kenne. Ich kenne auch die Längen der Seiten.

  • Wie wäre es, wenn du mal mit ein paar konkreten Zahlen rausrückst, die du hast. Ansonsten ist es ohne Glaskugel schwer zu erraten, was du genau willst.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Zitat

    Ah, ich sollte erwähnen, dass sich das Rechteck in einem Koordinatensystem befindet und ich die Position der Links oberen Ecke kenne. Ich kenne auch die Längen der Seiten.


    Ja, das hättest du eventuell erwähnen sollen... :rolleyes:
    Das heißt, du hast den linken oberen Punkt, die Seitenlängen und einen bestimmten Winkel. Die Kanten des Rechtecks sind normalerweise parallel zu den Koordinatenachsen, und wurde in diesem bestimmten Winkel rotiert. Aber wo liegt der Rotationspunkt? Im Ursprung des Koordinatensystems? Im linken oberen Punkt des Rechtecks? In dessen Mitte?
    Du musst uns schon alle relevanten Informationen geben ^^.

  • Hier ein Beispiel:
    http://www.imagebanana.com/view/jqfckqvm/rechteck.png

    Ich kenne die Koordinaten vom rot makierten Punkt (Beispiel : 8/5) und ich weiß um wie viel Grad das Rechteck um den roten Punkt rotiert wurde. Die Seitenlängen des Rechtecks sind auch bekannt.

    Jetzt möchte ich die Koordinaten von den anderen vier Eckpunkten errechnen.

    Einmal editiert, zuletzt von V8II (11. April 2012 um 15:56)

  • Ich würde es mit Vektoren lösen, wobei ich persönlich erst mal ein "Refresh" bzgl. Vektorrechnung benötige und das kann dauern...

    Vielleicht sind die Schüler und Studenten hier Up2Date.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Dein Bild kann ich nicht angucken, aber ich bin mir ziemlich sicher, dass ich weiß was du meinst. Handelt es sich bei dem ganzen überhaupt um ein AutoIt Problem, oder machen wir hier nur dein Hausaufgaben? ^^
    Eine Möglichkeit das ganze zu machen wäre, die Punkte des Rechtecks zu berechnen die es ohne Rotation hätte.
    Also:

    Code
    D - C
    |   |
    A - B

    Dann einfach immer die Höhe/Breite zu den Koordinaten der Punkte dazuaddieren bis du alle Punkte hast.
    Cx = Dx + Breite
    Cy = Dy
    Ax = Dx
    Ay = Dy + Höhe
    Bx = Cx (Dx + Breite)
    By = Ay (Dy + Höhe)
    Dann kannst du die 3 berechneten Punkte (C, A, B) durch meine Funktion jagen (mit dem ersten Punkt "D" als Rotationspunkt und dem Winkel Alpha (z.B. 30°)), und dann hättest du die Punkte.
    Man könnte das ganze auch direkter lösen, aber so wäre das recht allgemein und überschaubar. Wenn dir die paar zusätzlichen Millisekunden nichts ausmachen, funktioniert das aber auch so.

  • Nein ihr macht nicht meine Hausaufgaben :rofl:
    Das ganze ist ein C#-XNA-Spiel.
    An deine Theorie habe ich auch schon gedacht, aber ich glaube das wird etwas rechenintensiv ...

    Ich arbeite nämlich an einem Side-Scoll Spiel, das Rechteck ist im Grunde die Waffe. Jetzt habe ich eine Animations-Klasse eingefügt, die auch rotation unterstützt...
    Um zu prüfen ob ein Schlag einen Gegner trifft wollte ich ursprünglich ALLE Gegner auf der Map durchgehen und ihre Position checken ... was bei größeren Maps mir dann etwas zu lange gedauert hat (ich bin ja nicht der einzige der herumfuchtelt :D). Da die Welt aus Blöcken besteht habe ich einfach ein 2D-Array erstellt, quasi ein "Feld" für jeden Block. Wenn man jetzt schlägt, wird der mögliche Schaden in das Fach eingetragen an dem sich das Schwert gerade befindet, und bei anderen Spielern muss einfach nur geschaut werden, ob bei ihrem aktuellen Fach Schaden drinsteht ...
    Im großen und ganzen hat das die Performance total entlastet ... ich muss jetzt nur berechnen bei welchem Fach die Spitze der Waffe ist...

    Hoffe ich habe es jetzt nicht zu schlecht erklärt :)

  • Zitat

    Das ganze ist ein C#-XNA-Spiel.


    Dann ist das wohl in Hilfe & Unterstützung auch nicht so richtig aufgehoben..

    Zitat

    ich muss jetzt nur berechnen bei welchem Fach die Spitze der Waffe ist...


    Brauchst du dazu wirklich ein Rechteck? Würde einfach ein Punkt an der Spitze der Waffer reichen?
    Dann würde ich einfach einen Vektor vom Ankerpunkt der Waffe zu ihrer Spitze konstruieren (also relativ zum Ankerpunkt, nicht zum Ursprung des KS).
    Diesen Vektor kannst du dann beliebig rotieren, indem du einfach eine Rotationsmatrix wie die in meiner Funktion darauf anwendest, ohne den Rotationspunkt. Den brauchst du ja dann nicht.
    Nach der Matrix Transformation addierst du den Vektor zu seinem Ankerpunkt und hast die Spitze der Waffe relativ zum KS.
    Das kannst du dann noch beschleunigen, indem du optimierte Funktionen verwendest, oder statt Sinus/Cosinus vorgerechnete Tabellen verwendest.

  • Zitat

    Dann ist das wohl in Hilfe & Unterstützung auch nicht so richtig aufgehoben..

    Ja ... die im C# Forum brauchen nur ewig :S

    Zitat

    Brauchst du dazu wirklich ein Rechteck? Würde einfach ein Punkt an der Spitze der Waffer reichen?

    Dann würde ich einfach einen Vektor vom Ankerpunkt der Waffe zu ihrer
    Spitze konstruieren (also relativ zum Ankerpunkt, nicht zum Ursprung des
    KS).

    Diesen Vektor kannst du dann beliebig rotieren, indem du einfach eine
    Rotationsmatrix wie die in meiner Funktion darauf anwendest, ohne den
    Rotationspunkt. Den brauchst du ja dann nicht.

    Nach der Matrix Transformation addierst du den Vektor zu seinem Ankerpunkt und hast die Spitze der Waffe relativ zum KS.

    Das kannst du dann noch beschleunigen, indem du optimierte Funktionen
    verwendest, oder statt Sinus/Cosinus vorgerechnete Tabellen verwendest.

    Stimmt eigentlich , das hätte mir auch einfallen sollen :whistling:
    Danke!