CoVector2 = CoVector2 or BaseClass() local CoVector2 = CoVector2 function CoVector2:__init(x, y) self.x = x self.y = y -- local now_time = Status.NowTime -- if CoVector2.cache_time == nil or CoVector2.cache_time < now_time then -- -- if CoVector2.call_num == 1 then -- print("创建Vector2个数", CoVector2.call_num, now_time) -- -- print(xxxxx+3) -- -- end -- CoVector2.call_num = 0 -- CoVector2.cache_time = now_time -- end -- CoVector2.call_num = CoVector2.call_num + 1 -- if CoVector2.call_num >1 then -- -- print("创建Vector2个数", CoVector2.call_num, now_time) -- print(xxxxx+3) -- end local meta_table = getmetatable(self) meta_table.__add = function (v1, v2) return CoVector2.New(v1.x + v2.x, v1.y + v2.y) end meta_table.__sub = function (v1, v2) return CoVector2.New(v1.x - v2.x, v1.y - v2.y) end meta_table.__mul = function (v1, v2) local f = tonumber(v2) if f ~= nil then return CoVector2.New(v1.x * f, v1.y * f) else -- print("~+~+~+ co.Vector2 相乘2", v1.x, v1.y, v2.x, v2.y) return CoVector2.New(v1.x * v2.x, v1.y * v2.y) end end meta_table.__div = function (v1, v2) local f = tonumber(v2) if f ~= nil then return CoVector2.New(v1.x / f, v1.y / f) else return CoVector2.New(v1.x / v2.x, v1.y / v2.y) end end meta_table.__tostring = function (v1) return string.format("co.Vector2(%.4f, %.4f)", v1.x, v1.y) end end function CoVector2:__defineVar() return { _class_type = self, --_cid = self._id, _iid = _in_obj_ins_id, x = 0, y = 0 } end function CoVector2:__delete() -- body end function CoVector2:copyVector2(v) self.x, self.y = v.x, v.y end function CoVector2:setXY(x, y) self.x, self.y = x, y end function CoVector2:Mul(x, y) y = y or x if x and y then self.x, self.y = self.x * x, self.y * y end end function CoVector2:length() return math.sqrt(self.x * self.x + self.y * self.y) end function CoVector2:squaredLength() return self.x * self.x + self.y * self.y end --把对象存进缓存队列 function CoVector2:DeleteV() local free_num = co.free_vector2_num if co.free_vector2_num < 100 then co.free_vector2_num = free_num + 1 co.free_vector2_list[free_num+1] = self end end function CoVector2:normalise() local l = math.sqrt(self.x * self.x + self.y * self.y) if l >= 1e-6 then local f = 1 / l self.x = self.x * f self.y = self.y * f end return l end function CoVector2:distance(v2) local dx = self.x - v2.x local dy = self.y - v2.y return math.sqrt(dx * dx + dy * dy) end function CoVector2:squaredDistance(v2) local dx = self.x - v2.x local dy = self.y - v2.y return dx * dx + dy * dy end function CoVector2:dotProduct(v2) return self.x * v2.x + self.y * v2.y end function CoVector2:crossProduct(v2) return self.x * v2.y - self.y * v2.x end function CoVector2:angleBetween(v2) local lenProduct = self:length() * v2:length() if lenProduct < 1e-6 then lenProduct = 1e-6 end local f = self:dotProduct(v2) / lenProduct if f < -1 then f = -1 elseif f > 1 then f = 1 end return math.acos(f) end --返回值顺时针方向为正角度 function CoVector2:angleTo(v2) local angle = self:angleBetween(v2) if self:crossProduct(v2) < 0 then angle = math.pi * 2 - angle end return angle end function CoVector2:toGameVector2() if self.game_vector2 == nil then self.game_vector2 = Game.Vector2(self.x, self.y) else self.game_vector2.x = self.x self.game_vector2.y = self.y end return self.game_vector2 end --沿着dir方向移动dist距离 function CoVector2:Move(dir, dist) self.x = self.x + dir.x * dist self.y = self.y + dir.y * dist end --把V1向量按照“X轴正方向转到V2方向”的方式旋转 function CoVector2:rotateFromXAxisTo(v2, proj_modify) local r1 = co.XAix:angleTo(self) local r2 = co.XAix:angleTo(v2) local r = r1 + r2 local l = self:length() local cos_r = math.cos(r) local sin_r = math.sin(r) --在转到90度的时候要缩短一些,以产生透视效果 local p = proj_modify and (cos_r * 0.2929 + 0.7071) or 1 self.x, self.y = cos_r * l, sin_r * l * p return self end --radian为正数时顺时针旋转 function CoVector2:rotate(radian ) local r = co.XAix:angleTo(self) r = r + radian local l = self:length() local cos_r = math.cos(r) local sin_r = math.sin(r) self.x, self.y = cos_r * l, sin_r * l return self end