luastd/Vector3.lua

108 lines
2.3 KiB
Lua

---@class Vector3
local Vector3 = {}
Vector3.__index = Vector3
function Vector3.new(x, y, z)
return setmetatable({ x = x or 0, y = y or 0, z = z or 0 }, Vector3)
end
function Vector3:copy()
return Vector3.new(self.x, self.y, self.z)
end
function Vector3:__tostring()
return string.format("Vector3(%.3f, %.3f, %.3f)", self.x, self.y, self.z)
end
function Vector3:add(v)
return Vector3.new(self.x + v.x, self.y + v.y, self.z + v.z)
end
function Vector3:sub(v)
return Vector3.new(self.x - v.x, self.y - v.y, self.z - v.z)
end
function Vector3:mul(scalar)
return Vector3.new(self.x * scalar, self.y * scalar, self.z * scalar)
end
function Vector3:div(scalar)
return Vector3.new(self.x / scalar, self.y / scalar, self.z / scalar)
end
function Vector3.__add(self, v)
return Vector3.new(self.x + v.x, self.y + v.y, self.z + v.z)
end
function Vector3.__sub(self, v)
return Vector3.new(self.x - v.x, self.y - v.y, self.z - v.z)
end
function Vector3:length()
return math.sqrt(self.x^2 + self.y^2 + self.z^2)
end
function Vector3:lengthSq()
return self.x^2 + self.y^2 + self.z^2
end
function Vector3:normalize()
local len = self:length()
if len == 0 then return Vector3.new(0, 0, 0) end
return Vector3.new(self.x / len, self.y / len, self.z / len)
end
function Vector3:dot(v)
return self.x * v.x + self.y * v.y + self.z * v.z
end
function Vector3:cross(v)
return Vector3.new(
self.y * v.z - self.z * v.y,
self.z * v.x - self.x * v.z,
self.x * v.y - self.y * v.x
)
end
function Vector3:distanceTo(v)
return (self:sub(v)):length()
end
function Vector3:distanceToSq(v)
return (self:sub(v)):lengthSq()
end
function Vector3:equals(v, epsilon)
epsilon = epsilon or 1e-5
return math.abs(self.x - v.x) < epsilon and
math.abs(self.y - v.y) < epsilon and
math.abs(self.z - v.z) < epsilon
end
function Vector3:map(func)
return Vector3.new(func(self.x), func(self.y), func(self.z))
end
function Vector3:toTable()
return { x = self.x, y = self.y, z = self.z }
end
function Vector3.fromTable(tbl)
return Vector3.new(tbl.x, tbl.y, tbl.z)
end
function Vector3.fromArray(tbl)
return Vector3.new(tbl[1], tbl[2], tbl[3])
end
function Vector3:unpack()
return self.x, self.y, self.z
end
function Vector3:toArray()
return {self.x, self.y, self.z}
end
return Vector3