Files
LeonOS/data/computercraft/lua/rom/apis/vector.lua

77 lines
1.6 KiB
Lua
Raw Normal View History

-- rc.vector
local vector = {}
local Vector = {}
function Vector:add(o)
return vector.new(self.x + o.x, self.y + o.y, self.z + o.z)
end
function Vector:sub(o)
return vector.new(self.x - o.x, self.y - o.y, self.z - o.z)
end
function Vector:mul(m)
return vector.new(self.x * m, self.y * m, self.z * m)
end
function Vector:div(m)
return vector.new(self.x / m, self.y / m, self.z / m)
end
function Vector:unm()
return vector.new(-self.x, -self.y, -self.z)
end
function Vector:dot(o)
return (self.x * o.x) + (self.y * o.y) + (self.z * o.z)
end
function Vector:cross(o)
return vector.new(
(self.y * o.z) - (self.z * o.y),
(self.z * o.x) - (self.x * o.z),
(self.x * o.y) - (self.y * o.x))
end
function Vector:length()
return math.sqrt((self.x * self.x) + (self.y * self.y) + (self.z * self.z))
end
function Vector:normalize()
return self:div(self:length())
end
function Vector:round(tolerance)
tolerance = tolerance or 1
local squared = tolerance * tolerance
return vector.new(
math.floor(self.x + (tolerance * 0.5)) / squared,
math.floor(self.y + (tolerance * 0.5)) / squared,
math.floor(self.z + (tolerance * 0.5)) / squared)
end
function Vector:tostring()
return string.format("%d,%d,%d", self.x, self.y, self.z)
end
function Vector:equals(o)
return self.x == o.x and self.y == o.y and self.z == o.z
end
Vector.eq = Vector.equals
local vect_mt = {
__index = Vector
}
for k, v in pairs(Vector) do
vect_mt["__"..k] = v
end
function vector.new(x, y, z)
return setmetatable({x = x or 0, y = y or 0, z = z or 0}, vect_mt)
end
return vector