[GELÖST] Trigonometrie

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] Trigonometrie

BeitragMi, Jan 28, 2015 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

wahrscheinlich liegt die Lösung meines Problems auf der Hand, ich stehe allerdings total auf dem Schlauch: Ich habe drei Quadrate auf dem Bildschirm. Diese ergeben eine "Linie" (Dies sei hier nur zur Veranschaulichung erwähnt, die Quadrate sind wichtig - Es reicht nicht aus, die Linienstärke bei DrawLine() zu verändern Wink). Nun möchte ich, dass wenn ich die Rotation ändere, die gesamte Konstellation sich mit dreht. Folgenden Code habe ich bereits (Ist nur ein Test-Code) BlitzMax: [AUSKLAPPEN]
Function Test(rot:Double)
Local prevret:Float = GetRotation()
SetRotation(rot)
SetColor(255, 255, 255)

Local size:Int = 25, offset:Int = 100

' sin alpha = gegenkat / hyp
' gegenkat = hyp * sin alpha

' cos alpha = ankat / hyp
' ankat = hyp * cos alpha

DrawRect(offset, offset, size, size)

DrawRect(offset + 25 * Cos(rot), offset + 25 * Sin(rot), size, size)
DrawRect(offset + 50 * Cos(rot), offset + 50 * Sin(rot), size, size)

SetRotation(prevret)
End Function

Graphics(1600, 900)

Local momrot:Double = 0
Local fps:TTimer = CreateTimer(60)

Repeat
WaitTimer(fps)
Cls

If (KeyDown(KEY_LEFT))
momrot = momrot - 1
EndIf

If (KeyDown(KEY_RIGHT))
momrot = momrot + 1
EndIf

Test(momrot)

Flip 0
Until KeyHit(KEY_ESCAPE)
End
- Das funktioniert soweit:
user posted image

Ich möchte jetzt eine zweite Würfelreihe hinzufügen (Wieder der Hinweis: Auch die Vergrößerung der Höhe der Würfel auf das Doppelte ist nicht das gewünschte Ziel Wink)
Problem: Wo gebe ich genau X- und Y-Position der neuen Würfel an? - Ist die Verwendung der Sin() und Cos() Funktion - im Bezug auf die Trigonometrie - überhaupt richtig so, oder funktioniert das nur zufällig?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Do, Jan 29, 2015 18:24, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMi, Jan 28, 2015 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal: Niemand sieht, dass das überhaupt 3 Quadrate sind. Benutzt du zum debuggen keine unterschiedlichen Farben oder so?
- Bunte Quadrate
- Am besten hübsch in der Mitte des Bildschirms
- Magische Zahlen durch ein vielfaches von size ersetzen
BlitzMax: [AUSKLAPPEN]
SuperStrict

Function Test(rot:Double)
Local prevret:Float = GetRotation()
SetRotation(rot)
SetColor(255, 255, 255)

Local x:Int, y:Int, size:Int = 25 ', offset:Int = 100
Local offset_x:Int = gfx_w / 2
Local offset_y:Int = gfx_h / 2

' sin alpha = gegenkat / hyp
' gegenkat = hyp * sin alpha

' cos alpha = ankat / hyp
' ankat = hyp * cos alpha

SetColor(255, 255, 255)
DrawRect(offset_x, offset_y, size, size)

SetColor(0, 255, 0)
DrawRect(offset_x + (size) * Cos(rot), offset_y + (size) * Sin(rot), size, size)
SetColor(0, 0, 255)
DrawRect(offset_x + (size * 2) * Cos(rot), offset_y + (size * 2) * Sin(rot), size, size)

SetRotation(prevret)
End Function

Global gfx_w:Int = 800
Global gfx_h:Int = 600
Graphics(gfx_w, gfx_h)

Local momrot:Double = 0
Local fps:TTimer = CreateTimer(60)

Repeat
WaitTimer(fps)
Cls

If (KeyDown(KEY_LEFT))
momrot = momrot - 1
EndIf

If (KeyDown(KEY_RIGHT))
momrot = momrot + 1
EndIf

Test(momrot)

Flip 0
Until KeyHit(KEY_ESCAPE)
End


Das Problem: Die Drehung findet nicht in der Mitte des Quadrats statt, sondern an der linken, oberen Ecke. Mit SetHandle kann man das einfach korrigieren, nehme ich an. Dann ist auch kein Problem mehr, mit Sin/Cos die Positionen um das mittlere Quadrat zu errechnen.
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)

Holzchopf

Meisterpacker

BeitragMi, Jan 28, 2015 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich dich richtig verstehe, fehlt dir nur die Info, was mathematisch hinter den Koordinaten für die "zweite Reihe" steckt. Im Prinzip ist es eine Rotationsmatrix.

Das ganze lässt sich relativ einfach anwenden.
BlitzMax: [AUSKLAPPEN]
Function Test(rot:Double)
Local prevret:Float = GetRotation()
SetRotation(rot)
SetColor(255, 255, 255)

Local size:Int = 25, offset:Int = 100
' Position in Welt-Koordinaten
Local dx:Int, dy:Int
' Position in Bildschirm-Koordinaten
Local tx:Float, ty:Float

For Local y:Int = 0 To 2
For Local x:Int = 0 To 2
' zufällige Farbe generieren zwecks Debugging
SetColor(128, x*128, y*128)
' Verschiebung bestimmen
dx = x * size
dy = y * size
' Rotation anwenden
tx = Cos(rot) * dx - Sin(rot) * dy
ty = Sin(rot) * dx + Cos(rot) * dy
DrawRect(offset +tx, offset +ty, size, size)
Next
Next

SetRotation(prevret)
End Function

Graphics(800, 600)

Local momrot:Double = 0
Local fps:TTimer = CreateTimer(60)

Repeat
WaitTimer(fps)
Cls

If (KeyDown(KEY_LEFT))
momrot = momrot - 1
EndIf

If (KeyDown(KEY_RIGHT))
momrot = momrot + 1
EndIf

Test(momrot)

Flip 0
Until KeyHit(KEY_ESCAPE)
End


Einfach im Kopf behalten:
Code: [AUSKLAPPEN]
x' = x*cos - y*sin
y' = x*sin + y*cos

(Man stolpert häufiger drüber, als man Anfangs glaubt)

MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragDo, Jan 29, 2015 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für eure Antworten!

@ Xeres:
Zitat:
Benutzt du zum debuggen keine unterschiedlichen Farben oder so?
- Entschuldige, in Zukunft werde ich das machen. Wink

Zitat:
Die Drehung findet nicht in der Mitte des Quadrats statt, sondern an der linken, oberen Ecke.
- Nach Möglichkeit würde ich es gerne dabei belassen, dass oben links der "Anchorpunkt" ist. Müsste die Lösung des Problems nicht die selbe sein, egal wo dieser Punkt ist?

@ Holzchopf:
Zitat:
Einfach im Kopf behalten:
Code:
x' = x*cos - y*sin
y' = x*sin + y*cos
- Gespeichert. Wink

Zitat:
Das ganze lässt sich relativ einfach anwenden.
- programmiert, auf Wikipedia nochmal nachvollzogen, getestet - funktioniert.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group