Dot2_Tips.lua 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. --------------------------------------------------------------------------------
  2. -- Copyright (c) 2015 , 蒙占志(topameng) topameng@gmail.com
  3. -- All rights reserved.
  4. -- Use, modification and distribution are subject to the "MIT License"
  5. --------------------------------------------------------------------------------
  6. -- added by wsh @ 2017-12-28
  7. -- 注意:
  8. -- 1、已经被修改,别从tolua轻易替换来做升级
  9. local sqrt = math.sqrt
  10. local setmetatable = setmetatable
  11. local rawget = rawget
  12. local math = math
  13. local acos = math.acos
  14. local max = math.max
  15. ---@class Dot2
  16. ---@field public x number
  17. ---@field public z number
  18. ---@field zero Dot2
  19. ---@field normalized Dot2
  20. ---@field abs Dot2
  21. ---@field sign Dot2
  22. Dot2 = {}
  23. local _getter = {}
  24. Dot2.isValueType = true
  25. Dot2.__index = function(t,k)
  26. local var = rawget(Dot2, k)
  27. if var ~= nil then
  28. return var
  29. end
  30. var = rawget(_getter, k)
  31. if var ~= nil then
  32. return var(t)
  33. end
  34. return nil
  35. end
  36. Dot2.__call = function(t, x, z)
  37. return setmetatable({x = x or 0, z = z or 0}, Dot2)
  38. end
  39. function Dot2.New(x, z)
  40. return setmetatable({x = x or 0, z = z or 0}, Dot2)
  41. end
  42. function Dot2:Set(x,z)
  43. self.x = x or 0
  44. self.z = z or 0
  45. end
  46. function Dot2:Get()
  47. return self.x, self.z
  48. end
  49. function Dot2:SqrMagnitude()
  50. return self.x * self.x + self.z * self.z
  51. end
  52. function Dot2.Abs(v)
  53. v.x = math.abs(v.x)
  54. v.z = math.abs(v.z)
  55. return setmetatable({x = v.x, z = v.z}, Dot2)
  56. end
  57. function Dot2:Clone()
  58. return setmetatable({x = self.x, z = self.z}, Dot2)
  59. end
  60. function Dot2.Normalize(v)
  61. local x,z = Dot2.GetNormalizeXZ(v)
  62. return setmetatable({x = x, z = z}, Dot2)
  63. end
  64. function Dot2.GetNormalizeXZ(v)
  65. local x = v.x
  66. local z = v.z
  67. local magnitude = sqrt(x * x + z * z)
  68. if magnitude > 1e-05 then
  69. x = x / magnitude
  70. z = z / magnitude
  71. else
  72. x = 0
  73. z = 0
  74. end
  75. return x,z
  76. end
  77. function Dot2.Sign(v)
  78. return setmetatable({x =math.sign(v.x), z = math.sign(v.z)}, Dot2)
  79. end
  80. function Dot2:SetNormalize()
  81. local magnitude = sqrt(self.x * self.x + self.z * self.z)
  82. if magnitude > 1e-05 then
  83. self.x = self.x / magnitude
  84. self.z = self.z / magnitude
  85. else
  86. self.x = 0
  87. self.z = 0
  88. end
  89. return self
  90. end
  91. function Dot2.Dot(lhs, rhs)
  92. return lhs.x * rhs.x + lhs.z * rhs.z
  93. end
  94. function Dot2.Angle(from, to)
  95. local x1,y1 = from.x, from.z
  96. local d = sqrt(x1 * x1 + y1 * y1)
  97. if d > 1e-5 then
  98. x1 = x1/d
  99. y1 = y1/d
  100. else
  101. x1,y1 = 0,0
  102. end
  103. local x2,y2 = to.x, to.z
  104. d = sqrt(x2 * x2 + y2 * y2)
  105. if d > 1e-5 then
  106. x2 = x2/d
  107. y2 = y2/d
  108. else
  109. x2,y2 = 0,0
  110. end
  111. d = x1 * x2 + y1 * y2
  112. if d < -1 then
  113. d = -1
  114. elseif d > 1 then
  115. d = 1
  116. end
  117. return acos(d) * 57.29578
  118. end
  119. function Dot2.Magnitude(v)
  120. return sqrt(v.x * v.x + v.z * v.z)
  121. end
  122. function Dot2.Reflect(dir, normal)
  123. local dx = dir.x
  124. local dy = dir.z
  125. local nx = normal.x
  126. local ny = normal.z
  127. local s = -2 * (dx * nx + dy * ny)
  128. return setmetatable({x = s * nx + dx, z = s * ny + dy}, Dot2)
  129. end
  130. function Dot2.Distance(a, b)
  131. return sqrt((a.x - b.x) ^ 2 + (a.z - b.z) ^ 2)
  132. end
  133. function Dot2.DistanceXZ(a, b)
  134. return a.x - b.x,a.z - b.z
  135. end
  136. function Dot2.DistanceXZAbs(a, b)
  137. return Mathf.Abs(a.x - b.x),Mathf.Abs(a.z - b.z)
  138. end
  139. function Dot2.MaxDistance(a,b)
  140. local x = Mathf.Abs(a.x - b.x)
  141. local z = Mathf.Abs(a.z - b.z)
  142. return Mathf.Max(x,z)
  143. end
  144. function Dot2.DistancePow2(a, b)
  145. return(a.x - b.x) ^ 2 + (a.z - b.z)^2
  146. end
  147. function Dot2.Lerp(a, b, t)
  148. if t < 0 then
  149. t = 0
  150. elseif t > 1 then
  151. t = 1
  152. end
  153. return setmetatable({x = a.x + (b.x - a.x) * t, z = a.z + (b.z - a.z) * t}, Dot2)
  154. end
  155. function Dot2.LerpUnclamped(a, b, t)
  156. return setmetatable({x = a.x + (b.x - a.x) * t, z = a.z + (b.z - a.z) * t}, Dot2)
  157. end
  158. function Dot2.MoveTowards(current, target, maxDistanceDelta)
  159. local cx = current.x
  160. local cy = current.z
  161. local x = target.x - cx
  162. local z = target.z - cy
  163. local s = x * x + z * z
  164. if s > maxDistanceDelta * maxDistanceDelta and s ~= 0 then
  165. s = maxDistanceDelta / sqrt(s)
  166. return setmetatable({x = cx + x * s, z = cy + z * s}, Dot2)
  167. end
  168. return setmetatable({x = target.x, z = target.z}, Dot2)
  169. end
  170. function Dot2.ClampMagnitude(v, maxLength)
  171. local x = v.x
  172. local z = v.z
  173. local sqrMag = x * x + z * z
  174. if sqrMag > maxLength * maxLength then
  175. local mag = maxLength / sqrt(sqrMag)
  176. x = x * mag
  177. z = z * mag
  178. return setmetatable({x = x, z = z}, Dot2)
  179. end
  180. return setmetatable({x = x, z = z}, Dot2)
  181. end
  182. function Dot2.SmoothDamp(current, target, Velocity, smoothTime, maxSpeed, deltaTime)
  183. deltaTime = deltaTime or Time.deltaTime
  184. maxSpeed = maxSpeed or math.huge
  185. smoothTime = math.max(0.0001, smoothTime)
  186. local num = 2 / smoothTime
  187. local num2 = num * deltaTime
  188. num2 = 1 / (1 + num2 + 0.48 * num2 * num2 + 0.235 * num2 * num2 * num2)
  189. local tx = target.x
  190. local ty = target.z
  191. local cx = current.x
  192. local cy = current.z
  193. local vecx = cx - tx
  194. local vecy = cy - ty
  195. local m = vecx * vecx + vecy * vecy
  196. local n = maxSpeed * smoothTime
  197. if m > n * n then
  198. m = n / sqrt(m)
  199. vecx = vecx * m
  200. vecy = vecy * m
  201. end
  202. m = Velocity.x
  203. n = Velocity.z
  204. local vec3x = (m + num * vecx) * deltaTime
  205. local vec3y = (n + num * vecy) * deltaTime
  206. Velocity.x = (m - num * vec3x) * num2
  207. Velocity.z = (n - num * vec3y) * num2
  208. m = cx - vecx + (vecx + vec3x) * num2
  209. n = cy - vecy + (vecy + vec3y) * num2
  210. if (tx - cx) * (m - tx) + (ty - cy) * (n - ty) > 0 then
  211. m = tx
  212. n = ty
  213. Velocity.x = 0
  214. Velocity.z = 0
  215. end
  216. return setmetatable({x = m, z = n}, Dot2), Velocity
  217. end
  218. function Dot2.Max(a, b)
  219. return setmetatable({x = math.max(a.x, b.x), z = math.max(a.z, b.z)}, Dot2)
  220. end
  221. function Dot2.Min(a, b)
  222. return setmetatable({x = math.min(a.x, b.x), z = math.min(a.z, b.z)}, Dot2)
  223. end
  224. function Dot2.Scale(a, b)
  225. return setmetatable({x = a.x * b.x, z = a.z * b.z}, Dot2)
  226. end
  227. function Dot2:Div(d)
  228. self.x = self.x / d
  229. self.z = self.z / d
  230. return self
  231. end
  232. function Dot2:Mul(d)
  233. self.x = self.x * d
  234. self.z = self.z * d
  235. return self
  236. end
  237. function Dot2:Add(b)
  238. self.x = self.x + b.x
  239. self.z = self.z + b.z
  240. return self
  241. end
  242. function Dot2:Sub(b)
  243. self.x = self.x - b.x
  244. self.z = self.z - b.z
  245. return
  246. end
  247. function Dot2:AbsNoAlloc()
  248. self.x = Mathf.Abs(self.x)
  249. self.z = Mathf.Abs(self.z)
  250. end
  251. function Dot2:CopyFromSub(a, b)
  252. self.x = a.x - b.x
  253. self.z = a.z - b.z
  254. return
  255. end
  256. function Dot2:Copy(b)
  257. self.x = b.x
  258. self.z = b.z
  259. end
  260. function Dot2:Equals(other)
  261. return self.x == other.x and self.z == other.z
  262. end
  263. function Dot2:EqualsXZ(x,z)
  264. return self.x == x and self.z == z
  265. end
  266. function Dot2.IsZero(vec)
  267. return vec.x ==0 and vec.z == 0
  268. end
  269. Dot2.__tostring = function(self)
  270. return string.format("(%f,%f)", self.x, self.z)
  271. end
  272. Dot2.__div = function(va, d)
  273. return setmetatable({x = va.x / d, z = va.z / d}, Dot2)
  274. end
  275. Dot2.__mul = function(a, d)
  276. if type(d) == "number" then
  277. return setmetatable({x = a.x * d, z = a.z * d}, Dot2)
  278. else
  279. return setmetatable({x = a * d.x, z = a * d.z}, Dot2)
  280. end
  281. end
  282. Dot2.__add = function(a, b)
  283. return setmetatable({x = a.x + b.x, z = a.z + b.z}, Dot2)
  284. end
  285. Dot2.__sub = function(a, b)
  286. return setmetatable({x = a.x - b.x, z = a.z - b.z}, Dot2)
  287. end
  288. Dot2.__unm = function(v)
  289. return setmetatable({x = -v.x, z = -v.z}, Dot2)
  290. end
  291. Dot2.__eq = function(a,b)
  292. if not a.x or not b.x then
  293. return false
  294. end
  295. return a.x == b.x and a.z == b.z
  296. end
  297. _getter.up = function() return setmetatable({x = 0, z = 1}, Dot2) end
  298. _getter.right = function() return setmetatable({x = 1, z = 0}, Dot2) end
  299. _getter.zero = function() return setmetatable({x = 0, z = 0}, Dot2) end
  300. _getter.one = function() return setmetatable({x = 1, z = 1}, Dot2) end
  301. _getter.magnitude = Dot2.Magnitude
  302. _getter.normalized = Dot2.Normalize
  303. _getter.sign = Dot2.Sign
  304. _getter.sqrMagnitude = Dot2.SqrMagnitude
  305. _getter.abs = Dot2.Abs
  306. ---@param vec Vector4
  307. function Dot2:IsSelfMetatable(vec)
  308. return self.x == nil
  309. end
  310. setmetatable(Dot2, Dot2)
  311. Dot2.upNonAlloc = Dot2(0,1)
  312. Dot2.rightNonAlloc =Dot2(1,0)
  313. Dot2.zeroNonAlloc = Dot2(0,0)
  314. Dot2.oneNonAlloc = Dot2(1,1)