vector.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;
  2. /**
  3. * 创建一个向量
  4. * @param {number} [x=0]
  5. * @param {number} [y=0]
  6. * @return {Vector2}
  7. */
  8. function create(x, y) {
  9. var out = new ArrayCtor(2);
  10. if (x == null) {
  11. x = 0;
  12. }
  13. if (y == null) {
  14. y = 0;
  15. }
  16. out[0] = x;
  17. out[1] = y;
  18. return out;
  19. }
  20. /**
  21. * 复制向量数据
  22. * @param {Vector2} out
  23. * @param {Vector2} v
  24. * @return {Vector2}
  25. */
  26. function copy(out, v) {
  27. out[0] = v[0];
  28. out[1] = v[1];
  29. return out;
  30. }
  31. /**
  32. * 克隆一个向量
  33. * @param {Vector2} v
  34. * @return {Vector2}
  35. */
  36. function clone(v) {
  37. var out = new ArrayCtor(2);
  38. out[0] = v[0];
  39. out[1] = v[1];
  40. return out;
  41. }
  42. /**
  43. * 设置向量的两个项
  44. * @param {Vector2} out
  45. * @param {number} a
  46. * @param {number} b
  47. * @return {Vector2} 结果
  48. */
  49. function set(out, a, b) {
  50. out[0] = a;
  51. out[1] = b;
  52. return out;
  53. }
  54. /**
  55. * 向量相加
  56. * @param {Vector2} out
  57. * @param {Vector2} v1
  58. * @param {Vector2} v2
  59. */
  60. function add(out, v1, v2) {
  61. out[0] = v1[0] + v2[0];
  62. out[1] = v1[1] + v2[1];
  63. return out;
  64. }
  65. /**
  66. * 向量缩放后相加
  67. * @param {Vector2} out
  68. * @param {Vector2} v1
  69. * @param {Vector2} v2
  70. * @param {number} a
  71. */
  72. function scaleAndAdd(out, v1, v2, a) {
  73. out[0] = v1[0] + v2[0] * a;
  74. out[1] = v1[1] + v2[1] * a;
  75. return out;
  76. }
  77. /**
  78. * 向量相减
  79. * @param {Vector2} out
  80. * @param {Vector2} v1
  81. * @param {Vector2} v2
  82. */
  83. function sub(out, v1, v2) {
  84. out[0] = v1[0] - v2[0];
  85. out[1] = v1[1] - v2[1];
  86. return out;
  87. }
  88. /**
  89. * 向量长度
  90. * @param {Vector2} v
  91. * @return {number}
  92. */
  93. function len(v) {
  94. return Math.sqrt(lenSquare(v));
  95. }
  96. var length = len; // jshint ignore:line
  97. /**
  98. * 向量长度平方
  99. * @param {Vector2} v
  100. * @return {number}
  101. */
  102. function lenSquare(v) {
  103. return v[0] * v[0] + v[1] * v[1];
  104. }
  105. var lengthSquare = lenSquare;
  106. /**
  107. * 向量乘法
  108. * @param {Vector2} out
  109. * @param {Vector2} v1
  110. * @param {Vector2} v2
  111. */
  112. function mul(out, v1, v2) {
  113. out[0] = v1[0] * v2[0];
  114. out[1] = v1[1] * v2[1];
  115. return out;
  116. }
  117. /**
  118. * 向量除法
  119. * @param {Vector2} out
  120. * @param {Vector2} v1
  121. * @param {Vector2} v2
  122. */
  123. function div(out, v1, v2) {
  124. out[0] = v1[0] / v2[0];
  125. out[1] = v1[1] / v2[1];
  126. return out;
  127. }
  128. /**
  129. * 向量点乘
  130. * @param {Vector2} v1
  131. * @param {Vector2} v2
  132. * @return {number}
  133. */
  134. function dot(v1, v2) {
  135. return v1[0] * v2[0] + v1[1] * v2[1];
  136. }
  137. /**
  138. * 向量缩放
  139. * @param {Vector2} out
  140. * @param {Vector2} v
  141. * @param {number} s
  142. */
  143. function scale(out, v, s) {
  144. out[0] = v[0] * s;
  145. out[1] = v[1] * s;
  146. return out;
  147. }
  148. /**
  149. * 向量归一化
  150. * @param {Vector2} out
  151. * @param {Vector2} v
  152. */
  153. function normalize(out, v) {
  154. var d = len(v);
  155. if (d === 0) {
  156. out[0] = 0;
  157. out[1] = 0;
  158. } else {
  159. out[0] = v[0] / d;
  160. out[1] = v[1] / d;
  161. }
  162. return out;
  163. }
  164. /**
  165. * 计算向量间距离
  166. * @param {Vector2} v1
  167. * @param {Vector2} v2
  168. * @return {number}
  169. */
  170. function distance(v1, v2) {
  171. return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]));
  172. }
  173. var dist = distance;
  174. /**
  175. * 向量距离平方
  176. * @param {Vector2} v1
  177. * @param {Vector2} v2
  178. * @return {number}
  179. */
  180. function distanceSquare(v1, v2) {
  181. return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]);
  182. }
  183. var distSquare = distanceSquare;
  184. /**
  185. * 求负向量
  186. * @param {Vector2} out
  187. * @param {Vector2} v
  188. */
  189. function negate(out, v) {
  190. out[0] = -v[0];
  191. out[1] = -v[1];
  192. return out;
  193. }
  194. /**
  195. * 插值两个点
  196. * @param {Vector2} out
  197. * @param {Vector2} v1
  198. * @param {Vector2} v2
  199. * @param {number} t
  200. */
  201. function lerp(out, v1, v2, t) {
  202. out[0] = v1[0] + t * (v2[0] - v1[0]);
  203. out[1] = v1[1] + t * (v2[1] - v1[1]);
  204. return out;
  205. }
  206. /**
  207. * 矩阵左乘向量
  208. * @param {Vector2} out
  209. * @param {Vector2} v
  210. * @param {Vector2} m
  211. */
  212. function applyTransform(out, v, m) {
  213. var x = v[0];
  214. var y = v[1];
  215. out[0] = m[0] * x + m[2] * y + m[4];
  216. out[1] = m[1] * x + m[3] * y + m[5];
  217. return out;
  218. }
  219. /**
  220. * 求两个向量最小值
  221. * @param {Vector2} out
  222. * @param {Vector2} v1
  223. * @param {Vector2} v2
  224. */
  225. function min(out, v1, v2) {
  226. out[0] = Math.min(v1[0], v2[0]);
  227. out[1] = Math.min(v1[1], v2[1]);
  228. return out;
  229. }
  230. /**
  231. * 求两个向量最大值
  232. * @param {Vector2} out
  233. * @param {Vector2} v1
  234. * @param {Vector2} v2
  235. */
  236. function max(out, v1, v2) {
  237. out[0] = Math.max(v1[0], v2[0]);
  238. out[1] = Math.max(v1[1], v2[1]);
  239. return out;
  240. }
  241. exports.create = create;
  242. exports.copy = copy;
  243. exports.clone = clone;
  244. exports.set = set;
  245. exports.add = add;
  246. exports.scaleAndAdd = scaleAndAdd;
  247. exports.sub = sub;
  248. exports.len = len;
  249. exports.length = length;
  250. exports.lenSquare = lenSquare;
  251. exports.lengthSquare = lengthSquare;
  252. exports.mul = mul;
  253. exports.div = div;
  254. exports.dot = dot;
  255. exports.scale = scale;
  256. exports.normalize = normalize;
  257. exports.distance = distance;
  258. exports.dist = dist;
  259. exports.distanceSquare = distanceSquare;
  260. exports.distSquare = distSquare;
  261. exports.negate = negate;
  262. exports.lerp = lerp;
  263. exports.applyTransform = applyTransform;
  264. exports.min = min;
  265. exports.max = max;