dbedc8f87be2ecb2055b4cf6f81775944df73d6cb26770ece4d091590a5f562f5050f1dee7c487e0677608e8079cb42d83b4cc2749afd494a734c225d7e7a9 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /**
  2. * @deprecated
  3. * Use zrender.Point class instead
  4. */
  5. import { MatrixArray } from './matrix';
  6. /* global Float32Array */
  7. // const ArrayCtor = typeof Float32Array === 'undefined'
  8. // ? Array
  9. // : Float32Array;
  10. export type VectorArray = number[]
  11. /**
  12. * 创建一个向量
  13. */
  14. export function create(x?: number, y?: number): VectorArray {
  15. if (x == null) {
  16. x = 0;
  17. }
  18. if (y == null) {
  19. y = 0;
  20. }
  21. return [x, y];
  22. }
  23. /**
  24. * 复制向量数据
  25. */
  26. export function copy<T extends VectorArray>(out: T, v: VectorArray): T {
  27. out[0] = v[0];
  28. out[1] = v[1];
  29. return out;
  30. }
  31. /**
  32. * 克隆一个向量
  33. */
  34. export function clone(v: VectorArray): VectorArray {
  35. return [v[0], v[1]];
  36. }
  37. /**
  38. * 设置向量的两个项
  39. */
  40. export function set<T extends VectorArray>(out: T, a: number, b: number): T {
  41. out[0] = a;
  42. out[1] = b;
  43. return out;
  44. }
  45. /**
  46. * 向量相加
  47. */
  48. export function add<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  49. out[0] = v1[0] + v2[0];
  50. out[1] = v1[1] + v2[1];
  51. return out;
  52. }
  53. /**
  54. * 向量缩放后相加
  55. */
  56. export function scaleAndAdd<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray, a: number): T {
  57. out[0] = v1[0] + v2[0] * a;
  58. out[1] = v1[1] + v2[1] * a;
  59. return out;
  60. }
  61. /**
  62. * 向量相减
  63. */
  64. export function sub<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  65. out[0] = v1[0] - v2[0];
  66. out[1] = v1[1] - v2[1];
  67. return out;
  68. }
  69. /**
  70. * 向量长度
  71. */
  72. export function len(v: VectorArray): number {
  73. return Math.sqrt(lenSquare(v));
  74. }
  75. export const length = len;
  76. /**
  77. * 向量长度平方
  78. */
  79. export function lenSquare(v: VectorArray): number {
  80. return v[0] * v[0] + v[1] * v[1];
  81. }
  82. export const lengthSquare = lenSquare;
  83. /**
  84. * 向量乘法
  85. */
  86. export function mul<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  87. out[0] = v1[0] * v2[0];
  88. out[1] = v1[1] * v2[1];
  89. return out;
  90. }
  91. /**
  92. * 向量除法
  93. */
  94. export function div<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  95. out[0] = v1[0] / v2[0];
  96. out[1] = v1[1] / v2[1];
  97. return out;
  98. }
  99. /**
  100. * 向量点乘
  101. */
  102. export function dot(v1: VectorArray, v2: VectorArray) {
  103. return v1[0] * v2[0] + v1[1] * v2[1];
  104. }
  105. /**
  106. * 向量缩放
  107. */
  108. export function scale<T extends VectorArray>(out: T, v: VectorArray, s: number): T {
  109. out[0] = v[0] * s;
  110. out[1] = v[1] * s;
  111. return out;
  112. }
  113. /**
  114. * 向量归一化
  115. */
  116. export function normalize<T extends VectorArray>(out: T, v: VectorArray): T {
  117. const d = len(v);
  118. if (d === 0) {
  119. out[0] = 0;
  120. out[1] = 0;
  121. }
  122. else {
  123. out[0] = v[0] / d;
  124. out[1] = v[1] / d;
  125. }
  126. return out;
  127. }
  128. /**
  129. * 计算向量间距离
  130. */
  131. export function distance(v1: VectorArray, v2: VectorArray): number {
  132. return Math.sqrt(
  133. (v1[0] - v2[0]) * (v1[0] - v2[0])
  134. + (v1[1] - v2[1]) * (v1[1] - v2[1])
  135. );
  136. }
  137. export const dist = distance;
  138. /**
  139. * 向量距离平方
  140. */
  141. export function distanceSquare(v1: VectorArray, v2: VectorArray): number {
  142. return (v1[0] - v2[0]) * (v1[0] - v2[0])
  143. + (v1[1] - v2[1]) * (v1[1] - v2[1]);
  144. }
  145. export const distSquare = distanceSquare;
  146. /**
  147. * 求负向量
  148. */
  149. export function negate<T extends VectorArray>(out: T, v: VectorArray): T {
  150. out[0] = -v[0];
  151. out[1] = -v[1];
  152. return out;
  153. }
  154. /**
  155. * 插值两个点
  156. */
  157. export function lerp<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray, t: number): T {
  158. out[0] = v1[0] + t * (v2[0] - v1[0]);
  159. out[1] = v1[1] + t * (v2[1] - v1[1]);
  160. return out;
  161. }
  162. /**
  163. * 矩阵左乘向量
  164. */
  165. export function applyTransform<T extends VectorArray>(out: T, v: VectorArray, m: MatrixArray): T {
  166. const x = v[0];
  167. const y = v[1];
  168. out[0] = m[0] * x + m[2] * y + m[4];
  169. out[1] = m[1] * x + m[3] * y + m[5];
  170. return out;
  171. }
  172. /**
  173. * 求两个向量最小值
  174. */
  175. export function min<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  176. out[0] = Math.min(v1[0], v2[0]);
  177. out[1] = Math.min(v1[1], v2[1]);
  178. return out;
  179. }
  180. /**
  181. * 求两个向量最大值
  182. */
  183. export function max<T extends VectorArray>(out: T, v1: VectorArray, v2: VectorArray): T {
  184. out[0] = Math.max(v1[0], v2[0]);
  185. out[1] = Math.max(v1[1], v2[1]);
  186. return out;
  187. }