@visactor/vutils 1.0.24 → 1.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/README.zh-CN.md +12 -0
  2. package/REGRESSION.md +36 -0
  3. package/cjs/angle.d.ts +61 -0
  4. package/cjs/angle.js +73 -7
  5. package/cjs/angle.js.map +1 -1
  6. package/cjs/color/Color.d.ts +3 -0
  7. package/cjs/color/Color.js +64 -10
  8. package/cjs/color/Color.js.map +1 -1
  9. package/cjs/color/hexToRgb.d.ts +5 -0
  10. package/cjs/color/hexToRgb.js +5 -0
  11. package/cjs/color/hexToRgb.js.map +1 -1
  12. package/cjs/color/rgbToHsl.js +5 -1
  13. package/cjs/color/rgbToHsl.js.map +1 -1
  14. package/cjs/common/array.d.ts +43 -0
  15. package/cjs/common/array.js +44 -0
  16. package/cjs/common/array.js.map +1 -1
  17. package/cjs/common/bisect.d.ts +21 -0
  18. package/cjs/common/bisect.js +29 -0
  19. package/cjs/common/bisect.js.map +1 -1
  20. package/cjs/common/bootstrap.d.ts +5 -0
  21. package/cjs/common/bootstrap.js +22 -0
  22. package/cjs/common/bootstrap.js.map +1 -0
  23. package/cjs/common/clone.js +6 -0
  24. package/cjs/common/clone.js.map +1 -1
  25. package/cjs/common/cloneDeep.js +4 -1
  26. package/cjs/common/cloneDeep.js.map +1 -1
  27. package/cjs/common/correlation.d.ts +3 -0
  28. package/cjs/common/correlation.js +83 -0
  29. package/cjs/common/correlation.js.map +1 -0
  30. package/cjs/common/debounce.js +22 -4
  31. package/cjs/common/debounce.js.map +1 -1
  32. package/cjs/common/deviation.js +1 -2
  33. package/cjs/common/ecdf.d.ts +8 -0
  34. package/cjs/common/ecdf.js +11 -2
  35. package/cjs/common/ecdf.js.map +1 -1
  36. package/cjs/common/extent.d.ts +4 -0
  37. package/cjs/common/extent.js +4 -2
  38. package/cjs/common/extent.js.map +1 -1
  39. package/cjs/common/field.d.ts +6 -0
  40. package/cjs/common/field.js +3 -0
  41. package/cjs/common/field.js.map +1 -1
  42. package/cjs/common/has.d.ts +17 -0
  43. package/cjs/common/has.js +18 -1
  44. package/cjs/common/has.js.map +1 -1
  45. package/cjs/common/index.d.ts +5 -0
  46. package/cjs/common/index.js +34 -6
  47. package/cjs/common/index.js.map +1 -1
  48. package/cjs/common/interpolate.js +16 -3
  49. package/cjs/common/interpolate.js.map +1 -1
  50. package/cjs/common/isBase64.d.ts +6 -0
  51. package/cjs/common/isBase64.js +6 -0
  52. package/cjs/common/isBase64.js.map +1 -1
  53. package/cjs/common/isBoolean.d.ts +13 -0
  54. package/cjs/common/isBoolean.js +13 -1
  55. package/cjs/common/isBoolean.js.map +1 -1
  56. package/cjs/common/isEmpty.js +11 -1
  57. package/cjs/common/isEmpty.js.map +1 -1
  58. package/cjs/common/isEqual.js +19 -7
  59. package/cjs/common/isEqual.js.map +1 -1
  60. package/cjs/common/isFunction.d.ts +25 -0
  61. package/cjs/common/isFunction.js +27 -2
  62. package/cjs/common/isFunction.js.map +1 -1
  63. package/cjs/common/isNull.js +2 -1
  64. package/cjs/common/isNumber.d.ts +23 -0
  65. package/cjs/common/isNumber.js +23 -1
  66. package/cjs/common/isNumber.js.map +1 -1
  67. package/cjs/common/isNumeric.d.ts +25 -0
  68. package/cjs/common/isNumeric.js +25 -0
  69. package/cjs/common/isNumeric.js.map +1 -1
  70. package/cjs/common/isObject.d.ts +21 -0
  71. package/cjs/common/isObject.js +22 -0
  72. package/cjs/common/isObject.js.map +1 -1
  73. package/cjs/common/isObjectLike.d.ts +20 -0
  74. package/cjs/common/isObjectLike.js +21 -0
  75. package/cjs/common/isObjectLike.js.map +1 -1
  76. package/cjs/common/isPlainObject.d.ts +25 -0
  77. package/cjs/common/isPlainObject.js.map +1 -1
  78. package/cjs/common/isPrototype.js +1 -1
  79. package/cjs/common/isRegExp.js +1 -1
  80. package/cjs/common/isShallowEqual.js +1 -0
  81. package/cjs/common/isShallowEqual.js.map +1 -1
  82. package/cjs/common/isString.d.ts +13 -0
  83. package/cjs/common/isString.js +13 -1
  84. package/cjs/common/isString.js.map +1 -1
  85. package/cjs/common/isType.d.ts +6 -0
  86. package/cjs/common/isType.js +6 -0
  87. package/cjs/common/isType.js.map +1 -1
  88. package/cjs/common/isValidNumber.js.map +1 -1
  89. package/cjs/common/isValidUrl.js.map +1 -1
  90. package/cjs/common/kde.d.ts +28 -0
  91. package/cjs/common/kde.js +29 -5
  92. package/cjs/common/kde.js.map +1 -1
  93. package/cjs/common/mean.d.ts +2 -0
  94. package/cjs/common/mean.js +25 -0
  95. package/cjs/common/mean.js.map +1 -0
  96. package/cjs/common/merge.js +20 -4
  97. package/cjs/common/merge.js.map +1 -1
  98. package/cjs/common/mixin.js +14 -3
  99. package/cjs/common/mixin.js.map +1 -1
  100. package/cjs/common/normalQuantile.d.ts +5 -0
  101. package/cjs/common/normalQuantile.js +21 -0
  102. package/cjs/common/normalQuantile.js.map +1 -0
  103. package/cjs/common/number.d.ts +24 -0
  104. package/cjs/common/number.js +24 -1
  105. package/cjs/common/number.js.map +1 -1
  106. package/cjs/common/pad.d.ts +21 -0
  107. package/cjs/common/pad.js +21 -1
  108. package/cjs/common/pad.js.map +1 -1
  109. package/cjs/common/random.d.ts +3 -0
  110. package/cjs/common/random.js +13 -0
  111. package/cjs/common/random.js.map +1 -1
  112. package/cjs/common/regression-bootstrap.d.ts +14 -0
  113. package/cjs/common/regression-bootstrap.js +37 -0
  114. package/cjs/common/regression-bootstrap.js.map +1 -0
  115. package/cjs/common/regression-linear.d.ts +5 -0
  116. package/cjs/common/regression-linear.js +28 -39
  117. package/cjs/common/regression-linear.js.map +1 -1
  118. package/cjs/common/regression-logistic.d.ts +6 -0
  119. package/cjs/common/regression-logistic.js +25 -14
  120. package/cjs/common/regression-logistic.js.map +1 -1
  121. package/cjs/common/regression-lowess.d.ts +11 -1
  122. package/cjs/common/regression-lowess.js +125 -118
  123. package/cjs/common/regression-lowess.js.map +1 -1
  124. package/cjs/common/regression-polynomial.d.ts +1 -0
  125. package/cjs/common/regression-polynomial.js +24 -94
  126. package/cjs/common/regression-polynomial.js.map +1 -1
  127. package/cjs/common/regression-solver.d.ts +26 -0
  128. package/cjs/common/regression-solver.js +180 -0
  129. package/cjs/common/regression-solver.js.map +1 -0
  130. package/cjs/common/regression-utils.d.ts +13 -1
  131. package/cjs/common/regression-utils.js +27 -12
  132. package/cjs/common/regression-utils.js.map +1 -1
  133. package/cjs/common/throttle.js +3 -0
  134. package/cjs/common/throttle.js.map +1 -1
  135. package/cjs/common/toDate.js +22 -3
  136. package/cjs/common/toDate.js.map +1 -1
  137. package/cjs/common/uuid.d.ts +7 -0
  138. package/cjs/common/uuid.js +15 -1
  139. package/cjs/common/uuid.js.map +1 -1
  140. package/cjs/data-structure/bounds.d.ts +101 -0
  141. package/cjs/data-structure/bounds.js +74 -7
  142. package/cjs/data-structure/bounds.js.map +1 -1
  143. package/cjs/data-structure/hashTable.d.ts +4 -0
  144. package/cjs/data-structure/hashTable.js +11 -2
  145. package/cjs/data-structure/hashTable.js.map +1 -1
  146. package/cjs/data-structure/index.js +6 -2
  147. package/cjs/data-structure/index.js.map +1 -1
  148. package/cjs/data-structure/matrix.d.ts +91 -0
  149. package/cjs/data-structure/matrix.js +52 -4
  150. package/cjs/data-structure/matrix.js.map +1 -1
  151. package/cjs/data-structure/point.d.ts +3 -0
  152. package/cjs/data-structure/point.js +5 -1
  153. package/cjs/data-structure/point.js.map +1 -1
  154. package/cjs/dom.d.ts +36 -0
  155. package/cjs/dom.js +43 -1
  156. package/cjs/dom.js.map +1 -1
  157. package/cjs/fmin/blas1.js +10 -1
  158. package/cjs/fmin/blas1.js.map +1 -1
  159. package/cjs/fmin/conjugate-gradient.js +18 -3
  160. package/cjs/fmin/conjugate-gradient.js.map +1 -1
  161. package/cjs/fmin/linesearch.js +15 -1
  162. package/cjs/fmin/linesearch.js.map +1 -1
  163. package/cjs/fmin/nelder-mead.d.ts +1 -0
  164. package/cjs/fmin/nelder-mead.js +30 -10
  165. package/cjs/fmin/nelder-mead.js.map +1 -1
  166. package/cjs/format/number/formatDecimal.js +9 -1
  167. package/cjs/format/number/formatDecimal.js.map +1 -1
  168. package/cjs/format/number/formatGroup.js +7 -0
  169. package/cjs/format/number/formatGroup.js.map +1 -1
  170. package/cjs/format/number/formatPrefixAuto.js +8 -0
  171. package/cjs/format/number/formatPrefixAuto.js.map +1 -1
  172. package/cjs/format/number/formatRounded.js +7 -0
  173. package/cjs/format/number/formatRounded.js.map +1 -1
  174. package/cjs/format/number/formatTrim.js +7 -0
  175. package/cjs/format/number/formatTrim.js.map +1 -1
  176. package/cjs/format/number/number.js +39 -9
  177. package/cjs/format/number/number.js.map +1 -1
  178. package/cjs/format/time.js +23 -6
  179. package/cjs/format/time.js.map +1 -1
  180. package/cjs/geo/circle-intersection.d.ts +12 -0
  181. package/cjs/geo/circle-intersection.js +54 -9
  182. package/cjs/geo/circle-intersection.js.map +1 -1
  183. package/cjs/geo/constant.js +8 -1
  184. package/cjs/geo/constant.js.map +1 -1
  185. package/cjs/geo/invariant.d.ts +22 -0
  186. package/cjs/geo/invariant.js +24 -1
  187. package/cjs/geo/invariant.js.map +1 -1
  188. package/cjs/graphics/algorithm/aabb.js +7 -3
  189. package/cjs/graphics/algorithm/aabb.js.map +1 -1
  190. package/cjs/graphics/algorithm/intersect.d.ts +48 -0
  191. package/cjs/graphics/algorithm/intersect.js +75 -7
  192. package/cjs/graphics/algorithm/intersect.js.map +1 -1
  193. package/cjs/graphics/bounds-util.js +4 -2
  194. package/cjs/graphics/bounds-util.js.map +1 -1
  195. package/cjs/graphics/graph-util.js +4 -0
  196. package/cjs/graphics/graph-util.js.map +1 -1
  197. package/cjs/graphics/index.js +7 -4
  198. package/cjs/graphics/index.js.map +1 -1
  199. package/cjs/graphics/polygon.d.ts +12 -0
  200. package/cjs/graphics/polygon.js +28 -5
  201. package/cjs/graphics/polygon.js.map +1 -1
  202. package/cjs/graphics/text/measure/interface.d.ts +12 -0
  203. package/cjs/graphics/text/measure/textMeasure.d.ts +23 -0
  204. package/cjs/graphics/text/measure/textMeasure.js +50 -22
  205. package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
  206. package/cjs/graphics/text/measure/util.js +1 -0
  207. package/cjs/graphics/text/measure/util.js.map +1 -1
  208. package/cjs/graphics/text/stringWidth.js +7 -3
  209. package/cjs/graphics/text/stringWidth.js.map +1 -1
  210. package/cjs/index.d.ts +6 -0
  211. package/cjs/index.js +19 -4
  212. package/cjs/index.js.map +1 -1
  213. package/cjs/logger.js +12 -2
  214. package/cjs/logger.js.map +1 -1
  215. package/cjs/lru.js +14 -6
  216. package/cjs/lru.js.map +1 -1
  217. package/cjs/math.d.ts +9 -0
  218. package/cjs/math.js +10 -0
  219. package/cjs/math.js.map +1 -1
  220. package/cjs/padding.d.ts +5 -0
  221. package/cjs/padding.js +5 -0
  222. package/cjs/padding.js.map +1 -1
  223. package/cjs/time/formatUtils.d.ts +6 -0
  224. package/cjs/time/formatUtils.js +7 -0
  225. package/cjs/time/formatUtils.js.map +1 -1
  226. package/dist/index.js +2035 -411
  227. package/dist/index.min.js +128 -1
  228. package/es/angle.d.ts +61 -0
  229. package/es/angle.js +66 -10
  230. package/es/angle.js.map +1 -1
  231. package/es/color/Color.d.ts +3 -0
  232. package/es/color/Color.js +64 -9
  233. package/es/color/Color.js.map +1 -1
  234. package/es/color/hexToRgb.d.ts +5 -0
  235. package/es/color/hexToRgb.js +5 -0
  236. package/es/color/hexToRgb.js.map +1 -1
  237. package/es/color/rgbToHsl.js +5 -1
  238. package/es/color/rgbToHsl.js.map +1 -1
  239. package/es/common/array.d.ts +43 -0
  240. package/es/common/array.js +44 -8
  241. package/es/common/array.js.map +1 -1
  242. package/es/common/bisect.d.ts +21 -0
  243. package/es/common/bisect.js +29 -4
  244. package/es/common/bisect.js.map +1 -1
  245. package/es/common/bootstrap.d.ts +5 -0
  246. package/es/common/bootstrap.js +14 -0
  247. package/es/common/bootstrap.js.map +1 -0
  248. package/es/common/clone.js +6 -0
  249. package/es/common/clone.js.map +1 -1
  250. package/es/common/cloneDeep.js +4 -1
  251. package/es/common/cloneDeep.js.map +1 -1
  252. package/es/common/correlation.d.ts +3 -0
  253. package/es/common/correlation.js +77 -0
  254. package/es/common/correlation.js.map +1 -0
  255. package/es/common/debounce.js +22 -4
  256. package/es/common/debounce.js.map +1 -1
  257. package/es/common/deviation.js +1 -2
  258. package/es/common/ecdf.d.ts +8 -0
  259. package/es/common/ecdf.js +11 -1
  260. package/es/common/ecdf.js.map +1 -1
  261. package/es/common/extent.d.ts +4 -0
  262. package/es/common/extent.js +8 -3
  263. package/es/common/extent.js.map +1 -1
  264. package/es/common/field.d.ts +6 -0
  265. package/es/common/field.js +3 -1
  266. package/es/common/field.js.map +1 -1
  267. package/es/common/has.d.ts +17 -0
  268. package/es/common/has.js +18 -1
  269. package/es/common/has.js.map +1 -1
  270. package/es/common/index.d.ts +5 -0
  271. package/es/common/index.js +24 -0
  272. package/es/common/index.js.map +1 -1
  273. package/es/common/interpolate.js +16 -3
  274. package/es/common/interpolate.js.map +1 -1
  275. package/es/common/isBase64.d.ts +6 -0
  276. package/es/common/isBase64.js +6 -0
  277. package/es/common/isBase64.js.map +1 -1
  278. package/es/common/isBoolean.d.ts +13 -0
  279. package/es/common/isBoolean.js +13 -1
  280. package/es/common/isBoolean.js.map +1 -1
  281. package/es/common/isEmpty.js +11 -1
  282. package/es/common/isEmpty.js.map +1 -1
  283. package/es/common/isEqual.js +19 -7
  284. package/es/common/isEqual.js.map +1 -1
  285. package/es/common/isFunction.d.ts +25 -0
  286. package/es/common/isFunction.js +27 -2
  287. package/es/common/isFunction.js.map +1 -1
  288. package/es/common/isNull.js +2 -1
  289. package/es/common/isNumber.d.ts +23 -0
  290. package/es/common/isNumber.js +23 -1
  291. package/es/common/isNumber.js.map +1 -1
  292. package/es/common/isNumeric.d.ts +25 -0
  293. package/es/common/isNumeric.js +25 -0
  294. package/es/common/isNumeric.js.map +1 -1
  295. package/es/common/isObject.d.ts +21 -0
  296. package/es/common/isObject.js +22 -0
  297. package/es/common/isObject.js.map +1 -1
  298. package/es/common/isObjectLike.d.ts +20 -0
  299. package/es/common/isObjectLike.js +21 -0
  300. package/es/common/isObjectLike.js.map +1 -1
  301. package/es/common/isPlainObject.d.ts +25 -0
  302. package/es/common/isPlainObject.js +26 -0
  303. package/es/common/isPlainObject.js.map +1 -1
  304. package/es/common/isPrototype.js +1 -1
  305. package/es/common/isRegExp.js +1 -1
  306. package/es/common/isShallowEqual.js +1 -0
  307. package/es/common/isShallowEqual.js.map +1 -1
  308. package/es/common/isString.d.ts +13 -0
  309. package/es/common/isString.js +13 -1
  310. package/es/common/isString.js.map +1 -1
  311. package/es/common/isType.d.ts +6 -0
  312. package/es/common/isType.js +6 -0
  313. package/es/common/isType.js.map +1 -1
  314. package/es/common/isValidNumber.js.map +1 -1
  315. package/es/common/isValidUrl.js.map +1 -1
  316. package/es/common/kde.d.ts +28 -0
  317. package/es/common/kde.js +29 -7
  318. package/es/common/kde.js.map +1 -1
  319. package/es/common/mean.d.ts +2 -0
  320. package/es/common/mean.js +19 -0
  321. package/es/common/mean.js.map +1 -0
  322. package/es/common/merge.js +22 -5
  323. package/es/common/merge.js.map +1 -1
  324. package/es/common/mixin.js +14 -3
  325. package/es/common/mixin.js.map +1 -1
  326. package/es/common/normalQuantile.d.ts +5 -0
  327. package/es/common/normalQuantile.js +15 -0
  328. package/es/common/normalQuantile.js.map +1 -0
  329. package/es/common/number.d.ts +24 -0
  330. package/es/common/number.js +24 -2
  331. package/es/common/number.js.map +1 -1
  332. package/es/common/pad.d.ts +21 -0
  333. package/es/common/pad.js +21 -1
  334. package/es/common/pad.js.map +1 -1
  335. package/es/common/random.d.ts +3 -0
  336. package/es/common/random.js +13 -1
  337. package/es/common/random.js.map +1 -1
  338. package/es/common/regression-bootstrap.d.ts +14 -0
  339. package/es/common/regression-bootstrap.js +31 -0
  340. package/es/common/regression-bootstrap.js.map +1 -0
  341. package/es/common/regression-linear.d.ts +5 -0
  342. package/es/common/regression-linear.js +25 -39
  343. package/es/common/regression-linear.js.map +1 -1
  344. package/es/common/regression-logistic.d.ts +6 -0
  345. package/es/common/regression-logistic.js +24 -16
  346. package/es/common/regression-logistic.js.map +1 -1
  347. package/es/common/regression-lowess.d.ts +11 -1
  348. package/es/common/regression-lowess.js +120 -118
  349. package/es/common/regression-lowess.js.map +1 -1
  350. package/es/common/regression-polynomial.d.ts +1 -0
  351. package/es/common/regression-polynomial.js +21 -89
  352. package/es/common/regression-polynomial.js.map +1 -1
  353. package/es/common/regression-solver.d.ts +26 -0
  354. package/es/common/regression-solver.js +168 -0
  355. package/es/common/regression-solver.js.map +1 -0
  356. package/es/common/regression-utils.d.ts +13 -1
  357. package/es/common/regression-utils.js +18 -9
  358. package/es/common/regression-utils.js.map +1 -1
  359. package/es/common/throttle.js +3 -0
  360. package/es/common/throttle.js.map +1 -1
  361. package/es/common/toDate.js +23 -3
  362. package/es/common/toDate.js.map +1 -1
  363. package/es/common/uuid.d.ts +7 -0
  364. package/es/common/uuid.js +15 -1
  365. package/es/common/uuid.js.map +1 -1
  366. package/es/data-structure/bounds.d.ts +101 -0
  367. package/es/data-structure/bounds.js +74 -8
  368. package/es/data-structure/bounds.js.map +1 -1
  369. package/es/data-structure/hashTable.d.ts +4 -0
  370. package/es/data-structure/hashTable.js +11 -2
  371. package/es/data-structure/hashTable.js.map +1 -1
  372. package/es/data-structure/index.js +2 -0
  373. package/es/data-structure/index.js.map +1 -1
  374. package/es/data-structure/matrix.d.ts +91 -0
  375. package/es/data-structure/matrix.js +52 -5
  376. package/es/data-structure/matrix.js.map +1 -1
  377. package/es/data-structure/point.d.ts +3 -0
  378. package/es/data-structure/point.js +5 -1
  379. package/es/data-structure/point.js.map +1 -1
  380. package/es/dom.d.ts +36 -0
  381. package/es/dom.js +43 -8
  382. package/es/dom.js.map +1 -1
  383. package/es/fmin/blas1.js +10 -0
  384. package/es/fmin/blas1.js.map +1 -1
  385. package/es/fmin/conjugate-gradient.js +18 -2
  386. package/es/fmin/conjugate-gradient.js.map +1 -1
  387. package/es/fmin/linesearch.js +15 -0
  388. package/es/fmin/linesearch.js.map +1 -1
  389. package/es/fmin/nelder-mead.d.ts +1 -0
  390. package/es/fmin/nelder-mead.js +29 -9
  391. package/es/fmin/nelder-mead.js.map +1 -1
  392. package/es/format/number/formatDecimal.js +9 -1
  393. package/es/format/number/formatDecimal.js.map +1 -1
  394. package/es/format/number/formatGroup.js +7 -0
  395. package/es/format/number/formatGroup.js.map +1 -1
  396. package/es/format/number/formatPrefixAuto.js +8 -0
  397. package/es/format/number/formatPrefixAuto.js.map +1 -1
  398. package/es/format/number/formatRounded.js +7 -0
  399. package/es/format/number/formatRounded.js.map +1 -1
  400. package/es/format/number/formatTrim.js +7 -0
  401. package/es/format/number/formatTrim.js.map +1 -1
  402. package/es/format/number/number.js +40 -8
  403. package/es/format/number/number.js.map +1 -1
  404. package/es/format/time.js +23 -5
  405. package/es/format/time.js.map +1 -1
  406. package/es/geo/circle-intersection.d.ts +12 -0
  407. package/es/geo/circle-intersection.js +54 -14
  408. package/es/geo/circle-intersection.js.map +1 -1
  409. package/es/geo/constant.js +8 -0
  410. package/es/geo/constant.js.map +1 -1
  411. package/es/geo/invariant.d.ts +22 -0
  412. package/es/geo/invariant.js +24 -0
  413. package/es/geo/invariant.js.map +1 -1
  414. package/es/graphics/algorithm/aabb.js +7 -3
  415. package/es/graphics/algorithm/aabb.js.map +1 -1
  416. package/es/graphics/algorithm/intersect.d.ts +48 -0
  417. package/es/graphics/algorithm/intersect.js +75 -12
  418. package/es/graphics/algorithm/intersect.js.map +1 -1
  419. package/es/graphics/bounds-util.js +4 -2
  420. package/es/graphics/bounds-util.js.map +1 -1
  421. package/es/graphics/graph-util.js +4 -0
  422. package/es/graphics/graph-util.js.map +1 -1
  423. package/es/graphics/index.js +2 -0
  424. package/es/graphics/index.js.map +1 -1
  425. package/es/graphics/polygon.d.ts +12 -0
  426. package/es/graphics/polygon.js +28 -6
  427. package/es/graphics/polygon.js.map +1 -1
  428. package/es/graphics/text/measure/interface.d.ts +12 -0
  429. package/es/graphics/text/measure/textMeasure.d.ts +23 -0
  430. package/es/graphics/text/measure/textMeasure.js +46 -21
  431. package/es/graphics/text/measure/textMeasure.js.map +1 -1
  432. package/es/graphics/text/measure/util.js +1 -0
  433. package/es/graphics/text/measure/util.js.map +1 -1
  434. package/es/graphics/text/stringWidth.js +7 -3
  435. package/es/graphics/text/stringWidth.js.map +1 -1
  436. package/es/index.d.ts +6 -0
  437. package/es/index.js +15 -1
  438. package/es/index.js.map +1 -1
  439. package/es/logger.js +12 -1
  440. package/es/logger.js.map +1 -1
  441. package/es/lru.js +14 -6
  442. package/es/lru.js.map +1 -1
  443. package/es/math.d.ts +9 -0
  444. package/es/math.js +10 -1
  445. package/es/math.js.map +1 -1
  446. package/es/padding.d.ts +5 -0
  447. package/es/padding.js +5 -1
  448. package/es/padding.js.map +1 -1
  449. package/es/time/formatUtils.d.ts +6 -0
  450. package/es/time/formatUtils.js +7 -1
  451. package/es/time/formatUtils.js.map +1 -1
  452. package/package.json +4 -3
