Rechteck dreht sich um einen eckpunkt



  • hi leute

    ich hab ein kleines problem
    ich hab die ursprungs koordinaten eines rechtecks gegeben (x1, y1)
    die breite und die hoehe
    und den winkel den es sich von einem normalen graden rechteck unterscheidet

    ich brauche aber alle 4 eckpunkte
    (x1,x2)<- gegeben
    (x2,y2) (x3,y3) (x4,y4)

    ich dachte mir das vorerst so

    x1 = x
    y1 = y das ist vorgegeben

    x2 = x + breitecos(winkel) sollte einigermassen richtig sein
    y2 = y + breite
    sin(winkel)

    aber 3 und 4 sind nicht so gut

    x3 = x + breitecos(90+winkel)
    y3 = y + hoehe
    sin(90+winkel)

    x4 = x + breitecos(winkel)
    y4 = y + hoehe
    sin(90+winkel)

    (hab mit grad gerechnet, nicht mit bogenmass oder diesem neuen graddingens)

    1   breite    2
     x----------x
     |          |
     |          | hoehe
     |          |
     |          |
     x----------x
    3            4
    

    ich hoffe ihr könnt mir helfen



  • 1      breite       2
     x-----------------x
     |                 |
     |                 | hoehe
     |                 |
     x-----------------x
    3                   4
    

    hmm. irgendwie müßte 2 und 3 aber so gehen.

    x1 = x
    y1 = y das ist vorgegeben

    x2 = x + breitecos(winkel) sollte einigermassen richtig sein
    y2 = y + breite
    sin(winkel)

    //bis hier unverändert

    x3 = x + hoehecos(90+winkel) //hoehe statt breite!
    y3 = y + hoehe
    sin(90+winkel)

    und x4 stückle ich dann zusammen aus den offsets von punk3 und punkt2

    x4 = x + breite*cos(winkel) + hoehe*cos(90+winkel)
    y4 = y + breite*sin(winkel) + hoehe*sin(90+winkel)

    (hab mit grad gerechnet, nicht mit bogenmass oder diesem neuen graddingens)

    gute idee. mit bogenmaß wäre ich noch durcheinanderer geworden.

    #define sin(x) sin((x)/180*3.1415926535897932384626433832795)
    #define cos(x) cos((x)/180*3.1415926535897932384626433832795)
    


  • mh es geht um java
    also nix mit define -.-
    aber da gibts ja auch funktionen dafür...

    also so ganz klappts noch nicht
    bei 0 grad hab ich ein tolles rechteck da, ist auch gut so
    aber bei allen anderen nicht...

    doof wenn man sowas noch nicht kann in der 12 klasse -.-'



  • ach mist
    ich hab die datentypen vergessen anzupassen
    der wandelt sofort das ergebnis vom sin/cos in int um... 0.7 wird dann zu 0 -.-
    ok das muss ändern dann sollte es eig klappen

    edit: klappt immer noch nicht so ganz

    this.X[0] = x;
    this.Y[0] = y;
    
    this.X[1] = x+(int)(breite*(Math.cos(Math.toRadians(winkel))));
    this.Y[1] = y+(int)(hoehe*(Math.sin(Math.toRadians(winkel))));
    
    this.X[2] = x+(int)(breite*(Math.cos(Math.toRadians(winkel))))+(int)(hoehe*(Math.cos(Math.toRadians(90+winkel))));
    this.Y[2] = y+(int)(breite*(Math.sin(Math.toRadians(winkel)))+(int)(hoehe*Math.sin(Math.toRadians(90+winkel))));
    
    this.X[3] = x+(int)(hoehe*(Math.cos(Math.toRadians(90+winkel))));
    this.Y[3] = y+(int)(hoehe*(Math.sin(Math.toRadians(90+winkel))));
    

    das ist der code, einziger unterschied: das letzte element ist der punkt 3
    da es als polygon gezeichnet wird und die punkte reihum übergeben werden

    1   breite    2
     x----------x
     |          |
     |          | hoehe
     |          |
     |          |
     x----------x
    4            3
    


  • du solltest das ganze vereinheitlichen.
    Das ganze ist eine koordinatentransformation.
    Wenn du diese als Rotation+Translation vereinhetlichst, kannst du das gazne immer wieder verwendenund beliebig viele Punkte durch jagen,

    Rotation ist eine multiplikation eines Punktes mir der Rotationsmatrix:
    http://de.wikipedia.org/wiki/Rotationsmatrix
    Die Translationist einfach nur eine Verschiebung, dh. Addition eines Vektors.
    Achtung Reiehnfolge ist wichtig!



  • mh ich hab hier ein buch über spieleprogrammierung mit directx und c++
    da ist auch ein teil mathe und so drinne
    von wegen rotationsmatrix stand da auch was drin

    mein grösstes problem ist dass ich von matrizen und vektoren keinerlei plan hab
    wenns nach mir gehen würde würden wir das in der schule machen aber der lehrer will ja nicht...

    naja und so beim ersten überfliegen des wikipedia artikels versteh ich auch nur bahnhof
    wobei wikipedia in sachen mathe/physik nicht die einfachste quelle ist



  • für den zweidimensionalen Fall ist es doch einfach.
    du nimmst die rotationsmatrix R
    http://upload.wikimedia.org/math/1/5/3/1533d3dc106bbe59a301da72060a7f26.png

    und mutliplizierst deinen vector damit
    http://upload.wikimedia.org/math/5/6/f/56f08ee8ecbbda816133307693885245.png

    ausmultipliziert sieht das ganze so aus:
    http://upload.wikimedia.org/math/7/f/2/7f2e3789ae26c7a33a406a6fcbe08bbb.png
    und
    http://upload.wikimedia.org/math/8/e/4/8e4f579190d120c7e375cbf8c29d258b.png

    Allerding ist es besser du baust (oder nimmst dir irgendwoher) eine Matrix und Vector Implementierung, die das schon kann, dann bleibt dir diese ganze erspart und du brauchst nur noch wissen dass p2 = R*p1 ist (unabhängig davon, wieviel dimensionen dein Raum grad hat).

    Edit:
    wennd dus selber baust, hast du hinterher ahnung davon.
    Vailidieren kannst du deine Funktionen ja mit Octave oder Maxima.

    BTW:
    Kennt denn jemand eine wirklich gute, freie Matrix und Vectorimplementierung für c++?
    Sollte natürlich die Basisoperatoren beherrschen.
    Nett wären auch noch ein paar Basisalgorithmen dafür.



  • mh

    ich hab mal eine klasse für vektoren geschrieben, basierend auf einem tutorial, hab das auch noch hier rumfliegen
    ich glaub ich guck gleich einfach mal rein...

    ich guck mir mal die bilder an und dann seh ich weiter

    edit:
    mh so ohne hilfe kann ich mit dem vektor matrix kram nichts anfangen



  • fu

    ich habs jetzt endlich raus nach dem mir das zeugs mit der rotationsmatrix erklärt wurde

    winkel = Math.toRadians(winkel);
    
    this.X[0] = x;
    this.Y[0] = y;
    
    this.X[1] = x+(int)(breite*Math.cos(winkel));
    this.Y[1] = y+(int)(breite*Math.sin(winkel));
    
    this.X[2] = x+ (int)(breite*Math.cos(winkel)) - (int)(hoehe*Math.sin(winkel));
    this.Y[2] = y+ (int)(hoehe*Math.cos(winkel)) + (int)(breite*Math.sin(winkel));
    
    this.X[3] = x-(int)(hoehe*Math.sin(winkel));
    this.Y[3] = y+(int)(hoehe*Math.cos(winkel));
    

    für alle dies interessiert


Anmelden zum Antworten