-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvector.lua
More file actions
63 lines (50 loc) · 1.4 KB
/
vector.lua
File metadata and controls
63 lines (50 loc) · 1.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
local vector = {}
local vector_mt = {__name = "vector", __index = vector}
local function new(x, y, z)
return setmetatable({
x = tonumber(x) or 0,
y = tonumber(y) or 0,
z = tonumber(z) or 0,
}, vector_mt)
end
function vector:add(v)
return new(self.x + v.x, self.y + v.y, self.z + v.z)
end
vector_mt.__add = vector.add
function vector:sub(v)
return new(self.x - v.x, self.y - v.y, self.z - v.z)
end
vector_mt.__sub = vector.sub
function vector:mul(k)
return new(self.x * k, self.y * k, self.z * k)
end
vector_mt.__mul = vector.mul
function vector:div(k)
return new(self.x / k, self.y / k, self.z / k)
end
vector_mt.__div = vector.div
function vector:unm()
return new(-self.x, -self.y, -self.z)
end
vector_mt.__unm = vector.unm
function vector:dot(v)
return self.x * v.x + self.y * v.y + self.z * v.z
end
function vector:cross(v)
return 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 vector:length()
return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z)
end
function vector:normalize()
return self:mul(1 / self:length())
end
function vector:tostring()
return self.x .. "," .. self.y .. "," .. self.z
end
vector_mt.__tostring = vector.tostring
function vector:equals(v)
return self.x == v.x and self.y == v.y and self.z == v.z
end
vector_mt.__eq = vector.eq
return {new = new}