package/README.zh-CN.md CHANGED
@@ -0,0 +1,12 @@
1
+ ## 标准正态逆 CDF
2
+
3
+ ```ts
4
+ import { normalQuantile } from '@visactor/vutils';
5
+ normalQuantile(0.975); // 约 1.95996398454
6
+ ```
7
+
8
+ `normalQuantile(p)` 复用回归区间原有的 Acklam 近似。p 在 (0,1) 返回有限分位数,0 / 1 返回 −Infinity / Infinity,非法概率或非有限输入返回 NaN。SciPy 1.13.1 基准检查尾部 1e-12 至 1−1e-12 和分段边界,绝对误差小于 5e-8。回归区间也调用此工具,避免维护重复实现。
9
+
10
+ 回归区间的 `alpha` 表示显著性水平,置信度为 `1-alpha`,默认 `alpha=0.05`。区间通过下尾概率计算临界值,避免 `1-alpha/2` 在 `alpha` 极小时舍入为 1。
11
+
12
+ `alpha=0` 时,正标准误产生无限区间,零标准误产生退化区间;`alpha=1` 产生退化区间。非有限 `alpha` 或超出 `[0,1]` 的值产生 NaN 区间端点。
package/REGRESSION.md ADDED
@@ -0,0 +1,36 @@
1
+ # 一元回归与成对 bootstrap 契约
2
+
3
+ 本轮修正面向 VUtil 1.0.25 的回归工具;正式 npm 1.0.25 不包含这些修复和新 API。
4
+
5
+ - regressionLinear:使用中心化/缩放的一元 OLS,预测在稳定坐标中求值,保留 coef.a/b。增加 rank;常量 x 的历史常数估计继续有定义,图表需要可识别斜率时由输入边界拒绝。
6
+ - regressionPolynomial:以归一化设计矩阵做增量 Givens QR;秩不足时对小型 R 做 Jacobi SVD 得到最小范数解,增加 rank,不再返回伪造零系数。coef 保持升幂的原始 x 坐标含义,predict 用稳定基底。degree 为非负整数,默认仍为 0。原始系数不能有限表示时明确报 RangeError。
7
+ - regressionLowess:默认 span 从 0.3 改为 2/3、iterations 从 2 改为 3,使用全部有效观测;不再隐藏抽样或按 N 关闭稳健迭代。拟合时固定稳健状态,predict/evaluateGrid/fitted 节点一致。显式 maxSamples 保留历史抽样用途,并包含端点;delta 默认为 0,正值以观测锚点插值加速,全量观测仍参与局部权重与稳健残差。fitted 按 x 排序,保留重复样本。此默认行为调整会改变旧 LOWESS 曲线,调用方需要明确选择参数。
8
+ - LOWESS 使用查询点附近的局部 x/y 坐标,避免远处观测压缩近邻精度;只有距离或插值区间溢出时才改用归一化 x 距离。
9
+ - 等距离邻域选择较小 x,再按 y 排序,不依赖调用方行顺序。相同 x 的零半径邻域包含所有相同 x 观测。零核权重时用最近有效观测的加权常数,等距离取均值;没有有效稳健观测时明确报错。median=0 时保留数值精度内零残差点的权重,对明显非零残差赋零权重。
10
+ - regressionBootstrap 从包根导出,仅 linear/polynomial。options 为 method/degree?/grid/level/resamples/seed,完整 (x,y) 成对有放回抽样,每次拟合一次。原始组须有满秩设计及正残差自由度,退化重采样在原始固定归一化基底中取最小范数解,不删抽样或重抽。每个 grid 位置按线性插值分位数生成 lower/upper,表示均值响应的逐点 percentile CI,不是预测区间。
11
+
12
+ 既有 confidenceInterval 的正态临界值与旧区间用途没有在本轮改成 bootstrap。尤其旧多项式/LOWESS 区间近似不能用来声称符合新的回归置信带契约;完整整理独立处理。
13
+
14
+ 缺失 accessor 的既有排除行为保留;无穷大不参与拟合,StatPlots 另有更严格的有限原始观测边界。新增求解器不修改输入。bootstrap 在内部对配对排序,同组同 seed 可复现;不承诺与 NumPy RNG 相同。
15
+
16
+ 独立数值对照使用 __tests__/fixtures/regression-python.json 的固定参考数据,文件记录参考环境的 Python、NumPy 和 statsmodels 版本;TypeScript 测试直接读取 JSON,无需 Python 运行环境。LOWESS 正常非退化数据对照 statsmodels,bootstrap 重放同一抽样索引后对照 NumPy 最小二乘与分位数。退化/ties 行为及坐标基底差异单独声明,不承诺全部参数逐位相同。
17
+
18
+ 性能在真实 Node 构建产物测量,避免 Jest VM 对 Math 属性代理的显著额外成本;先 npm run build,再运行 lowess-performance.test.ts 或 node benchmarks/lowess.cjs。保留原 100/150/200ms 预算,使用显式 delta 并断言所有节点保留,精确路径另由数值测试和浏览器实测覆盖。VUtils 的 Jest 配置使用单 worker,CI 的 Rush test 使用 --parallelism 1,避免同包或其他包并发测试影响墙钟预算;所有单元与性能用例均执行。
19
+
20
+ ## 调用示例
21
+
22
+ ```ts
23
+ import { regressionLinear, regressionBootstrap, regressionLowess } from '@visactor/vutils';
24
+
25
+ const samples = [{ x: 0, y: 1 }, { x: 1, y: 3 }, { x: 2, y: 4 }, { x: 3, y: 7 }];
26
+ const model = regressionLinear(samples);
27
+ const curve = model.evaluateGrid(100);
28
+ const bounds = regressionBootstrap(samples, {
29
+ method: 'linear', grid: curve.map(p => p.x), level: 0.95, resamples: 1000, seed: 0
30
+ });
31
+ const smooth = regressionLowess(samples, undefined, undefined, { span: 2 / 3, iterations: 3, delta: 0 });
32
+ // bounds 与 curve 使用相同 x;LOWESS 的 fitted 保留排序后的全部有效观测。
33
+ const prediction = smooth.predict(1);
34
+ ```
35
+
36
+ bootstrap 的 level 严格在 (0,1),resamples 为正整数,seed 为 uint32;grid 为有限数字数组。主模型不满秩或没有残差自由度时抛出 RangeError。bootstrap 的多项式使用 method='polynomial' 和正整数 degree。图表层可采用更严格的次数和预算上限,不改变通用求解器契约。
package/cjs/angle.d.ts CHANGED
@@ -1,21 +1,82 @@
1
1
  import type { IPointLike } from './data-structure/point';
