Inhaltsverzeichnis
math.atan2
math.atan2(_a, _b)
berechnet den Arcus Tangens bzw. tan-1 des Quotienten _a/_b
. Die Funktion wird in der Regel dazu verwendet, einen Winkel α wie im Bild unten dargestellt zu ermitteln.
math.atan2(dy, dx)
wird dabei α ergeben.
Wichtig: Der Winkel wird im Bogenmaß ausgegeben! Wird ein Gradmaß gebraucht, muss der berechnete Winkel mit math.deg umgerechnet werden.
Unterschied zu math.atan
Da math.atan
nur einen Parameter hat, müssen die beiden Katheten dy
und dx
vor der Funktionsanwendung durcheinander geteilt werden. Dadurch ist der Wertebereich, den das Ergebnis haben kann, eingeschränkt. Beispielsweise haben dy/dx
und -dy/-dx
den gleichen Wert, liegen aber, wie im Bild unten dargestellt, einem anderen Winkel zugrunde.
Mit math.atan
lässt sich also der im Bild lila dargestellte Winkel nicht berechnen. Stattdessen wird der grüne ausgegeben, da die Funktion die Vorzeichen der ursprünglichen dx
und dy
nicht mehr kennt. Das führt dazu, dass math.atan
nur in der oberen Kreishälfte nutzbar ist.
math.atan2
dagegen hat 2 Parameter, um die beiden Katheten samt ihrer Vorzeichen übergeben zu können. Dadurch wird die Berechnung des Winkels in allen 4 Quadranten möglich.
Beispiel Anwendungsfall
math.atan2
kann dazu verwendet werden, eine Entity nach einer bestimmten Position auszurichten. Die Funktion LookAt kann eine Siedler-Entity eine andere anschauen lassen. Das funktioniert aber nur, wenn sich die zu drehende Entity bewegen kann, schließt also beispielsweise Gebäude aus.
Berechnet man den korrekten Winkel händisch, kann man auch z.B. ein Wohnhaus in Richtung einer Straße ausrichten:
local ResidencePosition = {X = 13000, Y = 5000} local RoadPosition = {X = 13800, Y = 5500} local Angle = math.atan2(RoadPosition.Y - ResidencePosition.Y, RoadPosition.X - ResidencePosition.X) -- Die Tür des mittleren Wohnhauses liegt im 90°-Winkel zum Koordinatensystem -- Dieser Winkel muss also noch addiert werden Logic.CreateEntity(Entities.PB_Residence2, ResidencePosition.X, ResidencePosition.Y, math.deg(Angle) + 90, 1)