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 unterscheidetich 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 vorgegebenx2 = x + breitecos(winkel) sollte einigermassen richtig sein
y2 = y + breitesin(winkel)aber 3 und 4 sind nicht so gut
x3 = x + breitecos(90+winkel)
y3 = y + hoehesin(90+winkel)x4 = x + breitecos(winkel)
y4 = y + hoehesin(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 vorgegebenx2 = x + breitecos(winkel) sollte einigermassen richtig sein
y2 = y + breitesin(winkel)//bis hier unverändert
x3 = x + hoehecos(90+winkel) //hoehe statt breite!
y3 = y + hoehesin(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 klappenedit: 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 werden1 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 drinmein 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.pngund mutliplizierst deinen vector damit
http://upload.wikimedia.org/math/5/6/f/56f08ee8ecbbda816133307693885245.pngausmultipliziert 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.pngAllerding 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