gears: Add a geometry modules
Add an abstract geometry module to `gears`
This commit is contained in:
parent
b8920c2a7a
commit
9d13e08c63
|
@ -0,0 +1,60 @@
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
--
|
||||||
|
-- Helper functions used to compute geometries.
|
||||||
|
--
|
||||||
|
-- When this module refer to a geometry table, this assume a table with at least
|
||||||
|
-- an *x*, *y*, *width* and *height* keys and numeric values.
|
||||||
|
--
|
||||||
|
-- @author Julien Danjou <julien@danjou.info>
|
||||||
|
-- @copyright 2008 Julien Danjou
|
||||||
|
-- @release @AWESOME_VERSION@
|
||||||
|
-- @module gears.geometry
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
local math = math
|
||||||
|
|
||||||
|
local gears = {geometry = {rectangle = {} } }
|
||||||
|
|
||||||
|
--- Get the square distance between a rectangle and a point.
|
||||||
|
-- @tparam table geom A rectangle
|
||||||
|
-- @tparam number geom.x The horizontal coordinate
|
||||||
|
-- @tparam number geom.y The vertical coordinate
|
||||||
|
-- @tparam number geom.width The rectangle width
|
||||||
|
-- @tparam number geom.height The rectangle height
|
||||||
|
-- @tparam number x X coordinate of point
|
||||||
|
-- @tparam number y Y coordinate of point
|
||||||
|
-- @treturn number The squared distance of the rectangle to the provided point
|
||||||
|
function gears.geometry.rectangle.get_square_distance(geom, x, y)
|
||||||
|
local dist_x, dist_y = 0, 0
|
||||||
|
if x < geom.x then
|
||||||
|
dist_x = geom.x - x
|
||||||
|
elseif x >= geom.x + geom.width then
|
||||||
|
dist_x = x - geom.x - geom.width + 1
|
||||||
|
end
|
||||||
|
if y < geom.y then
|
||||||
|
dist_y = geom.y - y
|
||||||
|
elseif y >= geom.y + geom.height then
|
||||||
|
dist_y = y - geom.y - geom.height + 1
|
||||||
|
end
|
||||||
|
return dist_x * dist_x + dist_y * dist_y
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Return the closest rectangle from `list` for a given point.
|
||||||
|
-- @tparam table list A list of geometry tables.
|
||||||
|
-- @tparam number x The x coordinate
|
||||||
|
-- @tparam number y The y coordinate
|
||||||
|
-- @return The key from the closest geometry.
|
||||||
|
function gears.geometry.rectangle.get_closest_by_coord(list, x, y)
|
||||||
|
local dist = math.huge
|
||||||
|
local ret = nil
|
||||||
|
|
||||||
|
for k, v in pairs(list) do
|
||||||
|
local d = gears.geometry.rectangle.get_square_distance(v, x, y)
|
||||||
|
if d < dist then
|
||||||
|
ret, dist = k, d
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
return gears.geometry
|
|
@ -19,6 +19,7 @@ return
|
||||||
shape = require("gears.shape");
|
shape = require("gears.shape");
|
||||||
protected_call = require("gears.protected_call");
|
protected_call = require("gears.protected_call");
|
||||||
screen = require("gears.screen");
|
screen = require("gears.screen");
|
||||||
|
geometry = require("gears.geometry");
|
||||||
}
|
}
|
||||||
|
|
||||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
Loading…
Reference in New Issue