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)