Justus

Vector class

Feb 24th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.11 KB | None | 0 0
  1. Vector = {}
  2. Vector.__index = Vector
  3. setmetatable(Vector, {__call = function(tab, ...) local t = setmetatable({}, Vector) t:constructor(...) return t end})
  4.  
  5. function Vector:constructor(x, y, z)
  6.     if tonumber(x) and tonumber(y) and tonumber(z) then
  7.         self.X, self.Y, self.Z = tonumber(x), tonumber(y), tonumber(z)
  8.     else
  9.         self.X, self.Y, self.Z = 0, 0, 0
  10.     end
  11. end
  12.  
  13. function Vector:add(vec)
  14.     return Vector(self.X + vec.X, self.Y + vec.Y, self.Z + vec.Z)
  15. end
  16.  
  17. function Vector:sub(vec)
  18.     return Vector(self.X - vec.X, self.Y - vec.Y, self.Z - vec.Z)
  19. end
  20.  
  21. function Vector:mul(vecOrScalar)
  22.     if type(vecOrScalar) == "table" then
  23.         local vec = vecOrScalar
  24.         return Vector(self.X * vec.X, self.Y * vec.Y, self.Z * vec.Z)
  25.     elseif type(vecOrScalar) == "number" then
  26.         local scalar = vecOrScalar
  27.         return Vector(self.X * scalar, self.Y * scalar, self.Z * scalar)
  28.     else
  29.         error("Invalid type @ Vector.mul")
  30.     end
  31. end
  32.  
  33. function Vector:div(vecOrScalar)
  34.     if type(vecOrScalar) == "table" then
  35.         local vec = vecOrScalar
  36.         return Vector(self.X / vec.X, self.Y / vec.Y, self.Z / vec.Z)
  37.     elseif type(vecOrScalar) == "number" then
  38.         local scalar = vecOrScalar
  39.         return Vector(self.X / scalar, self.Y / scalar, self.Z / scalar)
  40.     else
  41.         error("Invalid type @ Vector.div")
  42.     end
  43. end
  44.  
  45. function Vector:invert()
  46.     return Vector(-self.X, -self.Y, -self.Z)
  47. end
  48.  
  49. function Vector:equalTo(vec)
  50.     return (self.X == vec.X and self.Y == vec.Y and self.Z == vec.Z)
  51. end
  52.  
  53. function Vector:lt(vec) -- is there an operation like this?
  54.     return (self.X < vec.X and self.Y < vec.Y and self.Z < vec.Z)
  55. end
  56.  
  57. function Vector:le(vec)
  58.     return (self.X <= vec.X and self.Y <= vec.Y and self.Z <= vec.Z)
  59. end
  60.  
  61. function Vector:length()
  62.     return math.sqrt(self.X^2 + self.Y^2 + self.Z^2)
  63. end
  64.  
  65. function Vector:norm()
  66.     return self:div(self:length())
  67.  
  68. function Vector:dotP(vec) -- scalar product
  69.     return (self.X * vec.X + self.Y * vec.Y + self.Z * vec.Z)
  70. end
  71.  
  72. function Vector:crossP(vec) -- cross product
  73.     return Vector(self.Y * vec.Z - self.Z * vec.Y, self.Z * vec.X - self.X * vec.Z, self.X * vec.Y - self.Y * vec.X)
  74. end
  75.  
  76. function Vector:isColinear(vec)
  77.     local factor = vec.X / self.X
  78.     return (self.Y * factor == vec.Y and self.Z * factor == vec.Z)
  79. end
  80.  
  81. function Vector:isOrthogonal(vec)
  82.     return (self:dotP(vec) == 0)
  83. end
  84.  
  85. function Vector:angle(vec)
  86.     return math.deg(math.acos(self:dotP(vec) / ( self:length() * vec:length() )))
  87. end
  88.  
  89. function Vector:tostring()
  90.     return ("X = %f, Y = %f; Z = %f"):format(self.X, self.Y, self.Z)
  91. end
  92.  
  93.  
  94. -- Operators
  95. function Vector.__add(vec1, vec2)
  96.     return vec1:add(vec2)
  97. end
  98.  
  99. function Vector.__sub(vec1, vec2)
  100.     return vec1:sub(vec2)
  101. end
  102.  
  103. function Vector.__mul(vec1, vecOrScalar)
  104.     return vec1:mul(vecOrScalar)
  105. end
  106.  
  107. function Vector.__div(vec1, vecOrScalar)
  108.     return vec1:div(vecOrScalar)
  109. end
  110.  
  111. function Vector.__unm(vec)
  112.     return vec:invert()
  113. end
  114.  
  115. function Vector.__eq(vec1, vec2)
  116.     return vec1:equalTo(vec2)
  117. end
  118.  
  119. function Vector.__lt(vec1, vec2)
  120.     return vec1:lt(vec2)
  121. end
  122.  
  123. function Vector.__le(vec1, vec2)
  124.     return vec2:le(vec2)
  125. end
  126.  
  127. function Vector.__tostring(vec)
  128.     return vec:tostring()
  129. end
Advertisement
Add Comment
Please, Sign In to add comment