GLBasic forum

Other languages => GLBasic - de => Topic started by: x-tra on 2007-Sep-06

Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-06
Bei welchen Berechnungen verwendet man intelligenterweise diese Winkelfunktionen?

Wo werden bestimmte Segmente dadurch vereinfacht, oder erst möglich gemacht?

Ich versuche ein komplettes Tutorial für Anfänger zu schreiben und möchte dieses Thema auch mit anschneiden, und suche daher Informationen usw. betreffs GLB.
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Schranz0r on 2007-Sep-06
Einen Wurf, Kreisbahn, Pendelbewegung, Softe auf-Abwerts bewegung(Sin),Seitwertsbewegung(Cos) usw....
Tan/Atan
ist da schon schwerer

z.B einen Winkel(Richtung) zweier Objekte lässt sich damit erstellen!
Code (glbasic) Select
MOD((ATAN(Y1-Y2,X1,X2)+360),360)Geht bestimmt auch schicker aber naja ;)


Da gibts einen haufen, wer in der schule schon nicht aufgepasst hat, wird sich da eh schwer tun es zu verstehen!
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-06
Aha interessant, auch wenn ich das Beispiel von dir noch nicht so ganz durchblicke, aber vielleicht bin ich auch schon zu lange aus der Schule raus, und brauch da etwas länger zu.
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: D2O on 2007-Sep-06
Hier mal ein Beispiel mit ATAN()

Code (glbasic) Select
// --------------------------------- //
// Project: Atan
// Start: Saturday, January 27, 2007
// IDE Version: 4.051


// Zwei bilder erstellen und laden
rect ( 0,0,32,32,200,50,50)
GRABSPRITE 0,0,0,32,32
SAVESPRITE 0,"rect0.bmp"
LOADSPRITE "rect0.bmp",0


rect ( 32,32,32,32,200,250,50)
GRABSPRITE 1,32,32,32,32
SAVESPRITE 1,"rect1.bmp"
LOADSPRITE "rect1.bmp",1

//Mainschleife
WHILE TRUE
 // Mouskoordinaten zuweisen
 MOUSESTATE mx,my,b1,b2
 
 // Bild 0 hat eine feste Koordinate    
 SPRITE 0,300,250
 // Bild 1 hängt an der Mousekoordinate
 SPRITE 1,mx,my

    // Mod((Atan(yBild0 - yBild1,xBild0 -xBild1)+360),360)  
    winkel =  MOD((ATAN(250-my,300-mx)+360),360)
   
    // Linie zu den Eckpunkten zeichnen
    DRAWLINE 300,250,mx,my,RGB(255,0,0)
    // Den Winke ausgeben
    PRINT winkel+"°",mx+38,my
   

SHOWSCREEN
WEND

FUNCTION rect:l_x,l_y,l_tx,l_ty,l_r,l_g,l_b
        FILLRECT l_x,l_y,l_x+l_tx,l_y+l_ty,RGB(l_r,l_g,l_b)
ENDFUNCTION
Edit//
Das könnte für Dich auch Interessant sein,
http://www.glbasic.com/forum/viewtopic.php?id=651
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Schranz0r on 2007-Sep-06
Jow, schicke sache das Beispielprogramm!


@ X-tra:

MOD((ATAN(Y1-Y2,X1-X2)+360),360)

Das errechnet einen Winkel zwischen 2 Bildern.
Man könnte das wie D²O anwenden.
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-07
Haltet mich nicht für blöd, aber ich hab eins nicht verstanden.

Und zwar mod(a,b)  gibt den wert der division a und b zurück.

Soweit schon klar und verständlich.bei:  
Code (glbasic) Select
((ATAN(Y1-Y2,X1,X2)+360),360)Welches ist vor dem komma und welches dannach?  also a und b?

Oder sind die Divisionsvariablen in der klammer von mod(,) beliebig?

Also auch mod(a,b,c,d)  möglich.

Ich komm bei den obigen Klammern und deren Inhalt etwas durcheinander.

[edit] ahhh ich habs, voll im stress hier.

....,360) ist ,b#)     und alles vor dem komma ist die winkelberechnung atan, und somit (a#  

ist das soweit richtig?

So wäre es übrigends richtig, oder?
Code (glbasic) Select
((ATAN(Y1-Y2,X1-X2)+360),360)X1-X2  und nicht X1,X2

