Winkel zwischen zwei Punkten

Robert

Diese Funktion gibt den Winkel zwischen zwei Punkten an.

Die Parameter (_Pos1,_Pos2) können sowohl Punkte, Entity_Name oder auch Entity_ID sein.

Rückgabe ist der Winkel in Grad. Siehe Anwendungsbeispiel.

function Winkel(_Pos1,_Pos2)
	local delta_X = 0;
	local delta_Y = 0;
	local alpha   = 0
	if type (_Pos1) == "string" or type (_Pos1) == "number" then
		_Pos1 = GetPosition(GetEntityId(_Pos1));
	end
	if type (_Pos2) == "string" or type (_Pos2) == "number" then
		_Pos2 = GetPosition(GetEntityId(_Pos2));
	end
	delta_X = _Pos1.X - _Pos2.X
	delta_Y = _Pos1.Y - _Pos2.Y
	if delta_X == 0 and delta_Y == 0 then -- Gleicher Punkt
		return 0
	end
	alpha = math.deg(math.asin(math.abs(delta_X)/(math.sqrt(__pow(delta_X, 2)+__pow(delta_Y, 2)))))
	if delta_X >= 0 and delta_Y > 0 then
		alpha = 270 - alpha 
	elseif delta_X < 0 and delta_Y > 0 then
		alpha = 270 + alpha
	elseif delta_X < 0 and delta_Y <= 0 then
		alpha = 90  - alpha
	elseif delta_X >= 0 and delta_Y <= 0 then
		alpha = 90  + alpha
	end
	return alpha
end

Anwendungsbeispiel

Da Wasserfälle ja niemanden ansehen können (LookAt), oder sich auch nicht drehen können (RotateEntity), ich aber wollte, daß sie das tun, habe ich diese Funktion oben geschrieben. Einfach den Bauern in die Nähe des Wasserfalls bringen. Es gibt vielleicht auch sinnvolle Anwendungen dafür.

-- dies hier in die FirstMapAction
	nBauer=CreateEntity (1,Entities.PU_Serf,{X=19000,Y=19000},"Bauer")
	nIDWasserfall=Logic.CreateEntity( Entities.XD_Waterfall4, 19500, 19500, 0, 1 )
	for i = 1 ,10 do
		Logic.CreateEntity( Entities.XD_Waterfall4, 19500+i*40, 19500, 0, 1 )
	end
	StartSimpleJob("Nassmachen")
-- bis hier
 
function Nassmachen()
	if IsNear("Bauer",nIDWasserfall,400) then
		DestroyEntity(nIDWasserfall)
		nIDWasserfall=Logic.CreateEntity( Entities.XD_Waterfall4, 19500, 19500, Winkel({X=19500, Y=19500},"Bauer")+90, 1 )
	end 
end