2
+ /**
3
+ * degree -> radian
4
+ * @param degree
5
+ * @returns radian
6
+ */
2
7
  export declare function degreeToRadian(degree: number): number;
8
+ /**
9
+ * radian -> degree
10
+ * @param radian
11
+ * @returns
12
+ */
3
13
  export declare function radianToDegree(radian: number): number;
14
+ /**
15
+ * 对弧度进行格式化
16
+ * @param a 传入的弧度
17
+ * @returns
18
+ */
4
19
  export declare const clampRadian: (angle?: number) => number;
5
20
  export declare const clampAngleByRadian: (angle?: number) => number;
21
+ /**
22
+ * 对角度进行格式化
23
+ * @param a 角度
24
+ * @returns
25
+ */
6
26
  export declare const clampDegree: (a?: number) => number;
7
27
  export declare const clampAngleByDegree: (a?: number) => number;
28
+ /**
29
+ * 根据弧度及半径计算极坐标系下的坐标点
30
+ * @param centerX 圆心坐标
31
+ * @param radius 半径
32
+ * @param angleInRadian 弧度
33
+ * @returns 返回笛卡尔坐标点
34
+ */
8
35
  export declare function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): {
9
36
  x: number;
10
37
  y: number;
11
38
  };
39
+ /**
40
+ * 根据笛卡尔坐标系坐标计算极坐标坐标点
41
+ * @param point
42
+ * @param center 极坐标系中心点坐标
43
+ * @param startAngle 极坐标系起始角度
44
+ * @param endAngle 极坐标系结束角度
45
+ * @returns 极坐标系坐标点
46
+ */
12
47
  export declare function cartesianToPolar(point: IPointLike, center?: IPointLike, startAngle?: number, endAngle?: number): {
13
48
  radius: number;
14
49
  angle: number;
15
50
  };
