Vektoren nach Winkeln berechnen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

M0rgenstern

Betreff: Vektoren nach Winkeln berechnen?

BeitragMi, Apr 28, 2010 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.
Ich hab ein Problem, das eigentlich rein mathematischer Natur ist.
Ich hab zur Aunschauung mal folgende Grafik hochgeladen:

user posted image

Das braune Dreieck richtet sich immer nach dem blauen Viereck aus.
Das blaue Viereck ist immer in einer geraden Linie zum Dreieck und immer genau in der Mitte der beiden Kreise (Jedenfalls von der x- Koordinate, y kann variieren, tut aber nichts zur Sache).
Die beiden Kreise sind durch Vektoren abhängig von dem Dreieck verschoben.
Gibt es eine Möglichkeit, die Kreise mitzudrehen, abhängig von der Drehung des Dreiecks, aber mit gleicher Verschiebung, also mit gleichem Abstand zwischen den Kreisen und dem Dreieck.

Ich hoffe, dass es verständlich ist, was ich meine.

Gibt es eine Lösung dafür, jedesmal die Verschiebungsvektoren zu berechnen?

Lg, M0rgenstern

Goodjee

BeitragMi, Apr 28, 2010 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
sollte mit rotationsmatrizen gehn:

user posted image

http://de.wikipedia.org/wiki/Drehmatrix

Code: [AUSKLAPPEN]
'beispiel
rotierteverschiebungx=cos(45)*verschiebungx-sin(45)*verschiebungy
rotierteverschiebungy=sin(45)*verschiebungx+cos(45)*verschiebungy

Xeres

Moderator

BeitragMi, Apr 28, 2010 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Vektoren, aber vielleicht ist es doch Hilfreich:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Graphics(800, 600)
Local w:Int = 0, r:Int = 100, dif:Int = -45

Repeat
Cls

If KeyDown(KEY_LEFT) Then w = (w + 1 + 360) Mod 360
If KeyDown(KEY_RIGHT) Then w = (w - 1 + 360) Mod 360
If KeyDown(KEY_UP) Then dif = (dif + 1 + 360) Mod 360
If KeyDown(KEY_DOWN) Then dif = (dif - 1 + 360) Mod 360

rem
Die Position wird mit einem relativen Winkel zur
Eigendrehung des Parent-Objekts fest gelegt.
endrem

Local x:Int = r * Cos(w + dif)
Local y:Int = r * -Sin(w + dif)

DrawOval(400 - 40, 300 - 40, 80, 80)
DrawLine(400, 300, 400 + 500 * Cos(w), 300 + 500 * -Sin(w))
DrawOval(400 - 20 + x, 300 - 20 + y, 40, 40)

Flip
Until KeyHit(KEY_ESCAPE)
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragMi, Apr 28, 2010 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Goodjee, vielen Dank.
Das ist genau das, was ich gesucht habe. Danke.

@ Xeres:
Vielen Dank, ist lieb gemeint, aber ich brauche Vektoren unbedingt.
Ich geh die Verschiebungsvektoren (Schenkel des Dreiecks) einzeln durch um jede Koordinate auf den einzelnen Schenkeln zu erhalten.
Es geht darum, einen "Lichtkegel" zu werfen, also eigentlich einen Sichtbereich. Das ganze hab ich mir schon komplett ausgerechnet etc, nur an diesem Punkt bin ich dann doch gescheitert.

Lg, M0rgenstern

EDIT:

Also, ich muss zugeben, dass das ganze jetzt ein informatisches Problem wird^^.

Hab das ganze jetzt mal in Code umgesetzt, aber das will einfach nicht funktionieren.
Ab und zu, jenachdem wie ich das Dreieck drehe, sieht man einige hellere Stellen aber nicht so wie es sein sollte und auch nicht da wo es sein sollte.

Ich hab hier mal den Code:

BlitzMax: [AUSKLAPPEN]
fAngle = ATan2(fPlayerx - MouseX() , MouseY() - fPLayery)

Local fRotVRx:Float = Cos(fangle) * fvrx - Sin(fangle) * fvry
Local fRotVRy:Float = Sin(fangle) * fvrx + Cos(fangle) * fvry

Local fRotVLx:Float = Cos(fangle) * fvlx - Sin(fangle) * fvly
Local fRotVLy:Float = Sin(fangle) * fvlx + Cos(fangle) * fvly

fNx = fPlayerx - fRotVRx
fNy = fPLayery - fRotVRy

fQx = fPlayerx - fRotVLx
fQy = fPLayery - fRotVLy


