-
Notifications
You must be signed in to change notification settings - Fork 0
/
vec.min.lua
1 lines (1 loc) · 3.49 KB
/
vec.min.lua
1
Vec={}Vec.protomt={}Vec.mt={}Vec.mt.__index=Vec;setmetatable(Vec,Vec.protomt)function Vec.protomt:__call(a,b,c)return Vec.from(a,b,c)end;function Vec.from(a,b,c)if type(a)=='table'then return Vec.from(a.x or a[1],a.y or a[2],a.z or a[3])end;local d={}d.x=a or 0;d.y=b or 0;d.z=c or 0;setmetatable(d,Vec.mt)return d end;function Vec.fromAngle(e)return Vec.from(math.cos(e or 0),math.sin(e or 0))end;function Vec.random2d()local e=math.random()*math.pi*2;return Vec.fromAngle(e)end;function Vec.random()return Vec(math.random()*2-1,math.random()*2-1,math.random()*2-1):norm()end;function Vec.mt:__add(d)return self:add(d,d,d)end;function Vec.mt:__sub(d)return self:sub(d,d,d)end;function Vec.mt:__unm()return self:mul(-1,-1,-1)end;function Vec.mt:__mul(d)return self:mul(d,d,d)end;function Vec.mt:__div(d)return self:div(d,d,d)end;function Vec.mt:__pow(d)return self:pow(d,d,d)end;function Vec.mt:__eq(d)return self:eq(d)end;function Vec.mt:__lt(d)return self:lt(d)end;function Vec.mt:__le(d)return self:le(d)end;function Vec.mt.__concat(e,f)return tostring(e)..tostring(f)end;function Vec.mt:__tostring()return self:toString()end;function Vec:set(a,b,c)local d=Vec.from(a or self.x,b or self.y,c or self.z)self.x=d.x;self.y=d.y;self.z=d.z;return self end;function Vec:toString()return'{'..self.x..', '..self.y..', '..self.z..'}'end;function Vec:toArray()return{self.x,self.y,self.z}end;function Vec:setAt(g,h)if g==1 then self.x=h elseif g==2 then self.y=h elseif g==3 then self.z=h end end;function Vec:getAt(g)if g==1 then return self.x elseif g==2 then return self.y elseif g==3 then return self.z end end;function Vec:add(a,b,c)local d=Vec.from(a or 0,b or 0,c or 0)return Vec.from(self.x+d.x,self.y+d.y,self.z+d.z)end;function Vec:sub(a,b,c)local d=Vec.from(a or 0,b or 0,c or 0)return Vec.from(self.x-d.x,self.y-d.y,self.z-d.z)end;function Vec:mul(a,b,c)local d=Vec.from(a or 1,b or 1,c or 1)return Vec.from(self.x*d.x,self.y*d.y,self.z*d.z)end;function Vec:div(a,b,c)local d=Vec.from(a or 1,b or 1,c or 1)return Vec.from(self.x/d.x,self.y/d.y,self.z/d.z)end;function Vec:pow(a,b,c)local d=Vec.from(a or 1,b or 1,c or 1)return Vec.from(self.x^d.x,self.y^d.y,self.z^d.z)end;function Vec:eq(a,b,c)local d=Vec.from(a,b,c)return self.x==d.x and self.y==d.y and self.z==d.z end;function Vec:lt(a,b,c)return self:len()<Vec.from(a,b,c):len()end;function Vec:le(a,b,c)return self:len()<=Vec.from(a,b,c):len()end;function Vec:gt(a,b,c)return self:len()>Vec.from(a,b,c):len()end;function Vec:ge(a,b,c)return self:len()>=Vec.from(a,b,c):len()end;function Vec:len()return math.sqrt(self:lenSq())end;function Vec:lenSq()return self.x^2+self.y^2+self.z^2 end;function Vec:dist(a,b,c)return math.sqrt(self:distSq(a,b,c))end;function Vec:distSq(a,b,c)local d=Vec.from(a,b,c)return self:sub(d):lenSq()end;function Vec:cross(a,b,c)local d=Vec.from(a,b,c)return Vec.from(self.y*d.z-self.z*d.y,self.z*d.x-self.x*d.z,self.x*d.y-self.y*d.x)end;function Vec:dot(a,b,c)local d=Vec.from(a,b,c)return self.x*d.x+self.y*d.y+self.z*d.z end;function Vec:norm()local i=self:len()return i==0 and self or self/i end;function Vec:limit(h)return self:norm():mul(h)end;function Vec:angle2d()return math.atan2(self.y,self.x)end;function Vec:angleBetween(a,b,c)local d=Vec.from(a,b,c)return math.acos(self:dot(d)/(self:len()*d:len()))end;function Vec:rotate2d(e)local d=Vec.from(self)local j=self:angle2d()+e;local k=self:len()d.x=math.cos(j)*k;d.y=math.sin(j)*k;return d end;function Vec:lerp(h,a,b,c)local d=Vec.from(a,b,c)return Vec.from(self.x+(d.x-self.x)*h,self.y+(d.y-self.y)*h,self.z+(d.z-self.z)*h)end