mirror of
https://github.com/CCLeonOS/LeonOS.git
synced 2026-03-03 15:17:01 +00:00
77 lines
1.6 KiB
Lua
77 lines
1.6 KiB
Lua
|
|
-- 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
|