diff --git a/.luacheckrc b/.luacheckrc index e010ab95c..a922bdea9 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -20,7 +20,7 @@ read_globals = { string = {fields = {"split", "trim"}}, table = {fields = {"copy", "getn", "indexof", "insert_all"}}, - math = {fields = {"hypot"}}, + math = {fields = {"hypot", "round"}}, } globals = { diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index 35c821f39..b7bd4d6a7 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -244,6 +244,15 @@ function math.factorial(x) return v end + +function math.round(x) + if x >= 0 then + return math.floor(x + 0.5) + end + return math.ceil(x - 0.5) +end + + function core.formspec_escape(text) if text ~= nil then text = text:gsub("\\", "\\\\") diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index 28d8e117d..9d31eac02 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -1,6 +1,6 @@ vector = {} -local floor, hypot = math.floor, math.hypot +local floor, hypot, round = math.floor, math.hypot, math.round local min, max, pi = math.min, math.max, math.pi function vector.new(a, b, c) @@ -43,9 +43,9 @@ end function vector.round(v) return { - x = floor(v.x + 0.5), - y = floor(v.y + 0.5), - z = floor(v.z + 0.5) + x = round(v.x), + y = round(v.y), + z = round(v.z) } end diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 575deee15..f44783d16 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3164,6 +3164,7 @@ For the following functions, `v`, `v1`, `v2` are vectors, * Returns a vector, each dimension rounded down. * `vector.round(v)`: * Returns a vector, each dimension rounded to nearest integer. + * At a multiple of 0.5, rounds away from zero. * `vector.apply(v, func)`: * Returns a vector where the function `func` has been applied to each component. @@ -3342,6 +3343,8 @@ Helper functions * If the absolute value of `x` is within the `tolerance` or `x` is NaN, `0` is returned. * `math.factorial(x)`: returns the factorial of `x` +* `math.round(x)`: Returns `x` rounded to the nearest integer. + * At a multiple of 0.5, rounds away from zero. * `string.split(str, separator, include_empty, max_splits, sep_is_pattern)` * `separator`: string, default: `","` * `include_empty`: boolean, default: `false`