Advertisement
C0BRA

Lua angle class

Oct 21st, 2012
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.89 KB | None | 0 0
  1. _R = _R or debug.getregistry()
  2.  
  3. _R.Angle = {}
  4. local meta = {}
  5.  
  6. function _R.Angle:Distance(other)
  7.     local p = self.p - other.p
  8.     local y = self.y - other.y
  9.     local r = self.r - other.r
  10.    
  11.     return math.sqrt(p*p + y*y + r*r)
  12. end
  13.  
  14. function meta:__mul(other)
  15.     if type(other) == "number" then
  16.         return Angle(self.p * other, self.y * other, self.r * other)
  17.     end
  18.    
  19.     return Angle(self.p * other.p, self.y * other.y, self.r * other.r)
  20. end
  21.  
  22. function meta:__add(other)
  23.     if type(other) == "number" then
  24.         return Angle(self.p + other, self.y + other, self.r + other)
  25.     end
  26.    
  27.     return Angle(self.p + other.p, self.y + other.y, self.r + other.r)
  28. end
  29.  
  30. function meta:__sub(other)
  31.     if type(other) == "number" then
  32.         return Angle(self.p - other, self.y - other, self.r - other)
  33.     end
  34.    
  35.     return Angle(self.p - other.p, self.y - other.y, self.r - other.r)
  36. end
  37.  
  38. function meta:__div(other)
  39.     if type(other) == "number" then
  40.         return Angle(self.p / other, self.y / other, self.r / other)
  41.     end
  42.    
  43.     return Angle(self.p / other.p, self.y / other.y, self.r / other.r)
  44. end
  45.  
  46. function meta:__pow(o)
  47.     if type(o) ~= "number" then
  48.         error("power not a number!")
  49.     end
  50.     return Angle(self.p ^ o, self.y ^ o, self.r ^ o)
  51. end
  52.  
  53. function meta:__unm()
  54.     return Angle(-self.p, -self.y, -self.r)
  55. end
  56.  
  57. function meta:__eq(o)
  58.     return self.p == o.p and self.y == o.y and self.r == o.r
  59. end
  60.  
  61. function meta:__tostring()
  62.     return tostring(self.p) .. ", " .. tostring(self.y) .. ", " .. tostring(self.r)
  63. end
  64.  
  65. local members = { p = true, y = true, r = true }
  66.  
  67. function meta:__newindex(k, v)
  68.     if members[k] then
  69.         local nv = v % 360
  70.         rawset(self._m, k, nv)
  71.     end
  72. end
  73.  
  74. function meta:__index(k)
  75.     if not members[k] then
  76.         return _R.Angle[k]
  77.     end
  78.     return self._m[k]
  79. end
  80.  
  81.  
  82. function Angle(p, y, r)
  83.     local ret = {}
  84.     ret._m = {}
  85.    
  86.     setmetatable(ret, meta)
  87.    
  88.     ret.p = p or 0
  89.     ret.y = y or 0
  90.     ret.r = r or 0
  91.    
  92.     return ret
  93. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement