Skip to content

Commit 179e717

Browse files
committed
vec3: Rename angle_to -> angle_between
In vec2, angle_to is signed and angle_between is unsigned. We only have the unsigned version in vec3, so use the corresponding name. Remove the vec3 implementation from vec2 and use vec2's style implementation. It doesn't allocate new vectors and works even if you somehow call vec3.angle_between(vec2(), vec2()).
1 parent eb209f6 commit 179e717

File tree

3 files changed

+36
-26
lines changed

3 files changed

+36
-26
lines changed

modules/vec2.lua

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,8 @@ end
262262
-- @treturn number angle in [0, pi]
263263
function vec2.angle_between(a, b)
264264
if b then
265-
if vec2.is_vec2(a) then
266-
return acos(a:dot(b) / (a:len() * b:len()))
267-
end
268-
269-
return acos(vec3.dot(a, b) / (vec3.len(a) * vec3.len(b)))
265+
return acos(a:dot(b) / (a:len() * b:len()))
270266
end
271-
272267
return 0
273268
end
274269

modules/vec3.lua

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
local modules = (...):gsub('%.[^%.]+$', '') .. "."
55
local precond = require(modules .. "_private_precond")
66
local private = require(modules .. "_private_utils")
7+
local acos = math.acos
78
local sqrt = math.sqrt
89
local cos = math.cos
910
local sin = math.sin
@@ -330,9 +331,20 @@ function vec3.flip_z(a)
330331
return vec3.new(a.x, a.y, -a.z)
331332
end
332333

333-
function vec3.angle_to(a, b)
334-
local v = a:normalize():dot(b:normalize())
335-
return math.acos(v)
334+
-- No angle_to because that requires defining an axis of rotation. Instead you
335+
-- likely want to convert both into vec2 and use vec2.angle_to.
336+
337+
--- Unsigned angle between two vectors.
338+
-- Directionless and thus commutative.
339+
-- Input vectors must be non-zero.
340+
-- @tparam vec3 a Vector
341+
-- @tparam vec3 b Vector
342+
-- @treturn number angle in [0, pi]
343+
function vec3.angle_between(a, b)
344+
if b then
345+
return acos(a:dot(b) / (a:len() * b:len()))
346+
end
347+
return 0
336348
end
337349

338350
--- Return a boolean showing if a table is or is not a vec3.

spec/vec3_spec.lua

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -232,30 +232,33 @@ describe("vec3:", function()
232232
assert.is.equal(temp, vec3(-1, -2, -3))
233233
end)
234234

235-
it("get two 3-vectors angle", function()
236-
local angle_to = function(a, b)
237-
local deg = math.deg(a:angle_to(b))
235+
it("gets angle between two 3-vectors", function()
236+
local angle_between = function(a, b)
237+
local deg = math.deg(a:angle_between(b))
238238
return string.format('%.2f', deg)
239239
end
240240

241241
local a = vec3(1,2,3)
242-
assert.is.equal(angle_to(a, vec3(3, 2, 1)), '44.42')
243-
assert.is.equal(angle_to(a, vec3(0, 10, 0)), '57.69')
244-
assert.is.equal(angle_to(a, vec3(0, -12, -10)), '157.51')
242+
assert.is.equal(angle_between(a, a), '0.00')
243+
assert.is.equal(angle_between(a, vec3(3, 2, 1)), '44.42')
244+
assert.is.equal(angle_between(a, vec3(0, 10, 0)), '57.69')
245+
assert.is.equal(angle_between(a, vec3(0, -12, -10)), '157.51')
245246

246247
a = vec3.unit_z
247-
assert.is.equal(angle_to(a, vec3(0, 10, 0)), '90.00')
248-
assert.is.equal(angle_to(a, vec3(-123, 10, 0)), '90.00')
249-
assert.is.equal(angle_to(a, vec3(-10, 0, 10)), '45.00')
250-
assert.is.equal(angle_to(a, vec3(-10, 0, -10)), '135.00')
251-
assert.is.equal(angle_to(a, vec3(0, -10, -10)), '135.00')
252-
assert.is.equal(angle_to(a, vec3(0, 0, -10)), '180.00')
253-
assert.is.equal(angle_to(a, vec3(0, 0, 100)), '0.00')
248+
assert.is.equal(angle_between(a, a), '0.00')
249+
assert.is.equal(angle_between(a, vec3(0, 10, 0)), '90.00')
250+
assert.is.equal(angle_between(a, vec3(-123, 10, 0)), '90.00')
251+
assert.is.equal(angle_between(a, vec3(-10, 0, 10)), '45.00')
252+
assert.is.equal(angle_between(a, vec3(-10, 0, -10)), '135.00')
253+
assert.is.equal(angle_between(a, vec3(0, -10, -10)), '135.00')
254+
assert.is.equal(angle_between(a, vec3(0, 0, -10)), '180.00')
255+
assert.is.equal(angle_between(a, vec3(0, 0, 100)), '0.00')
254256

255257
a = vec3(100, 100, 0)
256-
assert.is.equal(angle_to(a, vec3(0, 0, 100)), '90.00')
257-
assert.is.equal(angle_to(a, vec3(0, 0, -100)), '90.00')
258-
assert.is.equal(angle_to(a, vec3(-10, -10, 0)), '180.00')
259-
assert.is.equal(angle_to(a, vec3.unit_z), '90.00')
258+
assert.is.equal(angle_between(a, a), '0.00')
259+
assert.is.equal(angle_between(a, vec3(0, 0, 100)), '90.00')
260+
assert.is.equal(angle_between(a, vec3(0, 0, -100)), '90.00')
261+
assert.is.equal(angle_between(a, vec3(-10, -10, 0)), '180.00')
262+
assert.is.equal(angle_between(a, vec3.unit_z), '90.00')
260263
end)
261264
end)

0 commit comments

Comments
 (0)