das hier:
Code (glbasic) Select
((ATAN(Y1-Y2,X1-X2)habe ich jetzt verstanden, nur das dahinter noch nicht, kann mir das jemand erklären? Bitte...
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Schranz0r on 2007-Sep-07
Jow schreibfehler Sorry!^^
Habs geändert
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-08
Ich hoffe es nervt niemanden, aber ich blicke bei den ganzen Winkelfunktionen nicht wirklich durch.

Hab hiermal was gezeichnet, und erklärt, inwieweit ich es verstehe.

(http://img463.imageshack.us/img463/8520/unbenanntjr2.jpg)

Koordinaten für B1:  xB1= 1   yB1= 2
Koordinaten für B2:  xB2= 6    yB2=7

Um den Winkel alpha zu bestimmen würde man ja nun:
Code (glbasic) Select
tan(alpha)=Gegenkathete/Ankatheterechnen.

In diesem Fall wäre dies:
Code (glbasic) Select
tan(alpha)=(yB2-yB1)/(xB2-xB1)Sehe ich das so richtig, denn wenn ich wie oben tan(alpha)=(yB1-yB2)/(xB1-xB2) nehmen würde, würden negative Zahlen herauskommen.

Oder spielt das keine Rolle.

Theoretisch hätte ich ja damit schon meinen Winkel, oder?

Somit habe ich erstmal die Winkelfunktion verstanden, so im Groben jedenfalls, denke ich.

Nun würde ich mich trotzdem freuen, wenn ihr mich korrigiert, falls ich da falsch liege.

Und nun stehe ich noch vor dem Problem, was am Ende von
Code (glbasic) Select
Mod((Atan(yBild0 - yBild1,xBild0 -xBild1)+360),360)steht.

Wozu +360),360)  ???

Was passiert dort, und warum wird ATAN genommen?

Den Winkel hätte man ja mit einer einfach Tangensberechnung schon heraus.

Aber wahrscheinlich verwurschtel ich da was, aber Winkelfunktionen waren wohl nie meine Stärke, und nunja sind schon paar jahre her.

Und entschuldigt, daß ich durch meine dummen Fragen hier das Forum so zuspamme, aber ich sitz wie man sieht um diese Uhrzeit immer noch dran, und grübel und grübel.


[edit]  habe mich gerade etwas belesen, und gesehen, daß ja ATAN die Umkehrfunktion von TAN ist, und ab da versteh ich nur Bahnhof....Sorry.
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Kitty Hello on 2007-Sep-08
Bei Deinem Bild:
Verschieb' beide Punkte so, dass der Punkt A im Ursprung ist. Also A=(0,0), B=(xB-xA, yB-yA). Klar so weit?
Jetzt ist der Punkt A im Ursprung, und über den Tangens kannst Du jetzt den Winkel zwischen A und B herausfinden:
tan(alpha) = dy/dy
mit: dy = Höhe
      dx = Breite

alpha = ATAN(yB-yA, xB-xA);
Alpha ist jetzt -180 bis +180
Schranzor will das aber von 0..360 haben, also macht er:
alpha = MOD(alpha+360, 360)
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-08
In D2Oś Beispiel trifft das mit Punkt A aber nicht zu?

Code (glbasic) Select
winkel =  MOD((ATAN(250-my,300-mx)+360),360)Oder ist A dort trotzdem immer der Ursprung? Also my und mx = 0?
Weil es ja eigentlich die Mauskoordinaten sind.

Könnte natürlich trotzdem sein, daß es für jede Berechnung dann als Ursprung zählt.


Soweit hab ich es vollkommen verstanden, was aber ist, wenn die Koordinaten von A größer sind als die von B?
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Schranz0r on 2007-Sep-08
wo der ursprungspunkt ist, sollte egal sein!

Wichtig zu wissen ist nur, das wenn du ein Dreieck hast, alle Winkel zusammen 180 ° ergeben.

Hast du jetzt ein rechtwinkliges Dreieck ergiben sich die Winkel ja automatisch (180 - 90)/2  sprich 45.

Die Formel(D²O und meine) aber errechnet ja nicht diese winkel so wie du meinst, sondern rechnet den Winkel von Bild A relativ zu Bild B. Oder ich laber wieder schwachsinn, aber funzen tut es ;)
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: x-tra on 2007-Sep-08
Das verstehe ich ja, aber nehmen wir mal an, BildA befindet sich bei deinem Beispiel im Koordinatensystem unterhalb von BildB.(gehen wir mal davon aus, daß BildA=Kanone und BildB=Ziel), dann haut das auch hin, und wir bekommen den Winkel für die Peilung.

Wenn nun aber BildA oberhalb von BildB ist, also xBildA größer als xBildB, dann kämen ja bei der Gleichung (xBildB-xBildA) Werte kleiner 0 raus.

Und das verstehe ich eben nicht.


@SchranzOr: kannst du mal eine zeichnung machen, wie du das meinst?

Ich glaub ich habs rausgefunden.

Bei werten welche die klammerberechnungen der jeweiligen x und y koordinaten betreffen, und die summe in den klammern kleiner 0 ist, vergrößert sich der winkel trotzdem, als Beispiel, ergibt ybildA - ybildB = -1, so ist es um den Winkel nahe 360grad, vorausgesetzt, xbildA - xbildB > 0.

Hab ich das so richtig verstanden?

Ähm ich glaub die beschreibung stimmt nicht so wirklich, aber ich hab verstanden, daß trotz negativer werte als ergebnis der berechnungen in den klammer, winkel erzeug werden, die eben größer als 90 grad sind.

habe den Quellcode ganz oben genommen, und mir einfach die jeweilgen Koordinaten des beweglichen Sprites anzeigen lassen.
Title: Praktische Anwendungsgebiete für Sin/Cos/Tan in GLB
Post by: Schranz0r on 2007-Sep-08
Man könnte Prüfen, welche X-koordinate und welche Y größer ist Bild A oder Bild B.
Jenachdem könnte man die Formel setzten um einen Positiven Wert zu berechen

aber das ist ja egal ob Winkel < 0 oder > 0 ist, da es den Winkel an sich nicht stört!

If Winkel < -359 then Winkel = 0
if Winkel > 359 then Winkel = 0

also ist es egal! der Punkt wird immerwieder erreicht!
Man muss auch nicht umbedingt immer "reseten" da muss man schon viel drehen, damit man mal den Max Intger/Float Wert ausreizt ;)