fysplane/utils.lua
2014-10-19 01:23:15 +03:00

89 lines
2.4 KiB
Lua

--[[
Some random utilities that can be useful
]]
-- Calculate XY position from given degrees (not rad!) and distance
-- Returns tuple {X, Y} coordinates
-- Note that either may be negative
function deg_dist_to_xy(degrees, distance)
local rad = deg_to_rad(degrees)
return rad_dist_to_xy(rad, distance)
end
function rad_dist_to_xy(radians, distance)
return {distance * math.cos(radians), distance * math.sin(radians)}
end
-- Convert degrees to radians
function deg_to_rad(degrees)
return degrees * math.pi / 180
end
function rad_to_deg(radians)
return radians * 180 / math.pi
end
-- Convert X,Y to rad from horizontal axle (pointing right)
function xy_to_rad(x, y)
-- Avoid division by 0
if x == 0 then
if y >= 0 then
return math.pi / 2
else
return math.pi * 1.5
end
else
local angle = math.atan(math.abs(y) / math.abs(x))
-- Take into account the quadrant we are in
if x >= 0 and y < 0 then
return 2 * math.pi - angle
elseif x < 0 and y < 0 then
return math.pi + angle
elseif x < 0 and y >= 0 then
return math.pi - angle
else
return angle
end
end
end
function xy_to_deg(x, y)
return rad_to_deg(xy_to_rad(x, y))
end
-- Get distance between two points
function distance(x1, y1, x2, y2)
return math.sqrt(math.pow(x1 - x2, 2) + math.pow(y1 - y2, 2))
end
-- Get objects within a radius from given coordinates in given level
function getObjectsInRadius(x, y, radius, level, include_player)
include_player = include_player or false
local objs = level.world:getBodyList()
local ret = {}
for _, body in pairs(objs) do
if distance(x, y, body:getX(), body:getY()) <= radius then
if body:getFixtureList()[1]:getUserData() ~= player
or include_player then
table.insert(ret, body)
end
end
end
return ret
end
-- Pick a color from a color slide, from rgb0 (0%) to rgb100 (100%)
function colorSlide(rgb0, rgb100, ratio)
local red = colorNAKKIVENE(rgb0[1], rgb100[1], ratio)
local green = colorNAKKIVENE(rgb0[2], rgb100[2], ratio)
local blue = colorNAKKIVENE(rgb0[3], rgb100[3], ratio)
return {red, green, blue}
end
function colorNAKKIVENE(color100, color0, ratio)
return ratio * color100 + (1 - ratio) * color0
end