51
+ /**
52
+ * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角
53
+ * @param center 圆心坐标
54
+ * @param point 待求的点坐标
55
+ * @returns 返回夹角对应的弧度值
56
+ */
16
57
  export declare function getAngleByPoint(center: IPointLike, point: IPointLike): number;
58
+ /**
59
+ * 角度标准化处理
60
+ * @param angle 弧度角
61
+ */
17
62
  export declare function normalizeAngle(angle: number): number;
63
+ /**
64
+ * 指定开始角度和结束角度,计算这个范围内的边界角度,
65
+ * 即起始角度以及经过的东、南、西、北四个方向的角度
66
+ * 计算这个角度,可以用于计算一个弧度的bounding box 等
67
+ * @param startAngle 起始角度的弧度值
68
+ * @param endAngle 结束角度的弧度值
69
+ * @returns 边界角度数组
70
+ */
18
71
  export declare function findBoundaryAngles(startAngle: number, endAngle: number): number[];
72
+ /**
73
+ * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径
74
+ * @param rect 矩形的大小
75
+ * @param center 中心点
76
+ * @param startAngle 起始角度的弧度值
77
+ * @param endAngle 结束角度的弧度值
78
+ * @returns 最大半径
79
+ */
19
80
  export declare function calculateMaxRadius(rect: {
20
81
  width: number;
21
82
  height: number;
package/cjs/angle.js CHANGED
@@ -4,27 +4,58 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.computeQuadrant = exports.calculateMaxRadius = exports.findBoundaryAngles = exports.normalizeAngle = exports.getAngleByPoint = exports.cartesianToPolar = exports.polarToCartesian = exports.clampAngleByDegree = exports.clampDegree = exports.clampAngleByRadian = exports.clampRadian = exports.radianToDegree = exports.degreeToRadian = void 0;
6
6
 
7
+ /**
8
+ * 处理角度相关的数据计算
9
+ */
7
10
  const math_1 = require("./math");
8
11
 
9
- function degreeToRadian(degree) {
12
+ /**
13
+ * degree -> radian
14
+ * @param degree
15
+ * @returns radian
16
+ */ function degreeToRadian(degree) {
10
17
  return degree * (Math.PI / 180);
11
18
  }
12
19
 
20
+ /**
21
+ * radian -> degree
22
+ * @param radian
23
+ * @returns
24
+ */
13
25
  function radianToDegree(radian) {
14
26
  return 180 * radian / Math.PI;
15
27
  }
16
28
 
17
29
  exports.degreeToRadian = degreeToRadian, exports.radianToDegree = radianToDegree;
18
30
 
31
+ /**
32
+ * 对弧度进行格式化
33
+ * @param a 传入的弧度
34
+ * @returns
35
+ */
19
36
  const clampRadian = (angle = 0) => {
20
37
  if (angle < 0) for (;angle < -math_1.tau; ) angle += math_1.tau; else if (angle > 0) for (;angle > math_1.tau; ) angle -= math_1.tau;
21
38
  return angle;
22
39
  };
23
40
 
24
- exports.clampRadian = clampRadian, exports.clampAngleByRadian = exports.clampRadian;
41
+ exports.clampRadian = clampRadian,
42
+ // alias of clampRadian
43
+ exports.clampAngleByRadian = exports.clampRadian;
25
44
 
45
+ /**
46
+ * 对角度进行格式化
47
+ * @param a 角度
48
+ * @returns
49
+ */
26
50
  const clampDegree = (a = 0) => a > 360 || a < -360 ? a % 360 : a;
27
51
 
52
+ /**
53
+ * 根据弧度及半径计算极坐标系下的坐标点
54
+ * @param centerX 圆心坐标
55
+ * @param radius 半径
56
+ * @param angleInRadian 弧度
57
+ * @returns 返回笛卡尔坐标点
58
+ */
28
59
  function polarToCartesian(center, radius, angleInRadian) {
29
60
  return radius ? {
30
61
  x: center.x + radius * Math.cos(angleInRadian),
@@ -35,6 +66,14 @@ function polarToCartesian(center, radius, angleInRadian) {
35
66
  };
36
67
  }
37
68
 
69
+ /**
70
+ * 根据笛卡尔坐标系坐标计算极坐标坐标点
71
+ * @param point
72
+ * @param center 极坐标系中心点坐标
73
+ * @param startAngle 极坐标系起始角度
74
+ * @param endAngle 极坐标系结束角度
75
+ * @returns 极坐标系坐标点
76
+ */
38
77
  function cartesianToPolar(point, center = {
39
78
  x: 0,
40
79
  y: 0
@@ -56,16 +95,34 @@ function cartesianToPolar(point, center = {
56
95
  };
57
96
  }
58
97
 
98
+ /**
99
+ * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角
100
+ * @param center 圆心坐标
101
+ * @param point 待求的点坐标
102
+ * @returns 返回夹角对应的弧度值
103
+ */
59
104
  function getAngleByPoint(center, point) {
60
105
  return Math.atan2(point.y - center.y, point.x - center.x);
61
106
  }
62
107
 
108
+ /**
109
+ * 角度标准化处理
110
+ * @param angle 弧度角
111
+ */
63
112
  function normalizeAngle(angle) {
64
113
  for (;angle < 0; ) angle += 2 * Math.PI;
65
114
  for (;angle >= 2 * Math.PI; ) angle -= 2 * Math.PI;
66
115
  return angle;
67
116
  }
68
117
 
118
+ /**
119
+ * 指定开始角度和结束角度,计算这个范围内的边界角度,
120
+ * 即起始角度以及经过的东、南、西、北四个方向的角度
121
+ * 计算这个角度,可以用于计算一个弧度的bounding box 等
122
+ * @param startAngle 起始角度的弧度值
123
+ * @param endAngle 结束角度的弧度值
124
+ * @returns 边界角度数组
125
+ */
69
126
  function findBoundaryAngles(startAngle, endAngle) {
70
127
  const deltaAngle = Math.abs(endAngle - startAngle);
71
128
  if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) return [ 0, Math.PI / 2, Math.PI, 1.5 * Math.PI ];
@@ -76,6 +133,14 @@ function findBoundaryAngles(startAngle, endAngle) {
76
133
  return steps;
77
134
  }
78
135
 
136
+ /**
137
+ * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径
138
+ * @param rect 矩形的大小
139
+ * @param center 中心点
140
+ * @param startAngle 起始角度的弧度值
141
+ * @param endAngle 结束角度的弧度值
142
+ * @returns 最大半径
143
+ */
79
144
  function calculateMaxRadius(rect, center, startAngle, endAngle) {
80
145
  const {x: x, y: y} = center, steps = findBoundaryAngles(startAngle, endAngle), {width: width, height: height} = rect, radiusList = [];
81
146
  return steps.forEach((step => {
@@ -89,8 +154,9 @@ function computeQuadrant(angle) {
89
154
  return (angle = normalizeAngle(angle)) > 0 && angle <= Math.PI / 2 ? 2 : angle > Math.PI / 2 && angle <= Math.PI ? 3 : angle > Math.PI && angle <= 3 * Math.PI / 2 ? 4 : 1;
90
155
  }
91
156
 
92
- exports.clampDegree = clampDegree, exports.clampAngleByDegree = exports.clampDegree,
93
- exports.polarToCartesian = polarToCartesian, exports.cartesianToPolar = cartesianToPolar,
94
- exports.getAngleByPoint = getAngleByPoint, exports.normalizeAngle = normalizeAngle,
95
- exports.findBoundaryAngles = findBoundaryAngles, exports.calculateMaxRadius = calculateMaxRadius,
96
- exports.computeQuadrant = computeQuadrant;
157
+ exports.clampDegree = clampDegree,
158
+ // alias of clampDegree
159
+ exports.clampAngleByDegree = exports.clampDegree, exports.polarToCartesian = polarToCartesian,
160
+ exports.cartesianToPolar = cartesianToPolar, exports.getAngleByPoint = getAngleByPoint,
161
+ exports.normalizeAngle = normalizeAngle, exports.findBoundaryAngles = findBoundaryAngles,
162
+ exports.calculateMaxRadius = calculateMaxRadius, exports.computeQuadrant = computeQuadrant;
package/cjs/angle.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/angle.ts"],"names":[],"mappings":"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","file":"angle.js","sourcesContent":["import type { IPointLike } from './data-structure/point';\n/**\n * 处理角度相关的数据计算\n */\n\nimport { tau } from './math';\n\n/**\n * degree -> radian\n * @param degree\n * @returns radian\n */\nexport function degreeToRadian(degree: number) {\n return degree * (Math.PI / 180);\n}\n\n/**\n * radian -> degree\n * @param radian\n * @returns\n */\nexport function radianToDegree(radian: number) {\n return (radian * 180) / Math.PI;\n}\n\n/**\n * 对弧度进行格式化\n * @param a 传入的弧度\n * @returns\n */\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < -tau) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n\n return angle;\n};\n\n// alias of clampRadian\nexport const clampAngleByRadian = clampRadian;\n\n/**\n * 对角度进行格式化\n * @param a 角度\n * @returns\n */\nexport const clampDegree = (a: number = 0) => {\n if (a > 360 || a < -360) {\n return a % 360;\n }\n\n return a;\n};\n\n// alias of clampDegree\nexport const clampAngleByDegree = clampDegree;\n\n/**\n * 根据弧度及半径计算极坐标系下的坐标点\n * @param centerX 圆心坐标\n * @param radius 半径\n * @param angleInRadian 弧度\n * @returns 返回笛卡尔坐标点\n */\nexport function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): { x: number; y: number } {\n if (!radius) {\n return { x: center.x, y: center.y };\n }\n\n return {\n x: center.x + radius * Math.cos(angleInRadian),\n y: center.y + radius * Math.sin(angleInRadian)\n };\n}\n\n/**\n * 根据笛卡尔坐标系坐标计算极坐标坐标点\n * @param point\n * @param center 极坐标系中心点坐标\n * @param startAngle 极坐标系起始角度\n * @param endAngle 极坐标系结束角度\n * @returns 极坐标系坐标点\n */\nexport function cartesianToPolar(\n point: IPointLike,\n center: IPointLike = { x: 0, y: 0 },\n startAngle = 0,\n endAngle = 2 * Math.PI\n) {\n const { x, y } = point;\n const { x: centerX, y: centerY } = center;\n\n let dx = x - centerX;\n let dy = y - centerY;\n const radius = Math.sqrt(dx * dx + dy * dy);\n\n if (radius === 0) {\n return {\n radius: 0,\n angle: 0\n };\n }\n\n dx /= radius;\n dy /= radius;\n\n let radian = Math.atan2(dy, dx);\n if (radian < startAngle) {\n while (radian <= startAngle) {\n radian += Math.PI * 2;\n }\n }\n if (radian > endAngle) {\n while (radian >= endAngle) {\n radian -= Math.PI * 2;\n }\n }\n return {\n radius,\n angle: radian\n };\n}\n\n/**\n * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角\n * @param center 圆心坐标\n * @param point 待求的点坐标\n * @returns 返回夹角对应的弧度值\n */\nexport function getAngleByPoint(center: IPointLike, point: IPointLike): number {\n return Math.atan2(point.y - center.y, point.x - center.x);\n}\n\n/**\n * 角度标准化处理\n * @param angle 弧度角\n */\nexport function normalizeAngle(angle: number): number {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n while (angle >= Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n}\n\n/**\n * 指定开始角度和结束角度,计算这个范围内的边界角度,\n * 即起始角度以及经过的东、南、西、北四个方向的角度\n * 计算这个角度,可以用于计算一个弧度的bounding box 等\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 边界角度数组\n */\nexport function findBoundaryAngles(startAngle: number, endAngle: number) {\n const deltaAngle = Math.abs(endAngle - startAngle);\n\n if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) {\n return [0, Math.PI / 2, Math.PI, 1.5 * Math.PI];\n }\n const min = Math.min(startAngle, endAngle);\n const normalMin = normalizeAngle(min);\n const normalMax = normalMin + deltaAngle;\n const steps = [normalMin, normalMax];\n let directionAngle = (Math.floor(normalMin / Math.PI) * Math.PI) / 2;\n\n while (directionAngle < normalMax) {\n if (directionAngle > normalMin) {\n steps.push(directionAngle);\n }\n directionAngle += Math.PI / 2;\n }\n\n return steps;\n}\n/**\n * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径\n * @param rect 矩形的大小\n * @param center 中心点\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 最大半径\n */\nexport function calculateMaxRadius(\n rect: { width: number; height: number },\n center: { x: number; y: number },\n startAngle: number,\n endAngle: number\n) {\n const { x, y } = center;\n const steps = findBoundaryAngles(startAngle, endAngle);\n const { width, height } = rect;\n\n const radiusList: number[] = [];\n\n steps.forEach(step => {\n const sin = Math.sin(step);\n const cos = Math.cos(step);\n\n if (sin === 1) {\n radiusList.push(height - y);\n } else if (sin === -1) {\n radiusList.push(y);\n } else if (cos === 1) {\n radiusList.push(width - x);\n } else if (cos === -1) {\n radiusList.push(x);\n } else {\n if (sin > 0) {\n radiusList.push(Math.abs((height - y) / sin));\n } else {\n radiusList.push(Math.abs(y / sin));\n }\n\n if (cos > 0) {\n radiusList.push(Math.abs((width - x) / cos));\n } else {\n radiusList.push(Math.abs(x / cos));\n }\n }\n });\n\n return Math.min.apply(null, radiusList);\n}\n\nexport type Quadrant = 1 | 2 | 3 | 4;\n\nexport function computeQuadrant(angle: number): Quadrant {\n angle = normalizeAngle(angle);\n if (angle > 0 && angle <= Math.PI / 2) {\n return 2;\n } else if (angle > Math.PI / 2 && angle <= Math.PI) {\n return 3;\n } else if (angle > Math.PI && angle <= (3 * Math.PI) / 2) {\n return 4;\n }\n return 1;\n}\n"]}
1
+ {"version":3,"sources":["../src/angle.ts"],"names":[],"mappings":";;;AACA;;GAEG;AAEH,iCAA6B;AAE7B;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AAClC,CAAC;AAFD,wCAEC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAClC,CAAC;AAFD,wCAEC;AAED;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,QAAgB,CAAC,EAAE,EAAE;IAC/C,IAAI,KAAK,GAAG,CAAC,EAAE;QACb,OAAO,KAAK,GAAG,CAAC,UAAG,EAAE;YACnB,KAAK,IAAI,UAAG,CAAC;SACd;KACF;SAAM,IAAI,KAAK,GAAG,CAAC,EAAE;QACpB,OAAO,KAAK,GAAG,UAAG,EAAE;YAClB,KAAK,IAAI,UAAG,CAAC;SACd;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAZW,QAAA,WAAW,eAYtB;AAEF,uBAAuB;AACV,QAAA,kBAAkB,GAAG,mBAAW,CAAC;AAE9C;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,IAAY,CAAC,EAAE,EAAE;IAC3C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,GAAG,CAAC;KAChB;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AANW,QAAA,WAAW,eAMtB;AAEF,uBAAuB;AACV,QAAA,kBAAkB,GAAG,mBAAW,CAAC;AAE9C;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,MAAkB,EAAE,MAAc,EAAE,aAAqB;IACxF,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;KACrC;IAED,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QAC9C,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;KAC/C,CAAC;AACJ,CAAC;AATD,4CASC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAC9B,KAAiB,EACjB,SAAqB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACnC,UAAU,GAAG,CAAC,EACd,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;IAEtB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE1C,IAAI,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE5C,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,OAAO;YACL,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;SACT,CAAC;KACH;IAED,EAAE,IAAI,MAAM,CAAC;IACb,EAAE,IAAI,MAAM,CAAC;IAEb,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,UAAU,EAAE;QACvB,OAAO,MAAM,IAAI,UAAU,EAAE;YAC3B,MAAM,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;SACvB;KACF;IACD,IAAI,MAAM,GAAG,QAAQ,EAAE;QACrB,OAAO,MAAM,IAAI,QAAQ,EAAE;YACzB,MAAM,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;SACvB;KACF;IACD,OAAO;QACL,MAAM;QACN,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAtCD,4CAsCC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,MAAkB,EAAE,KAAiB;IACnE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAFD,0CAEC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,GAAG,CAAC,EAAE;QAChB,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KACtB;IACD,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE;QAC3B,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KACtB;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AARD,wCAQC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,UAAkB,EAAE,QAAgB;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;IAEnD,IAAI,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,UAAU,GAAG,IAAI,EAAE;QAChE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;KACjD;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAErE,OAAO,cAAc,GAAG,SAAS,EAAE;QACjC,IAAI,cAAc,GAAG,SAAS,EAAE;YAC9B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC5B;QACD,cAAc,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KAC/B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AApBD,gDAoBC;AACD;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,IAAuC,EACvC,MAAgC,EAChC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;IACxB,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,GAAG,KAAK,CAAC,EAAE;YACb,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SAC7B;aAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACpB;aAAM,IAAI,GAAG,KAAK,CAAC,EAAE;YACpB,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;SAC5B;aAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACpB;aAAM;YACL,IAAI,GAAG,GAAG,CAAC,EAAE;gBACX,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;aAC/C;iBAAM;gBACL,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;aACpC;YAED,IAAI,GAAG,GAAG,CAAC,EAAE;gBACX,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;aAC9C;iBAAM;gBACL,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;aACpC;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAxCD,gDAwCC;AAID,SAAgB,eAAe,CAAC,KAAa;IAC3C,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE;QACrC,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE;QAClD,OAAO,CAAC,CAAC;KACV;SAAM,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;QACxD,OAAO,CAAC,CAAC;KACV;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAVD,0CAUC","file":"angle.js","sourcesContent":["import type { IPointLike } from './data-structure/point';\n/**\n * 处理角度相关的数据计算\n */\n\nimport { tau } from './math';\n\n/**\n * degree -> radian\n * @param degree\n * @returns radian\n */\nexport function degreeToRadian(degree: number) {\n return degree * (Math.PI / 180);\n}\n\n/**\n * radian -> degree\n * @param radian\n * @returns\n */\nexport function radianToDegree(radian: number) {\n return (radian * 180) / Math.PI;\n}\n\n/**\n * 对弧度进行格式化\n * @param a 传入的弧度\n * @returns\n */\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < -tau) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n\n return angle;\n};\n\n// alias of clampRadian\nexport const clampAngleByRadian = clampRadian;\n\n/**\n * 对角度进行格式化\n * @param a 角度\n * @returns\n */\nexport const clampDegree = (a: number = 0) => {\n if (a > 360 || a < -360) {\n return a % 360;\n }\n\n return a;\n};\n\n// alias of clampDegree\nexport const clampAngleByDegree = clampDegree;\n\n/**\n * 根据弧度及半径计算极坐标系下的坐标点\n * @param centerX 圆心坐标\n * @param radius 半径\n * @param angleInRadian 弧度\n * @returns 返回笛卡尔坐标点\n */\nexport function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): { x: number; y: number } {\n if (!radius) {\n return { x: center.x, y: center.y };\n }\n\n return {\n x: center.x + radius * Math.cos(angleInRadian),\n y: center.y + radius * Math.sin(angleInRadian)\n };\n}\n\n/**\n * 根据笛卡尔坐标系坐标计算极坐标坐标点\n * @param point\n * @param center 极坐标系中心点坐标\n * @param startAngle 极坐标系起始角度\n * @param endAngle 极坐标系结束角度\n * @returns 极坐标系坐标点\n */\nexport function cartesianToPolar(\n point: IPointLike,\n center: IPointLike = { x: 0, y: 0 },\n startAngle = 0,\n endAngle = 2 * Math.PI\n) {\n const { x, y } = point;\n const { x: centerX, y: centerY } = center;\n\n let dx = x - centerX;\n let dy = y - centerY;\n const radius = Math.sqrt(dx * dx + dy * dy);\n\n if (radius === 0) {\n return {\n radius: 0,\n angle: 0\n };\n }\n\n dx /= radius;\n dy /= radius;\n\n let radian = Math.atan2(dy, dx);\n if (radian < startAngle) {\n while (radian <= startAngle) {\n radian += Math.PI * 2;\n }\n }\n if (radian > endAngle) {\n while (radian >= endAngle) {\n radian -= Math.PI * 2;\n }\n }\n return {\n radius,\n angle: radian\n };\n}\n\n/**\n * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角\n * @param center 圆心坐标\n * @param point 待求的点坐标\n * @returns 返回夹角对应的弧度值\n */\nexport function getAngleByPoint(center: IPointLike, point: IPointLike): number {\n return Math.atan2(point.y - center.y, point.x - center.x);\n}\n\n/**\n * 角度标准化处理\n * @param angle 弧度角\n */\nexport function normalizeAngle(angle: number): number {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n while (angle >= Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n}\n\n/**\n * 指定开始角度和结束角度,计算这个范围内的边界角度,\n * 即起始角度以及经过的东、南、西、北四个方向的角度\n * 计算这个角度,可以用于计算一个弧度的bounding box 等\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 边界角度数组\n */\nexport function findBoundaryAngles(startAngle: number, endAngle: number) {\n const deltaAngle = Math.abs(endAngle - startAngle);\n\n if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) {\n return [0, Math.PI / 2, Math.PI, 1.5 * Math.PI];\n }\n const min = Math.min(startAngle, endAngle);\n const normalMin = normalizeAngle(min);\n const normalMax = normalMin + deltaAngle;\n const steps = [normalMin, normalMax];\n let directionAngle = (Math.floor(normalMin / Math.PI) * Math.PI) / 2;\n\n while (directionAngle < normalMax) {\n if (directionAngle > normalMin) {\n steps.push(directionAngle);\n }\n directionAngle += Math.PI / 2;\n }\n\n return steps;\n}\n/**\n * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径\n * @param rect 矩形的大小\n * @param center 中心点\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 最大半径\n */\nexport function calculateMaxRadius(\n rect: { width: number; height: number },\n center: { x: number; y: number },\n startAngle: number,\n endAngle: number\n) {\n const { x, y } = center;\n const steps = findBoundaryAngles(startAngle, endAngle);\n const { width, height } = rect;\n\n const radiusList: number[] = [];\n\n steps.forEach(step => {\n const sin = Math.sin(step);\n const cos = Math.cos(step);\n\n if (sin === 1) {\n radiusList.push(height - y);\n } else if (sin === -1) {\n radiusList.push(y);\n } else if (cos === 1) {\n radiusList.push(width - x);\n } else if (cos === -1) {\n radiusList.push(x);\n } else {\n if (sin > 0) {\n radiusList.push(Math.abs((height - y) / sin));\n } else {\n radiusList.push(Math.abs(y / sin));\n }\n\n if (cos > 0) {\n radiusList.push(Math.abs((width - x) / cos));\n } else {\n radiusList.push(Math.abs(x / cos));\n }\n }\n });\n\n return Math.min.apply(null, radiusList);\n}\n\nexport type Quadrant = 1 | 2 | 3 | 4;\n\nexport function computeQuadrant(angle: number): Quadrant {\n angle = normalizeAngle(angle);\n if (angle > 0 && angle <= Math.PI / 2) {\n return 2;\n } else if (angle > Math.PI / 2 && angle <= Math.PI) {\n return 3;\n } else if (angle > Math.PI && angle <= (3 * Math.PI) / 2) {\n return 4;\n }\n return 1;\n}\n"]}
@@ -174,6 +174,9 @@ export declare class Color {
174
174
  getLuminance(): number;
175
175
  getLuminance2(): number;
176
176
  getLuminance3(): number;
177
+ /**
178
+ * https://www.w3.org/TR/WCAG21/#use-of-color
179
+ */
177
180
  getLuminanceWCAG(): number;
178
181
  clone(): Color;
179
182
  copyGammaToLinear(color: Color, gammaFactor?: number): this;
@@ -1,6 +1,33 @@
1
1
  "use strict";
2
2
 
3
- var __importDefault = this && this.__importDefault || function(mod) {
3
+ /*
4
+ Copyright (c) 2013, Jason Davies.
5
+ All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ * Redistributions of source code must retain the above copyright notice, this
11
+ list of conditions and the following disclaimer.
12
+
13
+ * Redistributions in binary form must reproduce the above copyright notice,
14
+ this list of conditions and the following disclaimer in the documentation
15
+ and/or other materials provided with the distribution.
16
+
17
+ * The name Jason Davies may not be used to endorse or promote products
18
+ derived from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,
24
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
28
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ */ var __importDefault = this && this.__importDefault || function(mod) {
4
31
  return mod && mod.__esModule ? mod : {
5
32
  default: mod
6
33
  };
@@ -10,6 +37,11 @@ Object.defineProperty(exports, "__esModule", {
10
37
  value: !0
11
38
  }), exports.RGB = exports.Color = exports.DEFAULT_COLORS = void 0;
12
39
 
40
+ // Mike Bostock, https://github.com/d3/d3-color
41
+ /**
42
+ * 参考 d3-color 实现。用于颜色转化
43
+ * 16进制/rgb 转化为r,g,b, o
44
+ */
13
45
  const common_1 = require("../common"), hslToRgb_1 = __importDefault(require("./hslToRgb")), rgbToHsl_1 = __importDefault(require("./rgbToHsl")), REG_HEX = /^#([0-9a-f]{3,8})$/, DEFAULT_COLORS_OPACITY = {
14
46
  transparent: 4294967040
15
47
  };
@@ -21,11 +53,13 @@ function hex(value) {
21
53
  function rgb(value) {
22
54
  return (0, common_1.isNumber)(value) ? new RGB(value >> 16, value >> 8 & 255, 255 & value, 1) : (0,
23
55
  common_1.isArray)(value) ? new RGB(value[0], value[1], value[2]) : new RGB(255, 255, 255);
56
+ // default return
24
57
  }
25
58
 
26
59
  function rgba(value) {
27
60
  return (0, common_1.isNumber)(value) ? new RGB(value >>> 24, value >>> 16 & 255, value >>> 8 & 255, 255 & value) : (0,
28
61
  common_1.isArray)(value) ? new RGB(value[0], value[1], value[2], value[3]) : new RGB(255, 255, 255, 1);
62
+ // default return
29
63
  }
30
64
 
31
65
  function SRGBToLinear(c) {
@@ -191,7 +225,10 @@ const setHex = (formatValue, forceHex) => {
191
225
  const isHex = REG_HEX.exec(formatValue);
192
226
  if (forceHex || isHex) {
193
227
  const hex = parseInt(isHex[1], 16), hexLength = isHex[1].length;
194
- return 3 === hexLength ? new RGB((hex >> 8 & 15) + ((hex >> 8 & 15) << 4), (hex >> 4 & 15) + ((hex >> 4 & 15) << 4), (15 & hex) + ((15 & hex) << 4), 1) : 6 === hexLength ? rgb(hex) : 8 === hexLength ? new RGB(hex >> 24 & 255, hex >> 16 & 255, hex >> 8 & 255, (255 & hex) / 255) : null;
228
+ // #fff
229
+ return 3 === hexLength ? new RGB((hex >> 8 & 15) + ((hex >> 8 & 15) << 4), (hex >> 4 & 15) + ((hex >> 4 & 15) << 4), (15 & hex) + ((15 & hex) << 4), 1) :
230
+ // #ffffff
231
+ 6 === hexLength ? rgb(hex) : 8 === hexLength ? new RGB(hex >> 24 & 255, hex >> 16 & 255, hex >> 8 & 255, (255 & hex) / 255) : null;
195
232
  }
196
233
  };
197
234
 
@@ -226,15 +263,20 @@ class Color {
226
263
  }
227
264
  }
228
265
  static parseColorString(value) {
266
+ // case0: transparent
229
267
  if ((0, common_1.isValid)(DEFAULT_COLORS_OPACITY[value])) return rgba(DEFAULT_COLORS_OPACITY[value]);
230
- if ((0, common_1.isValid)(exports.DEFAULT_COLORS[value])) return rgb(exports.DEFAULT_COLORS[value]);
268
+ // case1: 简写 ['blue','red']
269
+ if ((0, common_1.isValid)(exports.DEFAULT_COLORS[value])) return rgb(exports.DEFAULT_COLORS[value]);
231
270
  const formatValue = `${value}`.trim().toLowerCase(), hexRes = setHex(formatValue);
232
- if (void 0 !== hexRes) return hexRes;
233
- if (/^(rgb|RGB|rgba|RGBA)/.test(formatValue)) {
271
+ // case2: 16进制
272
+ if (void 0 !== hexRes) return hexRes;
273
+ // case3 : rgb
274
+ if (/^(rgb|RGB|rgba|RGBA)/.test(formatValue)) {
234
275
  const aColor = formatValue.replace(/(?:\(|\)|rgba|RGBA|rgb|RGB)*/g, "").split(",");
235
276
  return new RGB(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10), parseFloat(aColor[3]));
236
277
  }
237
- if (/^(hsl|HSL|hsla|HSLA)/.test(formatValue)) {
278
+ // case4: hsl
279
+ if (/^(hsl|HSL|hsla|HSLA)/.test(formatValue)) {
238
280
  const aColor = formatValue.replace(/(?:\(|\)|hsla|HSLA|hsl|HSL)*/g, "").split(","), rgb = (0,
239
281
  hslToRgb_1.default)(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10));
240
282
  return new RGB(rgb.r, rgb.g, rgb.b, parseFloat(aColor[3]));
@@ -242,7 +284,10 @@ class Color {
242
284
  }
243
285
  constructor(value) {
244
286
  const color = Color.parseColorString(value);
245
- color ? this.color = color : (console.warn(`Warn: 传入${value}无法解析为Color`), this.color = new RGB(255, 255, 255));
287
+ // case0: transparent
288
+ color ? this.color = color : (
289
+ // default: 白色
290
+ console.warn(`Warn: 传入${value}无法解析为Color`), this.color = new RGB(255, 255, 255));
246
291
  }
247
292
  toRGBA() {
248
293
  return this.color.formatRgb();
@@ -276,6 +321,7 @@ class Color {
276
321
  this.color.g = Math.max(0, Math.min(255, Math.floor(g * color.color.g))), this.color.b = Math.max(0, Math.min(255, Math.floor(b * color.color.b))),
277
322
  this;
278
323
  }
324
+ // todo: 这里亮度计算都没考虑alpha通道
279
325
  getHSVBrightness() {
280
326
  return Math.max(this.color.r, this.color.g, this.color.b) / 255;
281
327
  }
@@ -297,9 +343,13 @@ class Color {
297
343
  return null != res ? res : this;
298
344
  }
299
345
  setColorName(name) {
346
+ // color keywords
300
347
  const hex = exports.DEFAULT_COLORS[name.toLowerCase()];
301
- return void 0 !== hex ? this.setHex(hex) : console.warn("THREE.Color: Unknown color " + name),
302
- this;
348
+ return void 0 !== hex ?
349
+ // red
350
+ this.setHex(hex) :
351
+ // unknown color
352
+ console.warn("THREE.Color: Unknown color " + name), this;
303
353
  }
304
354
  setScalar(scalar) {
305
355
  return this.color.r = scalar, this.color.g = scalar, this.color.b = scalar, this;
@@ -316,7 +366,9 @@ class Color {
316
366
  getLuminance3() {
317
367
  return (.299 * this.color.r + .587 * this.color.g + .114 * this.color.b) / 255;
318
368
  }
319
- getLuminanceWCAG() {
369
+ /**
370
+ * https://www.w3.org/TR/WCAG21/#use-of-color
371
+ */ getLuminanceWCAG() {
320
372
  const RsRGB = this.color.r / 255, GsRGB = this.color.g / 255, BsRGB = this.color.b / 255;
321
373
  let R, G, B;
322
374
  R = RsRGB <= .03928 ? RsRGB / 12.92 : Math.pow((RsRGB + .055) / 1.055, 2.4), G = GsRGB <= .03928 ? GsRGB / 12.92 : Math.pow((GsRGB + .055) / 1.055, 2.4),
@@ -364,6 +416,7 @@ class RGB {
364
416
  this.r = isNaN(+r) ? 255 : Math.max(0, Math.min(255, +r)), this.g = isNaN(+g) ? 255 : Math.max(0, Math.min(255, +g)),
365
417
  this.b = isNaN(+b) ? 255 : Math.max(0, Math.min(255, +b)), (0, common_1.isValid)(opacity) ? this.opacity = isNaN(+opacity) ? 1 : Math.max(0, Math.min(1, +opacity)) : this.opacity = 1;
366
418
  }
419
+ // 转为16进制
367
420
  formatHex() {
368
421
  return `#${hex(this.r) + hex(this.g) + hex(this.b) + (1 === this.opacity ? "" : hex(255 * this.opacity))}`;
369
422
  }
@@ -375,6 +428,7 @@ class RGB {
375
428
  const opacity = this.opacity, {h: h, s: s, l: l} = (0, rgbToHsl_1.default)(this.r, this.g, this.b);
376
429
  return `${1 === opacity ? "hsl(" : "hsla("}${h},${s}%,${l}%${1 === opacity ? ")" : `,${opacity})`}`;
377
430
  }
431
+ // 转为16进制
378
432
  toString() {
379
433
  return this.formatHex();
380
434
  }