For Local iMapXIndex:Int = 0 Until iMapwidth
For Local iMapYIndex:Int = 0 Until iMapheight
SetColor iRedColor, iBlueColor, iGreenColor
For Local fPart:Float = 0 To 1 Step 0.1
Local fRVPartx:Float = fpart * fRotVRx + fplayerx
Local fRVParty:Float = fpart * fRotVRy + fplayery
Local fLVPartx:Float = fpart * frotvlx + fplayerx
Local fLVParty:Float = fpart * frotvly + fplayery

Local fTilex:Float = iMapXIndex * iTilesize + iTilesize / 2
Local fTiley:Float = iMapYIndex * iTilesize + iTilesize / 2

If (fTilex <= fRVPartx) And (fTilex >= fLVPartx) And (fTiley <= fNy) And(fTiley >= fPLayery) Then
SetColor 250, 250, 250

DrawImage(tiTiles, fTilex, fTiley, iGameMap2[iMapXIndex, iMapYIndex])
EndIf
Next
SetColor 255, 255, 255
Next
Next


Was ich im Prinzip mache, ist die ganze Länge des Vektors abzuklappern und zu überprüfen ob das Tile innerhalb des Dreiecks liegt.
Jedenfalls sollte es das tun.

Tuts leider nicht.

Vielleicht sieht ja jemand von euch meinen Fehler.

Lg, M0rgenstern

M0rgenstern

BeitragDo, Apr 29, 2010 8:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für den Doppelpost, aber:
Ich glaube, den Fehler gefunden zu haben.
Ich muss diese Überprüfung:
BlitzMax: [AUSKLAPPEN]
If (fTilex <= fRVPartx) And (fTilex >= fLVPartx) And (fTiley <= fNy) And(fTiley >= fPLayery) Then


Wahrscheinlich so umschreiben:
BlitzMax: [AUSKLAPPEN]
If (fTilex <= fRVPartx) And (fTilex >= fLVPartx) And (fTilex <= fnx) And (ftilex >= fqx) Then
If (fTiley >= fPLayery) And (fTiley <= fqy) And (fTilex <= fnx) And (ftilex >= fqx) Then


Aber ich bin mir nicht ganz sicher.
Weiß jemand von euch vielleicht die Lösung?

EDIT:

Okay, ich mach das ganze jetzt anders, aber das funktioniert nicht so recht.
Also, ich hab jetzt ein Dreieck, das sich auch mit dem Spieler dreht.
Jetzt will ich jede Koordinate in diesem Dreieck ansprechen.
Das mach ich mit zwei For Schleifen, aber irgendwas stimmt bei meiner Berechnung nicht.
Kann mir vielleicht jemand helfen?
Ist echt dringend.

Hier der Code:

BlitzMax: [AUSKLAPPEN]
While Not KeyHit(KEY_ESCAPE) Or AppTerminate()
WaitTimer(FTimer)
Cls


'Die Drehung berechnen:
fAngle = ATan2(fPlayerx - MouseX() , MouseY() - fPLayery)


Local fRotVRx:Float = Cos(fangle) * fvrx - Sin(fangle) * fvry
Local fRotVRy:Float = Sin(fangle) * fvrx + Cos(fangle) * fvry

Local fRotVLx:Float = Cos(fangle) * fvlx - Sin(fangle) * fvly
Local fRotVLy:Float = Sin(fangle) * fvlx + Cos(fangle) * fvly

'Die Punkte durch Vektoren berechnen:
fNx = fPlayerx - fRotVRx
fNy = fPLayery - fRotVRy

fQx = fPlayerx - fRotVLx
fQy = fPLayery - fRotVLy


For Local iMapXIndex:Int = 0 Until iMapwidth
For Local iMapYIndex:Int = 0 Until iMapheight
SetColor iRedColor, iBlueColor, iGreenColor

'Koordinate des Tiles berechnen:
Local fTilex:Float = iMapXIndex * iTilesize + iTilesize / 2
Local fTiley:Float = iMapYIndex * iTilesize + iTilesize / 2

'Hier sollten die einzelnen Vektoren zerlegt und miteinander verrechnet werden, klappt nur leider nicht.
'Bekomme nur seltsame Muster

For Local fPart1:Float = 0 To 1 Step 0.1
For Local fPart2:Float = 0 To 1 Step 0.1

Local fVPartx:Float = fpart1 * (fPlayerx + fRotVRx) + fpart2 * (fPlayerx + fRotVLx)
Local fVParty:Float = fpart1 * (fPlayery + fRotVLy) + fpart2 * (fPLayery + fRotVLy)

SetColor 250, 250, 250
Plot fVPartx, fVParty
SetColor iRedColor, iBlueColor, iGreenColor

If (fTilex = fVPartx) And (fTiley = fVParty) Then
SetColor 250, 250, 250
EndIf
Next
Next

DrawImage(tiTiles, fTilex, fTiley, iGameMap2[iMapXIndex, iMapYIndex])

SetColor 255, 255, 255
Next
Next



Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group