Hi und frohes Neues Jahr 2022.
Ja, wie man im Titel sieht, müsste ich einen Winkel berechnen ( Star Trek Fyne - ich will es besser hinkriegen, als je zuvor...)
Ich habe die x-y Koordinaten innerhalb eines ( virtuellen ) 360 Grad Kreises, kann also Ankathete a und Gegenkathete b bestimmen, damit also den tan Alpha ausrechnen. Soweit , so gut.
Ich müsste aber den tang Alpha in den Winkel Alpha umrechnen. Die Formel wäre ja Alpha= tang hoch -1 * (a/b).
Leider gibts ja keine trigonomischen Funktionen, also .. WIE eingeben ??
Gruß
JH
tangens Berechnen
tangens Berechnen
Es gibt 10 Arten von Usern :
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
Re: tangens Berechnen
Es gibt zumindest eine Funktion Arcsin (Arkussinus) die hatte ich eingebaut eben genau für solche Fälle. Ich glaub das müsste auch dir helfen. Beispiel aus der Hilfe :
Im Demo Adventure berechne ich das Dart Minigame ähnlich, lass mich das mal eben raussuchen.
OK. Das hab ich mittels einer Vorsortierung und einer Tabelle gelöst.
Quasi erstmal gucken im welchem Quadranten des Kreises du bist und dann nehm ich den Wert von B / C * 1000 und erhalte einen Wert zwischen 0 und 1000 den ich dann Tabellenartig überprüfe um zu wissen in welchen Dartscheibensegment ich bin.
Code: Select all
Berechnet den Arkussinus einer Zahl. [Variabeln] können als Parameter eingetragen werden.
Dieses Beispiel berechnet den Winkel 0-90° der Mausposition im Bezug zu einem Mittelpunkt.
setnum (CenterX ; 500)
setnum (CenterY ; 500)
(*1st get absolute distance from center
by calculating with pytagoras.*)
setnum (A ; [mouseX]-[CenterX])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mouseY]-[CenterY])
if_num (B ; < 0)
setnum (B ; 0-[B])
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + [B]*[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
(*Get the angle by dividing B by C *)
setnum (Angle ; [B] / [c])
(*Getting degree vom Angle by checking a table*)
arcsin (angle)
OK. Das hab ich mittels einer Vorsortierung und einer Tabelle gelöst.
Code: Select all
setobj (Darts_Cross ; 0)
wait(1)
playsound (Darts_Throw)
setstring (DartsLabel ; [empty])
(*Display small dart graphic at the position the player clicked*)
if_num (DartShots ; 3)
{
setobj (Darts_Shotsleft2 ; 0)
moveobj (Darts_Dart ; [ThrowX] - 15; [ThrowY] - 4 ; 0)
if_num (ThrowX ; < 508)
setobj (Darts_Dart ; 1)
if_num (ThrowX ; > 507)
setobj (Darts_Dart ; 2)
}
if_num (DartShots ; 2)
{
setobj (Darts_Shotsleft1 ; 0)
moveobj (Darts_Dart1 ; [ThrowX] - 15; [ThrowY] - 4 ; 0)
if_num (ThrowX ; < 508)
setobj (Darts_Dart1 ; 1)
if_num (ThrowX ; > 507)
setobj (Darts_Dart1 ; 2)
}
if_num (DartShots ; 1)
{
setobj (Darts_Shotsleft ; 0)
moveobj (Darts_Dart2 ; [ThrowX] - 15; [ThrowY] - 4 ; 0)
if_num (ThrowX ; < 508)
setobj (Darts_Dart2 ; 1)
if_num (ThrowX ; > 507)
setobj (Darts_Dart2 ; 2)
}
wait(1)
(*Calculate Hit*)
(*Center of the dart board in pixel*)
setnum (centerX ; 508)
setnum (centerY ; 346)
(*1st get absolute distance from center
by calculating with pytagoras.*)
setnum (A ; [mouseX]-[CenterX])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mouseY]-[CenterY])
if_num (B ; < 0)
setnum (B ; 0-[B])
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + [B]*[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
(*Get the angle by dividing B by C
Winkel is german for angle
*)
setnum (Winkel ; [B] / [c] * 1000)
(*Check in which quarter of the board the dart is*)
if_num (mousex ; [centerX])
if_num (mouseY ; [centerY])
setstring (DartArea ; Bullseye)
(*20 - 6*)
if_num (mousex ; > [centerX])
if_num (mousey ; < [centerY])
setstring (DartArea ; UpRight)
(*6 - 3*)
if_num (mousex ; > [centerX])
if_num (mousey ; > [centerY])
setstring (DartArea ; DownRight)
(*3 - 11*)
if_num (mousex ; < [centerX])
if_num (mousey ; > [centerY])
setstring (DartArea ; DownLeft)
(*11 - 20*)
if_num (mousex ; < [centerX])
if_num (mousey ; < [centerY])
setstring (DartArea ; UpLeft)
(*Now check what number was hit by looking at the angle and area*)
if_string (DartArea ; Bullseye)
{
setnum (Hit ; 50)
setstring (DartsLabel ; 50)
setnum (Section ; 50)
}
if_string (DartArea ; UpRight)
{
if_num (Winkel ; < 156)
setnum (Section ; 6)
if_num (Winkel ; > 155)
if_num (Winkel ; < 453)
setnum (Section ; 13)
if_num (Winkel ; > 452)
if_num (Winkel ; < 707)
setnum (Section ; 4)
if_num (Winkel ; > 706)
if_num (Winkel ; < 891)
setnum (Section ; 18)
if_num (Winkel ; > 890)
if_num (Winkel ; < 987)
setnum (Section ; 1)
if_num (Winkel ; > 986)
setnum (Section ; 20)
}
if_string (DartArea ; UpLeft)
{
if_num (Winkel ; < 156)
setnum (Section ; 11)
if_num (Winkel ; > 155)
if_num (Winkel ; < 453)
setnum (Section ; 14)
if_num (Winkel ; > 452)
if_num (Winkel ; < 707)
setnum (Section ; 9)
if_num (Winkel ; > 706)
if_num (Winkel ; < 891)
setnum (Section ; 12)
if_num (Winkel ; > 890)
if_num (Winkel ; < 987)
setnum (Section ; 5)
if_num (Winkel ; > 986)
setnum (Section ; 20)
}
if_string (DartArea ; DownRight)
{
if_num (Winkel ; < 156)
setnum (Section ; 6)
if_num (Winkel ; > 155)
if_num (Winkel ; < 453)
setnum (Section ; 10)
if_num (Winkel ; > 452)
if_num (Winkel ; < 707)
setnum (Section ; 15)
if_num (Winkel ; > 706)
if_num (Winkel ; < 891)
setnum (Section ; 2)
if_num (Winkel ; > 890)
if_num (Winkel ; < 987)
setnum (Section ; 17)
if_num (Winkel ; > 986)
setnum (Section ; 3)
}
if_string (DartArea ; DownLeft)
{
if_num (Winkel ; < 156)
setnum (Section ; 11)
if_num (Winkel ; > 155)
if_num (Winkel ; < 453)
setnum (Section ; 8)
if_num (Winkel ; > 452)
if_num (Winkel ; < 707)
setnum (Section ; 16)
if_num (Winkel ; > 706)
if_num (Winkel ; < 891)
setnum (Section ; 7)
if_num (Winkel ; > 890)
if_num (Winkel ; < 987)
setnum (Section ; 19)
if_num (Winkel ; > 986)
setnum (Section ; 3)
}
(*And finally we look at the distance to know if the dart hit
a single, double,triple or bullseye cicrle*)
if_num (C ; < 7)
{
setstring (Dartcircle ; Bullseye)
setnum (Hit ; 50)
setstring (DartsLabel ; 50)
}
if_num (C ; > 6)
if_num (C ; < 11)
{
setstring (Dartcircle ; Bullsring)
setnum (Hit ; 25)
setstring (DartsLabel ; 25)
}
if_num (C ; > 10)
if_num (C ; < 63)
{
setstring (Dartcircle ; Normal)
setnum (Hit ; [Section])
setstring (DartsLabel ; [Section])
}
if_num (C ; > 62)
if_num (C ; < 69)
{
setstring (Dartcircle ; Triple)
setnum (Hit ; 3*[Section])
setstring (DartsLabel ; Tripple [Section])
}
if_num (C ; > 68)
if_num (C ; < 102)
{
setstring (Dartcircle ; Normal)
setnum (Hit ; [Section])
setstring (DartsLabel ; [Section])
}
if_num (C ; > 101)
if_num (C ; < 109)
{
setstring (Dartcircle ; Double)
setnum (Hit ; 2*[Section])
setstring (DartsLabel ; Double [Section])
}
if_num (C ; > 108)
{
setstring (Dartcircle ; Out)
setnum (Hit ; 0)
setstring (Dartslabel ; Out)
}
(*Add result to score*)
setnum (NewScore ; [DartsScore]-[hit])
(*reset Score if overshot.*)
if_num (NewScore ; < 0)
{
playsound (Darts_Overshot)
setstring (DartsLabel ; Overshot)
wait(1,5)
setnum (Dartsscore ; [DartsBackupScore])
setstring (DartsScore ; [Dartsscore])
}
ifnot_num (NewScore ; < 0)
{
(*Lower Score*)
wait(2)
setstring (DartsLabel ; [empty])
setnum (Dartsscore ; [Newscore])
setstring (DartsScore ; [Dartsscore])
wait(0,5)
}
(*End Game when score is exactly 0*)
if_num (DartsScore ; 0)
{
setstring (DartsLabel ; Game Over)
setbool (Arcade_Darts ; true)
playsound (Darts_Gameover)
wait(3)
(*go Back to normal game*)
enablemouse (true)
showmouse (true)
enablemenu (true)
unloadroom ()
wait(1)
setfocus(ben)
function (afterload)
break()
}
(*Preparing Next Throw*)
playsound (Darts_Next)
if_num (DartShots ; 3)
setstring (DartsLabel ; Throw 2)
if_num (DartShots ; 2)
setstring (DartsLabel ; Throw 3)
if_num (DartShots ; 1)
{
setnum (DartsBackupscore ; [Dartsscore])
setstring (DartsLabel ; Throw 1)
setobj (Darts_Shotsleft ; 1)
setobj (Darts_Shotsleft1 ; 1)
setobj (Darts_Shotsleft2 ; 1)
setobj (Darts_dart ; 0)
setobj (Darts_dart1 ; 0)
setobj (Darts_dart2 ; 0)
}
setnum (DartShots ; -1)
setobj (Darts_Cross ; 1)
if_num (DartShots ; 0)
setnum (Dartshots ; 3)
Re: tangens Berechnen
Junge junge, wo hast Du das denn die ganze Zeit versteckt ???
Danke, ich wühle mich mal da durch. Mal sehen, was draus wird...
Manni
Danke, ich wühle mich mal da durch. Mal sehen, was draus wird...
Manni
Es gibt 10 Arten von Usern :
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
Re: tangens Berechnen
Ich musste CenterX und CenterY vertauschen, dann passt es. Je nach Quadranten ( rechts oben, rechts unten usw ) muss ich das noch versuchen, anzupassen, dann könnte es genau das sein, was ich brauche. Es sieht vielversprechend aus.
Gepreiset seist Du, Engine Papa !
Gepreiset seist Du, Engine Papa !
Es gibt 10 Arten von Usern :
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
Re: tangens Berechnen
SO - PROBLEM GELÖST !!!
Um eine virtuelle Bildschirmmitte meines Raumschiffs sollte der Mauszeiger einen Kurs von 0 - 360 Grad anzeigen. Im 3 D Raum wird daraus später bei 0 Grad eine Drehung nach oben und bei 90 Grad zB eine Drehung nach rechts. Die sichtbaren Sterne und Objekte sollen dabei natürlich in die jeweils entgegengesetzte Richtung laufen.
Im Prinzip habe ich den Bildschirm mit einem Kreuz in der Mitte also in 4 Quadranten geteilt und durch Vertauschen der Variablen jeweils die (gedachte) Ankathete oder die Gegenkathete bewegt und daraus Hypotenuse und Winkel berechnen können.
Jeder Quadrant spuckte dabei einen Winkel von 0 - 90 Grad aus. Das Ganze wurde dann horizontal und vertikal gespiegelt und
umgerechnet, so dass die einzelnen 90 Grad Winkel in einen fortlaufenden 360 Grad Kurs umgerechnet wurden
DANKE
Hier das Skript:
(* Funktionen anhalten, wenn Mauszeiger den Bereich verlässt*)
if_num (xmouse;<210)
break()
if_num (xmouse;>440)
break()
if_num (ymouse;>280)
break ()
if_num (ymouse;<150)
break ()
setnum (circle;360)
(*Bildschirmhälfte LINKS abfragen und Winkel in 360 Grad Kurs umrechnen*)
if_num (xmouse;<320)
{
(*Quadrant OBEN links*)
if_num (ymouse;<200)
{
setnum (A ; [mousey]-[CenterY])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousex]-[CenterX])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *)
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; / [c])
arcsin (angle)
setnum (course;[circle]-[angle])
}
(*Quadrant UNTEN links *)
if_num (ymouse;>200)
{
setnum (A ; [mousey]-[CenterY])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousex]-[CenterX])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *)
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; / [c])
arcsin (angle)
setnum (course;[angle]+180)
}
}
(*Rechte Bildschirmhälfte abfragen und Winkel in 360 Grad Kurs umrechnen*)
if_num (xmouse;>320)
{
(*Rechts OBEN*)
if_num (ymouse;<200)
{
setnum (A ; [CenterY]-[mousey])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [CenterX]-[mousex])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; [B] / [C])
arcsin (angle)
setnum (course;[angle])
}
(*Rechts UNTEN*)
if_num (ymouse;>200)
{
setnum (A ; [mousex]-[CenterX])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousey]-[CenterY])
if_num (B ; < 0)
setnum (B ; 0-[B])
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + [B]*[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; [B] / [c])
arcsin (angle)
setnum (course;[angle]+90)
}
}
setnum (pardir;360-[course])
setparticles (starpoint;[particlespeed];151;[pardir];0;80)
startparticles ()
Um eine virtuelle Bildschirmmitte meines Raumschiffs sollte der Mauszeiger einen Kurs von 0 - 360 Grad anzeigen. Im 3 D Raum wird daraus später bei 0 Grad eine Drehung nach oben und bei 90 Grad zB eine Drehung nach rechts. Die sichtbaren Sterne und Objekte sollen dabei natürlich in die jeweils entgegengesetzte Richtung laufen.
Im Prinzip habe ich den Bildschirm mit einem Kreuz in der Mitte also in 4 Quadranten geteilt und durch Vertauschen der Variablen jeweils die (gedachte) Ankathete oder die Gegenkathete bewegt und daraus Hypotenuse und Winkel berechnen können.
Jeder Quadrant spuckte dabei einen Winkel von 0 - 90 Grad aus. Das Ganze wurde dann horizontal und vertikal gespiegelt und
umgerechnet, so dass die einzelnen 90 Grad Winkel in einen fortlaufenden 360 Grad Kurs umgerechnet wurden
DANKE
Hier das Skript:
(* Funktionen anhalten, wenn Mauszeiger den Bereich verlässt*)
if_num (xmouse;<210)
break()
if_num (xmouse;>440)
break()
if_num (ymouse;>280)
break ()
if_num (ymouse;<150)
break ()
setnum (circle;360)
(*Bildschirmhälfte LINKS abfragen und Winkel in 360 Grad Kurs umrechnen*)
if_num (xmouse;<320)
{
(*Quadrant OBEN links*)
if_num (ymouse;<200)
{
setnum (A ; [mousey]-[CenterY])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousex]-[CenterX])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *)
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; / [c])
arcsin (angle)
setnum (course;[circle]-[angle])
}
(*Quadrant UNTEN links *)
if_num (ymouse;>200)
{
setnum (A ; [mousey]-[CenterY])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousex]-[CenterX])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *)
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; / [c])
arcsin (angle)
setnum (course;[angle]+180)
}
}
(*Rechte Bildschirmhälfte abfragen und Winkel in 360 Grad Kurs umrechnen*)
if_num (xmouse;>320)
{
(*Rechts OBEN*)
if_num (ymouse;<200)
{
setnum (A ; [CenterY]-[mousey])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [CenterX]-[mousex])
if_num (B ; < 0)
setnum (B ; 0-)
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + *[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; [B] / [C])
arcsin (angle)
setnum (course;[angle])
}
(*Rechts UNTEN*)
if_num (ymouse;>200)
{
setnum (A ; [mousex]-[CenterX])
if_num (A ; < 0)
setnum (A ; 0-[A])
if_num (A ; < 1)
setnum (A ; 1)
setnum (B ; [mousey]-[CenterY])
if_num (B ; < 0)
setnum (B ; 0-[B])
if_num (B ; < 1)
setnum (B ; 1)
setnum (C ; [A]*[A] + [B]*[B])
sqrt (C)
if_num (C ; < 1)
setnum (C ; 1)
setnum (Angle ; [B] / [c])
arcsin (angle)
setnum (course;[angle]+90)
}
}
setnum (pardir;360-[course])
setparticles (starpoint;[particlespeed];151;[pardir];0;80)
startparticles ()
Es gibt 10 Arten von Usern :
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de
die, die Binärcode verstehen und die, die es nicht tun....
----------------------------------------------------------
STAR TREK FYNE :
http://www.fynegames.homepage.t-online.de