| |
|
|
Sven Bader | Hallo!
Eigentlich eine Basisfunktion in der Spieleentwicklung: ArcTan2 bzw atan2 (php/js). Hiermit lässt sich der Winkel zwischen zwei Punkten, ermitteln um so z.B. einen Gegner in Richtung Spieler schauen oder laufen zu lassen.
Ich habe mich etwas gewundert, dass ich keine Entsprechung in Profan gefunden habe, evtl. habe ich es nur übersehen?
Es ist letztendlich die ArcTan Funktion mit einer Quadranten-Abfrage. Es würde mich freuen, wenn die Funktion den Weg in Profan oder die math.inc finden würde.
In einer zweiten Funktion, ich nenne sie Arctan4, nehme ich auch noch die Berechnung der Vektoren und die Umwandlung von Bogenmaß in Grad ab.
Als Abfallprodukt hat der Code noch Profan-Icons als OpenGL Textur.
Herunterladen
Windowtitle "ArcTan2, ArcTan4 und Icon Texturen"
windowstyle 1+4+8+16
window (%maxx * 0.5 - 200), (%maxy * 0.5 - 150) - 400,300'kompatible schreibweise
Declare tex&, hPic&, zrot!, oglX&, oglY&
oGL("init",%hWnd,1,1,1,0)
oGL("posmode",1)
'Texture aus Icons
Mcls 32,32
startpaint -1
DrawIcon "GESICHT", 0,0
endpaint
hPic&=create("hPic",0,"&MEMBMP")
tex&=ogl("getTextureBmp",hPic&,1)
DeleteObject hPic&
'aus math.inc
Proc Rad2Deg
Parameters Angle!
Return (180 / Pi()) * Angle!
EndProc
Proc ArcTan2
'Winkel aus Position Bilden
'Wenn Objekt 1 zu Objekt 2 schauen soll, ist der Winkel hierfür:
'ArcTan2(x1 - x2, y1 - y2)
'Um das Bogenmaß in Grad umzuwandeln kann ArcTan2 verwendet werden
Parameters x!, y!
Declare result!
if (y! > 0.0)
result! = ArcTan(x!/y!)
elseif (y! < 0.0) & (x! >= 0.0)
result! = ArcTan(x!/y!) + Pi()
elseif (y! < 0.0) & (x! < 0.0)
result! = ArcTan(x!/y!) - Pi()
elseif (y! = 0.0) & (x! > 0.0)
result! = Pi() / 2.0
elseif (y! = 0.0) & (x! < 0.0)
result! = 0.0 - (Pi() / 2.0 )
elseif (y! = 0.0) & (x! = 0.0)
'Kein Abstand, keine Richtung, kann bei Bedarf abgefangen werden
result! = -1000
endif
Return result!
EndProc
Proc ArcTan4
'ArcTan4: Eine Neuschöpfung -) alles in einem inklusive Performance Tweaks
'Die Vektoren müssen nicht selbst berechnet werden, es werden
'einfach nur zwei Punkte übergeben, das Ergebnis ist bereits in Grad
Parameters x1!, y1!, x2!, y2!
Declare result!, x!, y!
x! = x1! - x2!
y! = y1! - y2!
if (y! > 0.0)
result! = ArcTan(x!/y!) * 57.2957795131
elseif (y! < 0.0) & (x! >= 0.0)
result! = (ArcTan(x!/y!) + 3.1415926535897932) * 57.2957795131
elseif (y! < 0.0) & (x! < 0.0)
result! = (ArcTan(x!/y!) - 3.1415926535897932) * 57.2957795131
elseif (y! = 0.0) & (x! > 0.0)
result! = 1.57079632679 * 57.2957795131
elseif (y! = 0.0) & (x! < 0.0)
result! = -1.57079632679 * 57.2957795131
elseif (y! = 0.0) & (x! = 0.0)
'Kein Abstand, keine Richtung, kann bei Bedarf abgefangen werden
result! = -1000
endif
Return result!
EndProc
While isKey(27) = 0
sleep 10
oGL("clear")
oGL("move",0,0,-2)
'Mittelpunkt des Gesichts
oGL("2D", 0, 0, -2, oglX&, oglY&)
'Das Gesicht (oglX&, oglY&) schaut zur Mausposition (%mousex, %mousey)
'zRot! = rad2deg(ArcTan2(%mousex - oglX&, %mousey - oglY&))
'oder
zRot! =ArcTan4(%mousex, %mousey, oglX&, oglY&)
oGL("rotate",0,0,zRot!)
oGL("texture",1,1)
oGL("quad",1,1)
oGL("show")
EndWhile
|
|
|
| |
|
|
|
p.specht
| Ohne Berücksichtigung von oGL gab es mal ein Snippet dazu: [...] |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 11.08.2021 ▲ |
|
|
|
|
Sven Bader | Nach atan und arctan habe ich gesucht, nach "arcus" nicht Dein Beitrag ist sogar recht neu.
Ich würde ja eine C++ DLL von diesen Dingen machen aber erfahrungsgemäß kostet der DLL Aufruf so viel Zeit wie man durch die schnellere Ausführung gewonnen hätte. |
|
|
| |
|
|