@visactor/vutils 0.18.6 → 0.18.7

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 (43) hide show
  1. package/cjs/angle.d.ts +1 -0
  2. package/cjs/angle.js +9 -2
  3. package/cjs/angle.js.map +1 -1
  4. package/cjs/common/bisect.d.ts +6 -0
  5. package/cjs/common/bisect.js +36 -3
  6. package/cjs/common/bisect.js.map +1 -1
  7. package/cjs/common/index.d.ts +1 -1
  8. package/cjs/common/index.js +17 -2
  9. package/cjs/common/index.js.map +1 -1
  10. package/cjs/dom.d.ts +1 -0
  11. package/cjs/dom.js +11 -2
  12. package/cjs/dom.js.map +1 -1
  13. package/cjs/fmin/index.d.ts +0 -1
  14. package/cjs/fmin/index.js +1 -1
  15. package/cjs/fmin/index.js.map +1 -1
  16. package/cjs/graphics/algorithm/intersect.js +7 -10
  17. package/cjs/graphics/algorithm/intersect.js.map +1 -1
  18. package/dist/index.js +195 -152
  19. package/dist/index.min.js +1 -1
  20. package/es/angle.d.ts +1 -0
  21. package/es/angle.js +6 -0
  22. package/es/angle.js.map +1 -1
  23. package/es/common/bisect.d.ts +6 -0
  24. package/es/common/bisect.js +31 -0
  25. package/es/common/bisect.js.map +1 -1
  26. package/es/common/index.d.ts +1 -1
  27. package/es/common/index.js +1 -1
  28. package/es/common/index.js.map +1 -1
  29. package/es/dom.d.ts +1 -0
  30. package/es/dom.js +9 -0
  31. package/es/dom.js.map +1 -1
  32. package/es/fmin/index.d.ts +0 -1
  33. package/es/fmin/index.js +0 -2
  34. package/es/fmin/index.js.map +1 -1
  35. package/es/graphics/algorithm/intersect.js +7 -9
  36. package/es/graphics/algorithm/intersect.js.map +1 -1
  37. package/package.json +3 -3
  38. package/cjs/fmin/bisect.d.ts +0 -1
  39. package/cjs/fmin/bisect.js +0 -27
  40. package/cjs/fmin/bisect.js.map +0 -1
  41. package/es/fmin/bisect.d.ts +0 -1
  42. package/es/fmin/bisect.js +0 -19
  43. package/es/fmin/bisect.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/bisect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B,MAAM,UAAU,MAAM,CAAC,CAAW,EAAE,CAAS,EAAE,KAAa,CAAC,EAAE,EAAW;IACxE,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE;QACb,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;KACf;IACD,OAAO,EAAE,GAAI,EAAa,EAAE;QAC1B,MAAM,GAAG,GAAW,CAAC,EAAE,GAAI,EAAa,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE;YAC5B,EAAE,GAAG,GAAG,CAAC;SACV;aAAM;YACL,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;SACd;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC","file":"bisect.js","sourcesContent":["import { ascending } from './ascending';\nimport isNil from './isNil';\n\nexport function bisect(a: number[], x: number, lo: number = 0, hi?: number) {\n if (isNil(hi)) {\n hi = a.length;\n }\n while (lo < (hi as number)) {\n const mid: number = (lo + (hi as number)) >>> 1;\n if (ascending(a[mid], x) > 0) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n return lo;\n}\n"]}
1
+ {"version":3,"sources":["../src/common/bisect.ts"],"names":[],"mappings":"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","file":"bisect.js","sourcesContent":["import { ascending } from './ascending';\nimport isNil from './isNil';\nimport { Logger } from '../logger';\n\n/**\n * 通过二分法,查找数组a中大于数值x的第一个元素的序号\n * @param a\n * @param x\n * @param lo\n * @param hi\n * @returns\n */\nexport function bisect(a: number[], x: number, lo: number = 0, hi?: number) {\n if (isNil(hi)) {\n hi = a.length;\n }\n while (lo < (hi as number)) {\n const mid: number = (lo + (hi as number)) >>> 1;\n if (ascending(a[mid], x) > 0) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n return lo;\n}\n\n/* Adapted from fmin by Ben Frederickson\n * https://github.com/benfred/fmin\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/benfred/fmin/blob/master/src/bisect.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n/** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\nexport function findZeroOfFunction(\n f: (entry: number) => number,\n a: number,\n b: number,\n parameters?: {\n maxIterations?: number;\n tolerance?: number;\n }\n) {\n const maxIterations = parameters?.maxIterations ?? 100;\n const tolerance = parameters?.tolerance ?? 1e-10;\n const fA = f(a);\n const fB = f(b);\n let delta = b - a;\n\n if (fA * fB > 0) {\n const logger = Logger.getInstance();\n logger.error('Initial bisect points must have opposite signs');\n return NaN;\n }\n\n if (fA === 0) {\n return a;\n }\n if (fB === 0) {\n return b;\n }\n\n for (let i = 0; i < maxIterations; ++i) {\n delta /= 2;\n const mid = a + delta;\n const fMid = f(mid);\n\n if (fMid * fA >= 0) {\n a = mid;\n }\n\n if (Math.abs(delta) < tolerance || fMid === 0) {\n return mid;\n }\n }\n return a + delta;\n}\n\n/**\n * 二分靠近框架,返回数组中第一个大于等于目标值的数的索引\n * @param arr 数组\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearch = <T>(arr: T[], compareFn: (value: T) => number) => {\n return binaryFuzzySearchInNumberRange(0, arr.length, value => compareFn(arr[value]));\n};\n\n/**\n * 二分靠近框架,返回数字区间中第一个大于等于目标值的数字\n * @param x1 区间上界\n * @param x2 区间下界(不包含)\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearchInNumberRange = (x1: number, x2: number, compareFn: (value: number) => number) => {\n let left = x1;\n let right = x2;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (compareFn(mid) >= 0) {\n right = mid; // 第一个大于等于目标值的数\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n"]}
@@ -33,7 +33,7 @@ export * from './array';
33
33
  export { range } from './range';
34
34
  export { ascending } from './ascending';
35
35
  export * from './quantileSorted';
36
- export { bisect } from './bisect';
36
+ export { bisect, findZeroOfFunction, binaryFuzzySearch, binaryFuzzySearchInNumberRange } from './bisect';
37
37
  export { deviation } from './deviation';
38
38
  export { median } from './median';
39
39
  export { variance } from './variance';
@@ -68,7 +68,7 @@ export { ascending } from "./ascending";
68
68
 
69
69
  export * from "./quantileSorted";
70
70
 
71
- export { bisect } from "./bisect";
71
+ export { bisect, findZeroOfFunction, binaryFuzzySearch, binaryFuzzySearchInNumberRange } from "./bisect";
72
72
 
73
73
  export { deviation } from "./deviation";
74
74
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// type check\nexport { default as isBoolean } from './isBoolean';\nexport { default as isFunction } from './isFunction';\nexport { default as isNil } from './isNil';\nexport { default as isNull } from './isNull';\nexport { default as isValid } from './isValid';\nexport { default as isObject } from './isObject';\nexport { default as isObjectLike } from './isObjectLike';\nexport { default as isPlainObject } from './isPlainObject';\nexport { default as isType } from './isType';\nexport { default as isUndefined } from './isUndefined';\nexport { default as isString } from './isString';\nexport { default as isArray } from './isArray';\nexport { default as isArrayLike } from './isArrayLike';\nexport { default as isDate } from './isDate';\nexport { default as isNumber } from './isNumber';\nexport { default as isNumeric } from './isNumeric';\nexport { default as isValidNumber } from './isValidNumber';\nexport { default as isValidUrl } from './isValidUrl';\nexport { default as isRegExp } from './isRegExp';\nexport { default as isBase64 } from './isBase64';\n\nexport { default as isEmpty } from './isEmpty';\n\n// object\nexport { default as get } from './get';\nexport { default as has } from './has';\nexport { default as clone } from './clone';\nexport { default as cloneDeep } from './cloneDeep';\nexport { default as merge } from './merge';\nexport { default as pick } from './pick';\nexport { default as pickWithout } from './pickWithout';\nexport { isEqual } from './isEqual';\nexport { isShallowEqual } from './isShallowEqual';\nexport * from './mixin';\n\n// array\nexport * from './array';\nexport { range } from './range';\nexport { ascending } from './ascending';\nexport * from './quantileSorted';\nexport { bisect } from './bisect';\nexport { deviation } from './deviation';\nexport { median } from './median';\nexport { variance } from './variance';\n\n// tick\nexport { tickStep } from './tickStep';\n\n// number\nexport * from './number';\n\n// function\nexport { default as constant } from './constant';\nexport { memoize } from './memoize';\n\n// pad\nexport { default as pad } from './pad';\nexport { default as truncate } from './truncate';\n\n// uuid\nexport { default as uuid } from './uuid';\n\n// clamp\nexport { default as clamp } from './clamp';\nexport { default as clampRange } from './clampRange';\nexport { clamper } from './clamper';\n\n// debounce & throttle\nexport { default as debounce } from './debounce';\nexport { default as throttle } from './throttle';\n\n// interpolate\nexport * from './interpolate';\n\n// type convert\nexport { toDate } from './toDate';\nexport { toNumber } from './toNumber';\nexport { toValidNumber } from './toValidNumber';\n\n// string\nexport { default as lowerFirst } from './lowerFirst';\nexport { default as upperFirst } from './upperFirst';\n\n// string format\nexport { default as substitute } from './substitute';\n\nexport * from './random';\n"]}
1
+ {"version":3,"sources":["../src/common/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// type check\nexport { default as isBoolean } from './isBoolean';\nexport { default as isFunction } from './isFunction';\nexport { default as isNil } from './isNil';\nexport { default as isNull } from './isNull';\nexport { default as isValid } from './isValid';\nexport { default as isObject } from './isObject';\nexport { default as isObjectLike } from './isObjectLike';\nexport { default as isPlainObject } from './isPlainObject';\nexport { default as isType } from './isType';\nexport { default as isUndefined } from './isUndefined';\nexport { default as isString } from './isString';\nexport { default as isArray } from './isArray';\nexport { default as isArrayLike } from './isArrayLike';\nexport { default as isDate } from './isDate';\nexport { default as isNumber } from './isNumber';\nexport { default as isNumeric } from './isNumeric';\nexport { default as isValidNumber } from './isValidNumber';\nexport { default as isValidUrl } from './isValidUrl';\nexport { default as isRegExp } from './isRegExp';\nexport { default as isBase64 } from './isBase64';\n\nexport { default as isEmpty } from './isEmpty';\n\n// object\nexport { default as get } from './get';\nexport { default as has } from './has';\nexport { default as clone } from './clone';\nexport { default as cloneDeep } from './cloneDeep';\nexport { default as merge } from './merge';\nexport { default as pick } from './pick';\nexport { default as pickWithout } from './pickWithout';\nexport { isEqual } from './isEqual';\nexport { isShallowEqual } from './isShallowEqual';\nexport * from './mixin';\n\n// array\nexport * from './array';\nexport { range } from './range';\nexport { ascending } from './ascending';\nexport * from './quantileSorted';\nexport { bisect, findZeroOfFunction, binaryFuzzySearch, binaryFuzzySearchInNumberRange } from './bisect';\nexport { deviation } from './deviation';\nexport { median } from './median';\nexport { variance } from './variance';\n\n// tick\nexport { tickStep } from './tickStep';\n\n// number\nexport * from './number';\n\n// function\nexport { default as constant } from './constant';\nexport { memoize } from './memoize';\n\n// pad\nexport { default as pad } from './pad';\nexport { default as truncate } from './truncate';\n\n// uuid\nexport { default as uuid } from './uuid';\n\n// clamp\nexport { default as clamp } from './clamp';\nexport { default as clampRange } from './clampRange';\nexport { clamper } from './clamper';\n\n// debounce & throttle\nexport { default as debounce } from './debounce';\nexport { default as throttle } from './throttle';\n\n// interpolate\nexport * from './interpolate';\n\n// type convert\nexport { toDate } from './toDate';\nexport { toNumber } from './toNumber';\nexport { toValidNumber } from './toValidNumber';\n\n// string\nexport { default as lowerFirst } from './lowerFirst';\nexport { default as upperFirst } from './upperFirst';\n\n// string format\nexport { default as substitute } from './substitute';\n\nexport * from './random';\n"]}
package/es/dom.d.ts CHANGED
@@ -13,3 +13,4 @@ export declare const getScale: (element: HTMLElement) => number;
13
13
  export declare function hasParentElement(element: HTMLElement, target: HTMLElement): boolean;
14
14
  export declare const styleStringToObject: (styleStr?: string) => any;
15
15
  export declare const lowerCamelCaseToMiddle: (str: string) => string;
16
+ export declare function isHTMLElement(obj: any): obj is Element;
package/es/dom.js CHANGED
@@ -78,4 +78,13 @@ export const styleStringToObject = (styleStr = "") => {
78
78
  };
79
79
 
80
80
  export const lowerCamelCaseToMiddle = str => str.replace(/([A-Z])/g, "-$1").toLowerCase();
81
+
82
+ export function isHTMLElement(obj) {
83
+ try {
84
+ return obj instanceof Element;
85
+ } catch (_a) {
86
+ const htmlElementKeys = [ "children", "innerHTML", "classList", "setAttribute", "tagName", "getBoundingClientRect" ], keys = Object.keys(obj);
87
+ return htmlElementKeys.every((key => keys.includes(key)));
88
+ }
89
+ }
81
90
  //# sourceMappingURL=dom.js.map
package/es/dom.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":"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","file":"dom.js","sourcesContent":["import type { IPointLike } from './data-structure';\n\nexport function getContainerSize(el: HTMLElement | null, defaultWidth: number = 0, defaultHeight: number = 0) {\n if (!el) {\n return { width: defaultWidth, height: defaultHeight };\n }\n\n let getComputedStyle;\n try {\n getComputedStyle = window?.getComputedStyle;\n } catch (e) {\n getComputedStyle = () => {\n return {} as CSSStyleDeclaration;\n };\n }\n\n const style = getComputedStyle(el);\n\n // clientWidth/clientHeight: 默认整数,会向上取整,导致canvas > container\n // getBoundingClientRect:默认小数,但是在container上有css类似 transform: scale(0.5)时,获取结果不对\n // getComputedStyle:默认小数,获取最终结果,但是会包含padding;\n\n if (/^(\\d*\\.?\\d+)(px)$/.exec(style.width)) {\n // 当dom元素的 display: 'none' 的时候,获取到的宽高会变成原始的样式配置,而不是计算后的像素值\n const computedWidth =\n parseFloat(style.width) - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) || el.clientWidth - 1;\n\n const computedHeight =\n parseFloat(style.height) - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom) || el.clientHeight - 1;\n\n // 理论上不用向下取整,目前没加。\n return {\n width: computedWidth <= 0 ? defaultWidth : computedWidth,\n height: computedHeight <= 0 ? defaultHeight : computedHeight\n };\n }\n\n return { width: defaultWidth, height: defaultHeight };\n}\n\n/**\n * 获取元素的绝对位置坐标(相对于页面左上角)\n * @param element\n * @returns\n */\nexport function getElementAbsolutePosition(element: HTMLElement): IPointLike {\n const { x, y } = element.getBoundingClientRect();\n return { x, y };\n}\n\n/**\n * 获取元素的相对位置坐标(相对于其他dom元素)\n * @param element\n * @returns\n */\nexport function getElementRelativePosition(element: HTMLElement, base: HTMLElement): IPointLike {\n const posElement = getElementAbsolutePosition(element);\n const posBase = getElementAbsolutePosition(base);\n return { x: posElement.x - posBase.x, y: posElement.y - posBase.y };\n}\n\nexport const getScrollLeft = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollLeft || element.scrollLeft;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollLeft;\n};\nexport const getScrollTop = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollTop || element.scrollTop;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollTop;\n};\n\nexport const getScaleX = (element: HTMLElement) => {\n return element.getBoundingClientRect().width / element.offsetWidth;\n};\n\nexport const getScaleY = (element: HTMLElement) => {\n return element.getBoundingClientRect().height / element.offsetHeight;\n};\n\n/**\n * 获取目标元素的缩放因数\n * @param element 目标 dom 元素\n * @returns\n */\nexport const getScale = (element: HTMLElement) => {\n if (element.offsetWidth > 0) {\n return getScaleX(element);\n }\n return getScaleY(element);\n};\n\n/**\n * 判断是否是元素的父元素\n * @param element 从其父元素开始查找的 DOM 元素\n * @param target 要查找的目标父元素\n * @returns boolean, true 代表查找到,false 表示未找到\n */\nexport function hasParentElement(element: HTMLElement, target: HTMLElement): boolean {\n let parent = element.parentNode;\n\n while (parent !== null) {\n if (parent === target) {\n return true;\n }\n parent = parent.parentNode;\n }\n\n return false;\n}\n\n/**\n * 将style字符串转换成对象形式\n * @param style字符串 例如:\"color:red;line-height:20px;\"\n * @returns style对象,如 { color: 'red', 'line-height': '20px' }\n */\nexport const styleStringToObject = (styleStr: string = '') => {\n const res: any = {};\n styleStr.split(';').forEach(item => {\n if (item) {\n const arr = item.split(':');\n\n if (arr.length === 2) {\n const key = arr[0].trim();\n const value = arr[1].trim();\n\n if (key && value) {\n res[key] = value;\n }\n }\n }\n });\n\n return res;\n};\n\n/**\n * 将小驼峰转换成中划线连接的字符串\n * @param str 如:'lineHeight' => 'line-height'\n * @returns\n */\nexport const lowerCamelCaseToMiddle = (str: string) => {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n};\n"]}
1
+ {"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":"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","file":"dom.js","sourcesContent":["import type { IPointLike } from './data-structure';\n\nexport function getContainerSize(el: HTMLElement | null, defaultWidth: number = 0, defaultHeight: number = 0) {\n if (!el) {\n return { width: defaultWidth, height: defaultHeight };\n }\n\n let getComputedStyle;\n try {\n getComputedStyle = window?.getComputedStyle;\n } catch (e) {\n getComputedStyle = () => {\n return {} as CSSStyleDeclaration;\n };\n }\n\n const style = getComputedStyle(el);\n\n // clientWidth/clientHeight: 默认整数,会向上取整,导致canvas > container\n // getBoundingClientRect:默认小数,但是在container上有css类似 transform: scale(0.5)时,获取结果不对\n // getComputedStyle:默认小数,获取最终结果,但是会包含padding;\n\n if (/^(\\d*\\.?\\d+)(px)$/.exec(style.width)) {\n // 当dom元素的 display: 'none' 的时候,获取到的宽高会变成原始的样式配置,而不是计算后的像素值\n const computedWidth =\n parseFloat(style.width) - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) || el.clientWidth - 1;\n\n const computedHeight =\n parseFloat(style.height) - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom) || el.clientHeight - 1;\n\n // 理论上不用向下取整,目前没加。\n return {\n width: computedWidth <= 0 ? defaultWidth : computedWidth,\n height: computedHeight <= 0 ? defaultHeight : computedHeight\n };\n }\n\n return { width: defaultWidth, height: defaultHeight };\n}\n\n/**\n * 获取元素的绝对位置坐标(相对于页面左上角)\n * @param element\n * @returns\n */\nexport function getElementAbsolutePosition(element: HTMLElement): IPointLike {\n const { x, y } = element.getBoundingClientRect();\n return { x, y };\n}\n\n/**\n * 获取元素的相对位置坐标(相对于其他dom元素)\n * @param element\n * @returns\n */\nexport function getElementRelativePosition(element: HTMLElement, base: HTMLElement): IPointLike {\n const posElement = getElementAbsolutePosition(element);\n const posBase = getElementAbsolutePosition(base);\n return { x: posElement.x - posBase.x, y: posElement.y - posBase.y };\n}\n\nexport const getScrollLeft = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollLeft || element.scrollLeft;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollLeft;\n};\nexport const getScrollTop = (element: HTMLElement) => {\n if (element === globalThis?.document?.body) {\n return globalThis?.document?.documentElement?.scrollTop || element.scrollTop;\n } else if (element.tagName.toLowerCase() === 'html') {\n return 0;\n }\n return element.scrollTop;\n};\n\nexport const getScaleX = (element: HTMLElement) => {\n return element.getBoundingClientRect().width / element.offsetWidth;\n};\n\nexport const getScaleY = (element: HTMLElement) => {\n return element.getBoundingClientRect().height / element.offsetHeight;\n};\n\n/**\n * 获取目标元素的缩放因数\n * @param element 目标 dom 元素\n * @returns\n */\nexport const getScale = (element: HTMLElement) => {\n if (element.offsetWidth > 0) {\n return getScaleX(element);\n }\n return getScaleY(element);\n};\n\n/**\n * 判断是否是元素的父元素\n * @param element 从其父元素开始查找的 DOM 元素\n * @param target 要查找的目标父元素\n * @returns boolean, true 代表查找到,false 表示未找到\n */\nexport function hasParentElement(element: HTMLElement, target: HTMLElement): boolean {\n let parent = element.parentNode;\n\n while (parent !== null) {\n if (parent === target) {\n return true;\n }\n parent = parent.parentNode;\n }\n\n return false;\n}\n\n/**\n * 将style字符串转换成对象形式\n * @param style字符串 例如:\"color:red;line-height:20px;\"\n * @returns style对象,如 { color: 'red', 'line-height': '20px' }\n */\nexport const styleStringToObject = (styleStr: string = '') => {\n const res: any = {};\n styleStr.split(';').forEach(item => {\n if (item) {\n const arr = item.split(':');\n\n if (arr.length === 2) {\n const key = arr[0].trim();\n const value = arr[1].trim();\n\n if (key && value) {\n res[key] = value;\n }\n }\n }\n });\n\n return res;\n};\n\n/**\n * 将小驼峰转换成中划线连接的字符串\n * @param str 如:'lineHeight' => 'line-height'\n * @returns\n */\nexport const lowerCamelCaseToMiddle = (str: string) => {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n};\n\nexport function isHTMLElement(obj: any): obj is Element {\n try {\n return obj instanceof Element;\n } catch {\n // 跨端 plan B\n const htmlElementKeys: (keyof Element)[] = [\n 'children',\n 'innerHTML',\n 'classList',\n 'setAttribute',\n 'tagName',\n 'getBoundingClientRect'\n ];\n const keys = Object.keys(obj);\n return htmlElementKeys.every(key => keys.includes(key));\n }\n}\n"]}
@@ -1,4 +1,3 @@
1
1
  export * from './blas1';
2
2
  export * from './nelder-mead';
3
3
  export * from './conjugate-gradient';
4
- export * from './bisect';
package/es/fmin/index.js CHANGED
@@ -3,6 +3,4 @@ export * from "./blas1";
3
3
  export * from "./nelder-mead";
4
4
 
5
5
  export * from "./conjugate-gradient";
6
-
7
- export * from "./bisect";
8
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fmin/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC","file":"index.js","sourcesContent":["export * from './blas1';\nexport * from './nelder-mead';\nexport * from './conjugate-gradient';\nexport * from './bisect';\n"]}
1
+ {"version":3,"sources":["../src/fmin/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC","file":"index.js","sourcesContent":["export * from './blas1';\nexport * from './nelder-mead';\nexport * from './conjugate-gradient';\n"]}
@@ -1,3 +1,5 @@
1
+ import { degreeToRadian } from "../../angle";
2
+
1
3
  import { pi2, halfPi, crossProduct, fuzzyEqualVec } from "../../math";
2
4
 
3
5
  function sub(out, v1, v2) {
@@ -83,10 +85,6 @@ function rotate({x: x, y: y}, deg, origin = {
83
85
  };
84
86
  }
85
87
 
86
- function toDeg(angle) {
87
- return angle / 180 * Math.PI;
88
- }
89
-
90
88
  function getCenterPoint(box) {
91
89
  return {
92
90
  x: (box.x1 + box.x2) / 2,
@@ -95,7 +93,7 @@ function getCenterPoint(box) {
95
93
  }
96
94
 
97
95
  function toRect(box, isDeg) {
98
- const deg = isDeg ? box.angle : toDeg(box.angle), cp = getCenterPoint(box);
96
+ const deg = isDeg ? box.angle : degreeToRadian(box.angle), cp = getCenterPoint(box);
99
97
  return [ rotate({
100
98
  x: box.x1,
101
99
  y: box.y1
@@ -121,10 +119,10 @@ export function isRotateAABBIntersect(box1, box2, isDeg = !1, ctx) {
121
119
  })), ctx.fill(), ctx.restore());
122
120
  const p1 = getCenterPoint(box1), p2 = getCenterPoint(box2);
123
121
  ctx && ctx.fillRect(p1.x, p1.y, 2, 2), ctx && ctx.fillRect(p2.x, p2.y, 2, 2);
124
- const vp1p2 = vector(p1, p2), AB = vector(rect1[0], rect1[1]), BC = vector(rect1[1], rect1[2]), A1B1 = vector(rect2[0], rect2[1]), B1C1 = vector(rect2[1], rect2[2]), deg11 = isDeg ? box1.angle : toDeg(box1.angle);
125
- let deg12 = isDeg ? box1.angle + halfPi : toDeg(90 - box1.angle);
126
- const deg21 = isDeg ? box2.angle : toDeg(box2.angle);
127
- let deg22 = isDeg ? box2.angle + halfPi : toDeg(90 - box2.angle);
122
+ const vp1p2 = vector(p1, p2), AB = vector(rect1[0], rect1[1]), BC = vector(rect1[1], rect1[2]), A1B1 = vector(rect2[0], rect2[1]), B1C1 = vector(rect2[1], rect2[2]), deg11 = isDeg ? box1.angle : degreeToRadian(box1.angle);
123
+ let deg12 = isDeg ? box1.angle + halfPi : degreeToRadian(90 - box1.angle);
124
+ const deg21 = isDeg ? box2.angle : degreeToRadian(box2.angle);
125
+ let deg22 = isDeg ? box2.angle + halfPi : degreeToRadian(90 - box2.angle);
128
126
  deg12 > pi2 && (deg12 -= pi2), deg22 > pi2 && (deg22 -= pi2);
129
127
  const isCover = (checkAxisRadius, deg, targetAxis1, targetAxis2) => {
130
128
  const checkAxis = [ Math.cos(deg), Math.sin(deg) ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphics/algorithm/intersect.ts"],"names":[],"mappings":"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","file":"intersect.js","sourcesContent":["/* 用于判断2d相交 */\nimport type { IBoundsLike } from '../../data-structure';\nimport type { vec2 } from '../../math';\nimport { pi2, halfPi, crossProduct, fuzzyEqualVec } from '../../math';\nimport type { Point } from './interface';\n\nfunction sub(out: vec2, v1: vec2, v2: vec2) {\n out[0] = v1[0] - v2[0];\n out[1] = v1[1] - v2[1];\n}\n\n// 临时变量\nlet x11: number;\nlet x12: number;\nlet y11: number;\nlet y12: number;\nlet x21: number;\nlet x22: number;\nlet y21: number;\nlet y22: number;\n\n/**\n * 判断直线是否相交,投影法\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function isIntersect(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean {\n let min1: number = left1[0];\n let max1: number = right1[0];\n let min2: number = left2[0];\n let max2: number = right2[0];\n let _temp: number;\n if (max1 < min1) {\n _temp = max1;\n (max1 = min1), (min1 = _temp);\n }\n if (max2 < min2) {\n _temp = max2;\n (max2 = min2), (min2 = _temp);\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n (min1 = left1[1]), (max1 = right1[1]), (min2 = left2[1]), (max2 = right2[1]);\n if (max1 < min1) {\n _temp = max1;\n (max1 = min1), (min1 = _temp);\n }\n if (max2 < min2) {\n _temp = max2;\n (max2 = min2), (min2 = _temp);\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 获取直线交点\n * 不相交返回false,共线返回true,相交返回交点\n * https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function getIntersectPoint(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean | vec2 {\n if (!isIntersect(left1, right1, left2, right2)) {\n return false;\n }\n const dir1: vec2 = [0, 0];\n const dir2: vec2 = [0, 0];\n const tempVec: vec2 = [0, 0];\n sub(dir1, right1, left1);\n sub(dir2, right2, left2);\n\n // 判断共线\n if (fuzzyEqualVec(dir1, dir2)) {\n return true;\n }\n\n // https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n // line1: left1 + dir1 * t\n // line2: left2 + dir2 * u\n // 当 left1 + dir1 * t = left2 + dir2 * u => (left1 + dir1 * t) x dir2 = (left2 + dir2 * u) x dir2\n // => dir1 x dir2 * t = (left2 - left1) x dir2 => t = (left2 - left1) x dir2 / (dir1 x dir2)\n // 直线不平行,dir1 x dir2 ≠ 0,当0 <= t <= 1时,可以求出交点\n sub(tempVec, left2, left1);\n const t = crossProduct(tempVec, dir2) / crossProduct(dir1, dir2);\n if (t >= 0 && t <= 1) {\n return [left1[0] + dir1[0] * t, left1[1] + dir1[1] * t];\n }\n\n return false;\n}\n\n/**\n * 获取两个rect的相交部分\n * 如果有bbox为null,返回null,如果不相交返回{x1: 0, y1: 0, x2: 0, y2: 0}\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function getRectIntersect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): IBoundsLike | null {\n if (bbox1 === null) {\n return bbox2;\n }\n if (bbox2 === null) {\n return bbox1;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n\n if (x11 >= x22 || x12 <= x21 || y11 >= y22 || y12 <= y21) {\n return { x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n return { x1: Math.max(x11, x21), y1: Math.max(y11, y21), x2: Math.min(x12, x22), y2: Math.min(y12, y22) };\n}\n\nexport enum InnerBBox {\n NONE = 0,\n BBOX1 = 1,\n BBOX2 = 2\n}\n/**\n * 矩形是否在另一个矩形内部\n * 返回InnerBBox\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function rectInsideAnotherRect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): InnerBBox {\n if (!bbox1 || !bbox2) {\n return InnerBBox.NONE;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n\n // bbox1在bbox2内部\n if (x11 > x21 && x12 < x22 && y11 > y21 && y12 < y22) {\n return InnerBBox.BBOX1;\n }\n // bbox2在bbox1内部\n if (x21 > x11 && x22 < x12 && y21 > y11 && y22 < y12) {\n return InnerBBox.BBOX2;\n }\n\n return InnerBBox.NONE;\n}\n\n/**\n * 两个矩形是否相交\n * 如果有矩形为null,判断为相交\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function isRectIntersect(bbox1: IBoundsLike | null, bbox2: IBoundsLike | null, format: boolean): boolean {\n if (bbox1 && bbox2) {\n if (!format) {\n if (bbox1.x1 > bbox2.x2 || bbox1.x2 < bbox2.x1 || bbox1.y1 > bbox2.y2 || bbox1.y2 < bbox2.y1) {\n return false;\n }\n return true;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n\n if (x11 > x22 || x12 < x21 || y11 > y22 || y12 < y21) {\n return false;\n }\n return true;\n }\n return true;\n}\n\n/**\n * 点在box内部\n * 如果bbox为null返回true\n * @param point\n * @param bbox\n */\nexport function pointInRect(point: { x: number; y: number }, bbox: IBoundsLike | null, format: boolean): boolean {\n if (!bbox) {\n return true;\n }\n if (!format) {\n return point.x >= bbox.x1 && point.x <= bbox.x2 && point.y >= bbox.y1 && point.y <= bbox.y2;\n }\n (x11 = bbox.x1), (x12 = bbox.x2), (y11 = bbox.y1), (y12 = bbox.y2);\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n return point.x >= x11 && point.x <= x12 && point.y >= y11 && point.y <= y12;\n}\n\n// 参考https://github.com/francecil/leetcode/issues/1\n\n/**\n * 计算投影半径\n * @param {Array(Number)} checkAxis 检测轴 [cosθ,sinθ]\n * @param {Array} axis 目标轴 [x,y]\n */\nfunction getProjectionRadius(checkAxis: [number, number], axis: [number, number]) {\n return Math.abs(axis[0] * checkAxis[0] + axis[1] * checkAxis[1]);\n}\n\nfunction rotate({ x, y }: Point, deg: number, origin = { x: 0, y: 0 }) {\n return {\n x: (x - origin.x) * Math.cos(deg) + (y - origin.y) * Math.sin(deg) + origin.x,\n y: (x - origin.x) * Math.sin(deg) + (origin.y - y) * Math.cos(deg) + origin.y\n };\n}\n\nfunction toDeg(angle: number) {\n return (angle / 180) * Math.PI;\n}\n\nfunction getCenterPoint(box: RotateBound): Point {\n return {\n x: (box.x1 + box.x2) / 2,\n y: (box.y1 + box.y2) / 2\n };\n}\n\ninterface RotateBound extends IBoundsLike {\n angle: number;\n rotateCenter?: { x: number; y: number };\n}\n\n/**\n * 转化为顶点坐标数组\n * @param {Object} box\n */\nfunction toRect(box: RotateBound, isDeg: boolean) {\n const deg = isDeg ? box.angle : toDeg(box.angle);\n const cp = getCenterPoint(box);\n return [\n rotate(\n {\n x: box.x1,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y2\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x1,\n y: box.y2\n },\n deg,\n cp\n )\n ];\n}\nexport function isRotateAABBIntersect(\n box1: RotateBound,\n box2: RotateBound,\n isDeg = false,\n ctx?: CanvasRenderingContext2D\n) {\n const rect1 = toRect(box1, isDeg);\n const rect2 = toRect(box2, isDeg);\n const vector = (start: Point, end: Point) => {\n return [end.x - start.x, end.y - start.y] as [number, number];\n };\n\n if (ctx) {\n ctx.save();\n ctx.fillStyle = 'red';\n ctx.globalAlpha = 0.6;\n rect1.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n ctx.fillStyle = 'green';\n ctx.globalAlpha = 0.6;\n rect2.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n }\n\n // 两个矩形的中心点\n const p1 = getCenterPoint(box1);\n const p2 = getCenterPoint(box2);\n\n ctx && ctx.fillRect(p1.x, p1.y, 2, 2);\n ctx && ctx.fillRect(p2.x, p2.y, 2, 2);\n // 向量 p1p2\n const vp1p2 = vector(p1, p2);\n\n //矩形1的两边向量\n const AB = vector(rect1[0], rect1[1]);\n const BC = vector(rect1[1], rect1[2]);\n //矩形2的两边向量\n const A1B1 = vector(rect2[0], rect2[1]);\n const B1C1 = vector(rect2[1], rect2[2]);\n\n // 矩形1 的两个弧度\n const deg11 = isDeg ? box1.angle : toDeg(box1.angle);\n let deg12 = isDeg ? box1.angle + halfPi : toDeg(90 - box1.angle);\n // 矩形2 的两个弧度\n const deg21 = isDeg ? box2.angle : toDeg(box2.angle);\n let deg22 = isDeg ? box2.angle + halfPi : toDeg(90 - box2.angle);\n if (deg12 > pi2) {\n deg12 -= pi2;\n }\n if (deg22 > pi2) {\n deg22 -= pi2;\n }\n\n // 投影重叠\n const isCover = (\n checkAxisRadius: number,\n deg: number,\n targetAxis1: [number, number],\n targetAxis2: [number, number]\n ) => {\n const checkAxis = [Math.cos(deg), Math.sin(deg)] as [number, number];\n const targetAxisRadius =\n (getProjectionRadius(checkAxis, targetAxis1) + getProjectionRadius(checkAxis, targetAxis2)) / 2;\n const centerPointRadius = getProjectionRadius(checkAxis, vp1p2);\n // console.log('abc', `checkAxis:${checkAxis},三个投影:${checkAxisRadius}, ${targetAxisRadius}, ${centerPointRadius}`)\n return checkAxisRadius + targetAxisRadius > centerPointRadius;\n };\n\n return (\n isCover((box1.x2 - box1.x1) / 2, deg11, A1B1, B1C1) &&\n isCover((box1.y2 - box1.y1) / 2, deg12, A1B1, B1C1) &&\n isCover((box2.x2 - box2.x1) / 2, deg21, AB, BC) &&\n isCover((box2.y2 - box2.y1) / 2, deg22, AB, BC)\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/graphics/algorithm/intersect.ts"],"names":[],"mappings":"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","file":"intersect.js","sourcesContent":["/* 用于判断2d相交 */\nimport { degreeToRadian } from '../../angle';\nimport type { IBoundsLike } from '../../data-structure';\nimport type { vec2 } from '../../math';\nimport { pi2, halfPi, crossProduct, fuzzyEqualVec } from '../../math';\nimport type { Point } from './interface';\n\nfunction sub(out: vec2, v1: vec2, v2: vec2) {\n out[0] = v1[0] - v2[0];\n out[1] = v1[1] - v2[1];\n}\n\n// 临时变量\nlet x11: number;\nlet x12: number;\nlet y11: number;\nlet y12: number;\nlet x21: number;\nlet x22: number;\nlet y21: number;\nlet y22: number;\n\n/**\n * 判断直线是否相交,投影法\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function isIntersect(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean {\n let min1: number = left1[0];\n let max1: number = right1[0];\n let min2: number = left2[0];\n let max2: number = right2[0];\n let _temp: number;\n if (max1 < min1) {\n _temp = max1;\n (max1 = min1), (min1 = _temp);\n }\n if (max2 < min2) {\n _temp = max2;\n (max2 = min2), (min2 = _temp);\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n (min1 = left1[1]), (max1 = right1[1]), (min2 = left2[1]), (max2 = right2[1]);\n if (max1 < min1) {\n _temp = max1;\n (max1 = min1), (min1 = _temp);\n }\n if (max2 < min2) {\n _temp = max2;\n (max2 = min2), (min2 = _temp);\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 获取直线交点\n * 不相交返回false,共线返回true,相交返回交点\n * https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function getIntersectPoint(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean | vec2 {\n if (!isIntersect(left1, right1, left2, right2)) {\n return false;\n }\n const dir1: vec2 = [0, 0];\n const dir2: vec2 = [0, 0];\n const tempVec: vec2 = [0, 0];\n sub(dir1, right1, left1);\n sub(dir2, right2, left2);\n\n // 判断共线\n if (fuzzyEqualVec(dir1, dir2)) {\n return true;\n }\n\n // https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n // line1: left1 + dir1 * t\n // line2: left2 + dir2 * u\n // 当 left1 + dir1 * t = left2 + dir2 * u => (left1 + dir1 * t) x dir2 = (left2 + dir2 * u) x dir2\n // => dir1 x dir2 * t = (left2 - left1) x dir2 => t = (left2 - left1) x dir2 / (dir1 x dir2)\n // 直线不平行,dir1 x dir2 ≠ 0,当0 <= t <= 1时,可以求出交点\n sub(tempVec, left2, left1);\n const t = crossProduct(tempVec, dir2) / crossProduct(dir1, dir2);\n if (t >= 0 && t <= 1) {\n return [left1[0] + dir1[0] * t, left1[1] + dir1[1] * t];\n }\n\n return false;\n}\n\n/**\n * 获取两个rect的相交部分\n * 如果有bbox为null,返回null,如果不相交返回{x1: 0, y1: 0, x2: 0, y2: 0}\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function getRectIntersect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): IBoundsLike | null {\n if (bbox1 === null) {\n return bbox2;\n }\n if (bbox2 === null) {\n return bbox1;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n\n if (x11 >= x22 || x12 <= x21 || y11 >= y22 || y12 <= y21) {\n return { x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n return { x1: Math.max(x11, x21), y1: Math.max(y11, y21), x2: Math.min(x12, x22), y2: Math.min(y12, y22) };\n}\n\nexport enum InnerBBox {\n NONE = 0,\n BBOX1 = 1,\n BBOX2 = 2\n}\n/**\n * 矩形是否在另一个矩形内部\n * 返回InnerBBox\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function rectInsideAnotherRect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): InnerBBox {\n if (!bbox1 || !bbox2) {\n return InnerBBox.NONE;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n\n // bbox1在bbox2内部\n if (x11 > x21 && x12 < x22 && y11 > y21 && y12 < y22) {\n return InnerBBox.BBOX1;\n }\n // bbox2在bbox1内部\n if (x21 > x11 && x22 < x12 && y21 > y11 && y22 < y12) {\n return InnerBBox.BBOX2;\n }\n\n return InnerBBox.NONE;\n}\n\n/**\n * 两个矩形是否相交\n * 如果有矩形为null,判断为相交\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function isRectIntersect(bbox1: IBoundsLike | null, bbox2: IBoundsLike | null, format: boolean): boolean {\n if (bbox1 && bbox2) {\n if (!format) {\n if (bbox1.x1 > bbox2.x2 || bbox1.x2 < bbox2.x1 || bbox1.y1 > bbox2.y2 || bbox1.y2 < bbox2.y1) {\n return false;\n }\n return true;\n }\n\n (x11 = bbox1.x1),\n (x12 = bbox1.x2),\n (y11 = bbox1.y1),\n (y12 = bbox1.y2),\n (x21 = bbox2.x1),\n (x22 = bbox2.x2),\n (y21 = bbox2.y1),\n (y22 = bbox2.y2);\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n\n if (x11 > x22 || x12 < x21 || y11 > y22 || y12 < y21) {\n return false;\n }\n return true;\n }\n return true;\n}\n\n/**\n * 点在box内部\n * 如果bbox为null返回true\n * @param point\n * @param bbox\n */\nexport function pointInRect(point: { x: number; y: number }, bbox: IBoundsLike | null, format: boolean): boolean {\n if (!bbox) {\n return true;\n }\n if (!format) {\n return point.x >= bbox.x1 && point.x <= bbox.x2 && point.y >= bbox.y1 && point.y <= bbox.y2;\n }\n (x11 = bbox.x1), (x12 = bbox.x2), (y11 = bbox.y1), (y12 = bbox.y2);\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n return point.x >= x11 && point.x <= x12 && point.y >= y11 && point.y <= y12;\n}\n\n// 参考https://github.com/francecil/leetcode/issues/1\n\n/**\n * 计算投影半径\n * @param {Array(Number)} checkAxis 检测轴 [cosθ,sinθ]\n * @param {Array} axis 目标轴 [x,y]\n */\nfunction getProjectionRadius(checkAxis: [number, number], axis: [number, number]) {\n return Math.abs(axis[0] * checkAxis[0] + axis[1] * checkAxis[1]);\n}\n\nfunction rotate({ x, y }: Point, deg: number, origin = { x: 0, y: 0 }) {\n return {\n x: (x - origin.x) * Math.cos(deg) + (y - origin.y) * Math.sin(deg) + origin.x,\n y: (x - origin.x) * Math.sin(deg) + (origin.y - y) * Math.cos(deg) + origin.y\n };\n}\n\nfunction getCenterPoint(box: RotateBound): Point {\n return {\n x: (box.x1 + box.x2) / 2,\n y: (box.y1 + box.y2) / 2\n };\n}\n\ninterface RotateBound extends IBoundsLike {\n angle: number;\n rotateCenter?: { x: number; y: number };\n}\n\n/**\n * 转化为顶点坐标数组\n * @param {Object} box\n */\nfunction toRect(box: RotateBound, isDeg: boolean) {\n const deg = isDeg ? box.angle : degreeToRadian(box.angle);\n const cp = getCenterPoint(box);\n return [\n rotate(\n {\n x: box.x1,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y2\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x1,\n y: box.y2\n },\n deg,\n cp\n )\n ];\n}\nexport function isRotateAABBIntersect(\n box1: RotateBound,\n box2: RotateBound,\n isDeg = false,\n ctx?: CanvasRenderingContext2D\n) {\n const rect1 = toRect(box1, isDeg);\n const rect2 = toRect(box2, isDeg);\n const vector = (start: Point, end: Point) => {\n return [end.x - start.x, end.y - start.y] as [number, number];\n };\n\n if (ctx) {\n ctx.save();\n ctx.fillStyle = 'red';\n ctx.globalAlpha = 0.6;\n rect1.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n ctx.fillStyle = 'green';\n ctx.globalAlpha = 0.6;\n rect2.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n }\n\n // 两个矩形的中心点\n const p1 = getCenterPoint(box1);\n const p2 = getCenterPoint(box2);\n\n ctx && ctx.fillRect(p1.x, p1.y, 2, 2);\n ctx && ctx.fillRect(p2.x, p2.y, 2, 2);\n // 向量 p1p2\n const vp1p2 = vector(p1, p2);\n\n //矩形1的两边向量\n const AB = vector(rect1[0], rect1[1]);\n const BC = vector(rect1[1], rect1[2]);\n //矩形2的两边向量\n const A1B1 = vector(rect2[0], rect2[1]);\n const B1C1 = vector(rect2[1], rect2[2]);\n\n // 矩形1 的两个弧度\n const deg11 = isDeg ? box1.angle : degreeToRadian(box1.angle);\n let deg12 = isDeg ? box1.angle + halfPi : degreeToRadian(90 - box1.angle);\n // 矩形2 的两个弧度\n const deg21 = isDeg ? box2.angle : degreeToRadian(box2.angle);\n let deg22 = isDeg ? box2.angle + halfPi : degreeToRadian(90 - box2.angle);\n if (deg12 > pi2) {\n deg12 -= pi2;\n }\n if (deg22 > pi2) {\n deg22 -= pi2;\n }\n\n // 投影重叠\n const isCover = (\n checkAxisRadius: number,\n deg: number,\n targetAxis1: [number, number],\n targetAxis2: [number, number]\n ) => {\n const checkAxis = [Math.cos(deg), Math.sin(deg)] as [number, number];\n const targetAxisRadius =\n (getProjectionRadius(checkAxis, targetAxis1) + getProjectionRadius(checkAxis, targetAxis2)) / 2;\n const centerPointRadius = getProjectionRadius(checkAxis, vp1p2);\n // console.log('abc', `checkAxis:${checkAxis},三个投影:${checkAxisRadius}, ${targetAxisRadius}, ${centerPointRadius}`)\n return checkAxisRadius + targetAxisRadius > centerPointRadius;\n };\n\n return (\n isCover((box1.x2 - box1.x1) / 2, deg11, A1B1, B1C1) &&\n isCover((box1.y2 - box1.y1) / 2, deg12, A1B1, B1C1) &&\n isCover((box2.x2 - box2.x1) / 2, deg21, AB, BC) &&\n isCover((box2.y2 - box2.y1) / 2, deg22, AB, BC)\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vutils",
3
- "version": "0.18.6",
3
+ "version": "0.18.7",
4
4
  "main": "cjs/index.js",
5
5
  "module": "es/index.js",
6
6
  "types": "es/index.d.ts",
@@ -28,9 +28,9 @@
28
28
  "typescript": "4.9.5",
29
29
  "@types/node": "*",
30
30
  "@internal/bundler": "0.0.1",
31
+ "@internal/eslint-config": "0.0.1",
31
32
  "@internal/ts-config": "0.0.1",
32
- "@internal/jest-config": "0.0.1",
33
- "@internal/eslint-config": "0.0.1"
33
+ "@internal/jest-config": "0.0.1"
34
34
  },
35
35
  "dependencies": {
36
36
  "eventemitter3": "^4.0.7",
@@ -1 +0,0 @@
1
- export declare function findZeroOfFunction(f: any, a: any, b: any, parameters?: any): any;
@@ -1,27 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: !0
5
- }), exports.findZeroOfFunction = void 0;
6
-
7
- const logger_1 = require("../logger");
8
-
9
- function findZeroOfFunction(f, a, b, parameters) {
10
- const maxIterations = (parameters = parameters || {}).maxIterations || 100, tolerance = parameters.tolerance || 1e-10, fA = f(a), fB = f(b);
11
- let delta = b - a;
12
- if (fA * fB > 0) {
13
- return logger_1.Logger.getInstance().error("Initial bisect points must have opposite signs"),
14
- NaN;
15
- }
16
- if (0 === fA) return a;
17
- if (0 === fB) return b;
18
- for (let i = 0; i < maxIterations; ++i) {
19
- delta /= 2;
20
- const mid = a + delta, fMid = f(mid);
21
- if (fMid * fA >= 0 && (a = mid), Math.abs(delta) < tolerance || 0 === fMid) return mid;
22
- }
23
- return a + delta;
24
- }
25
-
26
- exports.findZeroOfFunction = findZeroOfFunction;
27
- //# sourceMappingURL=bisect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/fmin/bisect.ts"],"names":[],"mappings":";;;AASA,sCAAmC;AAInC,SAAgB,kBAAkB,CAAC,CAAM,EAAE,CAAM,EAAE,CAAM,EAAE,UAAgB;IACzE,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,IAAI,GAAG,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IAElB,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;QACf,MAAM,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,CAAC,CAAC;KACV;IACD,IAAI,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,CAAC,CAAC;KACV;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,CAAC,EAAE;QACtC,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEpB,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,EAAE;YAClB,CAAC,GAAG,GAAG,CAAC;SACT;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,IAAI,KAAK,CAAC,EAAE;YAC7C,OAAO,GAAG,CAAC;SACZ;KACF;IACD,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB,CAAC;AAnCD,gDAmCC","file":"bisect.js","sourcesContent":["/* Adapted from fmin by Ben Frederickson\n * https://github.com/benfred/fmin\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/benfred/fmin/blob/master/src/bisect.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n\nimport { Logger } from '../logger';\n\n/** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\nexport function findZeroOfFunction(f: any, a: any, b: any, parameters?: any) {\n parameters = parameters || {};\n const maxIterations = parameters.maxIterations || 100;\n const tolerance = parameters.tolerance || 1e-10;\n const fA = f(a);\n const fB = f(b);\n let delta = b - a;\n\n if (fA * fB > 0) {\n const logger = Logger.getInstance();\n logger.error('Initial bisect points must have opposite signs');\n return NaN;\n }\n\n if (fA === 0) {\n return a;\n }\n if (fB === 0) {\n return b;\n }\n\n for (let i = 0; i < maxIterations; ++i) {\n delta /= 2;\n const mid = a + delta;\n const fMid = f(mid);\n\n if (fMid * fA >= 0) {\n a = mid;\n }\n\n if (Math.abs(delta) < tolerance || fMid === 0) {\n return mid;\n }\n }\n return a + delta;\n}\n"]}
@@ -1 +0,0 @@
1
- export declare function findZeroOfFunction(f: any, a: any, b: any, parameters?: any): any;
package/es/fmin/bisect.js DELETED
@@ -1,19 +0,0 @@
1
- import { Logger } from "../logger";
2
-
3
- export function findZeroOfFunction(f, a, b, parameters) {
4
- const maxIterations = (parameters = parameters || {}).maxIterations || 100, tolerance = parameters.tolerance || 1e-10, fA = f(a), fB = f(b);
5
- let delta = b - a;
6
- if (fA * fB > 0) {
7
- return Logger.getInstance().error("Initial bisect points must have opposite signs"),
8
- NaN;
9
- }
10
- if (0 === fA) return a;
11
- if (0 === fB) return b;
12
- for (let i = 0; i < maxIterations; ++i) {
13
- delta /= 2;
14
- const mid = a + delta, fMid = f(mid);
15
- if (fMid * fA >= 0 && (a = mid), Math.abs(delta) < tolerance || 0 === fMid) return mid;
16
- }
17
- return a + delta;
18
- }
19
- //# sourceMappingURL=bisect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/fmin/bisect.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,MAAM,UAAU,kBAAkB,CAAC,CAAM,EAAE,CAAM,EAAE,CAAM,EAAE,UAAgB;IACzE,UAAU,GAAG,UAAU,IAAI,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,IAAI,GAAG,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IAElB,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,GAAG,CAAC;KACZ;IAED,IAAI,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,CAAC,CAAC;KACV;IACD,IAAI,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,CAAC,CAAC;KACV;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,CAAC,EAAE;QACtC,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEpB,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,EAAE;YAClB,CAAC,GAAG,GAAG,CAAC;SACT;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,IAAI,KAAK,CAAC,EAAE;YAC7C,OAAO,GAAG,CAAC;SACZ;KACF;IACD,OAAO,CAAC,GAAG,KAAK,CAAC;AACnB,CAAC","file":"bisect.js","sourcesContent":["/* Adapted from fmin by Ben Frederickson\n * https://github.com/benfred/fmin\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/benfred/fmin/blob/master/src/bisect.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n\nimport { Logger } from '../logger';\n\n/** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\nexport function findZeroOfFunction(f: any, a: any, b: any, parameters?: any) {\n parameters = parameters || {};\n const maxIterations = parameters.maxIterations || 100;\n const tolerance = parameters.tolerance || 1e-10;\n const fA = f(a);\n const fB = f(b);\n let delta = b - a;\n\n if (fA * fB > 0) {\n const logger = Logger.getInstance();\n logger.error('Initial bisect points must have opposite signs');\n return NaN;\n }\n\n if (fA === 0) {\n return a;\n }\n if (fB === 0) {\n return b;\n }\n\n for (let i = 0; i < maxIterations; ++i) {\n delta /= 2;\n const mid = a + delta;\n const fMid = f(mid);\n\n if (fMid * fA >= 0) {\n a = mid;\n }\n\n if (Math.abs(delta) < tolerance || fMid === 0) {\n return mid;\n }\n }\n return a + delta;\n}\n"]}