@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.
- package/README.zh-CN.md +12 -0
- package/REGRESSION.md +36 -0
- package/cjs/angle.d.ts +61 -0
- package/cjs/angle.js +73 -7
- package/cjs/angle.js.map +1 -1
- package/cjs/color/Color.d.ts +3 -0
- package/cjs/color/Color.js +64 -10
- package/cjs/color/Color.js.map +1 -1
- package/cjs/color/hexToRgb.d.ts +5 -0
- package/cjs/color/hexToRgb.js +5 -0
- package/cjs/color/hexToRgb.js.map +1 -1
- package/cjs/color/rgbToHsl.js +5 -1
- package/cjs/color/rgbToHsl.js.map +1 -1
- package/cjs/common/array.d.ts +43 -0
- package/cjs/common/array.js +44 -0
- package/cjs/common/array.js.map +1 -1
- package/cjs/common/bisect.d.ts +21 -0
- package/cjs/common/bisect.js +29 -0
- package/cjs/common/bisect.js.map +1 -1
- package/cjs/common/bootstrap.d.ts +5 -0
- package/cjs/common/bootstrap.js +22 -0
- package/cjs/common/bootstrap.js.map +1 -0
- package/cjs/common/clone.js +6 -0
- package/cjs/common/clone.js.map +1 -1
- package/cjs/common/cloneDeep.js +4 -1
- package/cjs/common/cloneDeep.js.map +1 -1
- package/cjs/common/correlation.d.ts +3 -0
- package/cjs/common/correlation.js +83 -0
- package/cjs/common/correlation.js.map +1 -0
- package/cjs/common/debounce.js +22 -4
- package/cjs/common/debounce.js.map +1 -1
- package/cjs/common/deviation.js +1 -2
- package/cjs/common/ecdf.d.ts +8 -0
- package/cjs/common/ecdf.js +11 -2
- package/cjs/common/ecdf.js.map +1 -1
- package/cjs/common/extent.d.ts +4 -0
- package/cjs/common/extent.js +4 -2
- package/cjs/common/extent.js.map +1 -1
- package/cjs/common/field.d.ts +6 -0
- package/cjs/common/field.js +3 -0
- package/cjs/common/field.js.map +1 -1
- package/cjs/common/has.d.ts +17 -0
- package/cjs/common/has.js +18 -1
- package/cjs/common/has.js.map +1 -1
- package/cjs/common/index.d.ts +5 -0
- package/cjs/common/index.js +34 -6
- package/cjs/common/index.js.map +1 -1
- package/cjs/common/interpolate.js +16 -3
- package/cjs/common/interpolate.js.map +1 -1
- package/cjs/common/isBase64.d.ts +6 -0
- package/cjs/common/isBase64.js +6 -0
- package/cjs/common/isBase64.js.map +1 -1
- package/cjs/common/isBoolean.d.ts +13 -0
- package/cjs/common/isBoolean.js +13 -1
- package/cjs/common/isBoolean.js.map +1 -1
- package/cjs/common/isEmpty.js +11 -1
- package/cjs/common/isEmpty.js.map +1 -1
- package/cjs/common/isEqual.js +19 -7
- package/cjs/common/isEqual.js.map +1 -1
- package/cjs/common/isFunction.d.ts +25 -0
- package/cjs/common/isFunction.js +27 -2
- package/cjs/common/isFunction.js.map +1 -1
- package/cjs/common/isNull.js +2 -1
- package/cjs/common/isNumber.d.ts +23 -0
- package/cjs/common/isNumber.js +23 -1
- package/cjs/common/isNumber.js.map +1 -1
- package/cjs/common/isNumeric.d.ts +25 -0
- package/cjs/common/isNumeric.js +25 -0
- package/cjs/common/isNumeric.js.map +1 -1
- package/cjs/common/isObject.d.ts +21 -0
- package/cjs/common/isObject.js +22 -0
- package/cjs/common/isObject.js.map +1 -1
- package/cjs/common/isObjectLike.d.ts +20 -0
- package/cjs/common/isObjectLike.js +21 -0
- package/cjs/common/isObjectLike.js.map +1 -1
- package/cjs/common/isPlainObject.d.ts +25 -0
- package/cjs/common/isPlainObject.js.map +1 -1
- package/cjs/common/isPrototype.js +1 -1
- package/cjs/common/isRegExp.js +1 -1
- package/cjs/common/isShallowEqual.js +1 -0
- package/cjs/common/isShallowEqual.js.map +1 -1
- package/cjs/common/isString.d.ts +13 -0
- package/cjs/common/isString.js +13 -1
- package/cjs/common/isString.js.map +1 -1
- package/cjs/common/isType.d.ts +6 -0
- package/cjs/common/isType.js +6 -0
- package/cjs/common/isType.js.map +1 -1
- package/cjs/common/isValidNumber.js.map +1 -1
- package/cjs/common/isValidUrl.js.map +1 -1
- package/cjs/common/kde.d.ts +28 -0
- package/cjs/common/kde.js +29 -5
- package/cjs/common/kde.js.map +1 -1
- package/cjs/common/mean.d.ts +2 -0
- package/cjs/common/mean.js +25 -0
- package/cjs/common/mean.js.map +1 -0
- package/cjs/common/merge.js +20 -4
- package/cjs/common/merge.js.map +1 -1
- package/cjs/common/mixin.js +14 -3
- package/cjs/common/mixin.js.map +1 -1
- package/cjs/common/normalQuantile.d.ts +5 -0
- package/cjs/common/normalQuantile.js +21 -0
- package/cjs/common/normalQuantile.js.map +1 -0
- package/cjs/common/number.d.ts +24 -0
- package/cjs/common/number.js +24 -1
- package/cjs/common/number.js.map +1 -1
- package/cjs/common/pad.d.ts +21 -0
- package/cjs/common/pad.js +21 -1
- package/cjs/common/pad.js.map +1 -1
- package/cjs/common/random.d.ts +3 -0
- package/cjs/common/random.js +13 -0
- package/cjs/common/random.js.map +1 -1
- package/cjs/common/regression-bootstrap.d.ts +14 -0
- package/cjs/common/regression-bootstrap.js +37 -0
- package/cjs/common/regression-bootstrap.js.map +1 -0
- package/cjs/common/regression-linear.d.ts +5 -0
- package/cjs/common/regression-linear.js +28 -39
- package/cjs/common/regression-linear.js.map +1 -1
- package/cjs/common/regression-logistic.d.ts +6 -0
- package/cjs/common/regression-logistic.js +25 -14
- package/cjs/common/regression-logistic.js.map +1 -1
- package/cjs/common/regression-lowess.d.ts +11 -1
- package/cjs/common/regression-lowess.js +125 -118
- package/cjs/common/regression-lowess.js.map +1 -1
- package/cjs/common/regression-polynomial.d.ts +1 -0
- package/cjs/common/regression-polynomial.js +24 -94
- package/cjs/common/regression-polynomial.js.map +1 -1
- package/cjs/common/regression-solver.d.ts +26 -0
- package/cjs/common/regression-solver.js +180 -0
- package/cjs/common/regression-solver.js.map +1 -0
- package/cjs/common/regression-utils.d.ts +13 -1
- package/cjs/common/regression-utils.js +27 -12
- package/cjs/common/regression-utils.js.map +1 -1
- package/cjs/common/throttle.js +3 -0
- package/cjs/common/throttle.js.map +1 -1
- package/cjs/common/toDate.js +22 -3
- package/cjs/common/toDate.js.map +1 -1
- package/cjs/common/uuid.d.ts +7 -0
- package/cjs/common/uuid.js +15 -1
- package/cjs/common/uuid.js.map +1 -1
- package/cjs/data-structure/bounds.d.ts +101 -0
- package/cjs/data-structure/bounds.js +74 -7
- package/cjs/data-structure/bounds.js.map +1 -1
- package/cjs/data-structure/hashTable.d.ts +4 -0
- package/cjs/data-structure/hashTable.js +11 -2
- package/cjs/data-structure/hashTable.js.map +1 -1
- package/cjs/data-structure/index.js +6 -2
- package/cjs/data-structure/index.js.map +1 -1
- package/cjs/data-structure/matrix.d.ts +91 -0
- package/cjs/data-structure/matrix.js +52 -4
- package/cjs/data-structure/matrix.js.map +1 -1
- package/cjs/data-structure/point.d.ts +3 -0
- package/cjs/data-structure/point.js +5 -1
- package/cjs/data-structure/point.js.map +1 -1
- package/cjs/dom.d.ts +36 -0
- package/cjs/dom.js +43 -1
- package/cjs/dom.js.map +1 -1
- package/cjs/fmin/blas1.js +10 -1
- package/cjs/fmin/blas1.js.map +1 -1
- package/cjs/fmin/conjugate-gradient.js +18 -3
- package/cjs/fmin/conjugate-gradient.js.map +1 -1
- package/cjs/fmin/linesearch.js +15 -1
- package/cjs/fmin/linesearch.js.map +1 -1
- package/cjs/fmin/nelder-mead.d.ts +1 -0
- package/cjs/fmin/nelder-mead.js +30 -10
- package/cjs/fmin/nelder-mead.js.map +1 -1
- package/cjs/format/number/formatDecimal.js +9 -1
- package/cjs/format/number/formatDecimal.js.map +1 -1
- package/cjs/format/number/formatGroup.js +7 -0
- package/cjs/format/number/formatGroup.js.map +1 -1
- package/cjs/format/number/formatPrefixAuto.js +8 -0
- package/cjs/format/number/formatPrefixAuto.js.map +1 -1
- package/cjs/format/number/formatRounded.js +7 -0
- package/cjs/format/number/formatRounded.js.map +1 -1
- package/cjs/format/number/formatTrim.js +7 -0
- package/cjs/format/number/formatTrim.js.map +1 -1
- package/cjs/format/number/number.js +39 -9
- package/cjs/format/number/number.js.map +1 -1
- package/cjs/format/time.js +23 -6
- package/cjs/format/time.js.map +1 -1
- package/cjs/geo/circle-intersection.d.ts +12 -0
- package/cjs/geo/circle-intersection.js +54 -9
- package/cjs/geo/circle-intersection.js.map +1 -1
- package/cjs/geo/constant.js +8 -1
- package/cjs/geo/constant.js.map +1 -1
- package/cjs/geo/invariant.d.ts +22 -0
- package/cjs/geo/invariant.js +24 -1
- package/cjs/geo/invariant.js.map +1 -1
- package/cjs/graphics/algorithm/aabb.js +7 -3
- package/cjs/graphics/algorithm/aabb.js.map +1 -1
- package/cjs/graphics/algorithm/intersect.d.ts +48 -0
- package/cjs/graphics/algorithm/intersect.js +75 -7
- package/cjs/graphics/algorithm/intersect.js.map +1 -1
- package/cjs/graphics/bounds-util.js +4 -2
- package/cjs/graphics/bounds-util.js.map +1 -1
- package/cjs/graphics/graph-util.js +4 -0
- package/cjs/graphics/graph-util.js.map +1 -1
- package/cjs/graphics/index.js +7 -4
- package/cjs/graphics/index.js.map +1 -1
- package/cjs/graphics/polygon.d.ts +12 -0
- package/cjs/graphics/polygon.js +28 -5
- package/cjs/graphics/polygon.js.map +1 -1
- package/cjs/graphics/text/measure/interface.d.ts +12 -0
- package/cjs/graphics/text/measure/textMeasure.d.ts +23 -0
- package/cjs/graphics/text/measure/textMeasure.js +50 -22
- package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
- package/cjs/graphics/text/measure/util.js +1 -0
- package/cjs/graphics/text/measure/util.js.map +1 -1
- package/cjs/graphics/text/stringWidth.js +7 -3
- package/cjs/graphics/text/stringWidth.js.map +1 -1
- package/cjs/index.d.ts +6 -0
- package/cjs/index.js +19 -4
- package/cjs/index.js.map +1 -1
- package/cjs/logger.js +12 -2
- package/cjs/logger.js.map +1 -1
- package/cjs/lru.js +14 -6
- package/cjs/lru.js.map +1 -1
- package/cjs/math.d.ts +9 -0
- package/cjs/math.js +10 -0
- package/cjs/math.js.map +1 -1
- package/cjs/padding.d.ts +5 -0
- package/cjs/padding.js +5 -0
- package/cjs/padding.js.map +1 -1
- package/cjs/time/formatUtils.d.ts +6 -0
- package/cjs/time/formatUtils.js +7 -0
- package/cjs/time/formatUtils.js.map +1 -1
- package/dist/index.js +2035 -411
- package/dist/index.min.js +128 -1
- package/es/angle.d.ts +61 -0
- package/es/angle.js +66 -10
- package/es/angle.js.map +1 -1
- package/es/color/Color.d.ts +3 -0
- package/es/color/Color.js +64 -9
- package/es/color/Color.js.map +1 -1
- package/es/color/hexToRgb.d.ts +5 -0
- package/es/color/hexToRgb.js +5 -0
- package/es/color/hexToRgb.js.map +1 -1
- package/es/color/rgbToHsl.js +5 -1
- package/es/color/rgbToHsl.js.map +1 -1
- package/es/common/array.d.ts +43 -0
- package/es/common/array.js +44 -8
- package/es/common/array.js.map +1 -1
- package/es/common/bisect.d.ts +21 -0
- package/es/common/bisect.js +29 -4
- package/es/common/bisect.js.map +1 -1
- package/es/common/bootstrap.d.ts +5 -0
- package/es/common/bootstrap.js +14 -0
- package/es/common/bootstrap.js.map +1 -0
- package/es/common/clone.js +6 -0
- package/es/common/clone.js.map +1 -1
- package/es/common/cloneDeep.js +4 -1
- package/es/common/cloneDeep.js.map +1 -1
- package/es/common/correlation.d.ts +3 -0
- package/es/common/correlation.js +77 -0
- package/es/common/correlation.js.map +1 -0
- package/es/common/debounce.js +22 -4
- package/es/common/debounce.js.map +1 -1
- package/es/common/deviation.js +1 -2
- package/es/common/ecdf.d.ts +8 -0
- package/es/common/ecdf.js +11 -1
- package/es/common/ecdf.js.map +1 -1
- package/es/common/extent.d.ts +4 -0
- package/es/common/extent.js +8 -3
- package/es/common/extent.js.map +1 -1
- package/es/common/field.d.ts +6 -0
- package/es/common/field.js +3 -1
- package/es/common/field.js.map +1 -1
- package/es/common/has.d.ts +17 -0
- package/es/common/has.js +18 -1
- package/es/common/has.js.map +1 -1
- package/es/common/index.d.ts +5 -0
- package/es/common/index.js +24 -0
- package/es/common/index.js.map +1 -1
- package/es/common/interpolate.js +16 -3
- package/es/common/interpolate.js.map +1 -1
- package/es/common/isBase64.d.ts +6 -0
- package/es/common/isBase64.js +6 -0
- package/es/common/isBase64.js.map +1 -1
- package/es/common/isBoolean.d.ts +13 -0
- package/es/common/isBoolean.js +13 -1
- package/es/common/isBoolean.js.map +1 -1
- package/es/common/isEmpty.js +11 -1
- package/es/common/isEmpty.js.map +1 -1
- package/es/common/isEqual.js +19 -7
- package/es/common/isEqual.js.map +1 -1
- package/es/common/isFunction.d.ts +25 -0
- package/es/common/isFunction.js +27 -2
- package/es/common/isFunction.js.map +1 -1
- package/es/common/isNull.js +2 -1
- package/es/common/isNumber.d.ts +23 -0
- package/es/common/isNumber.js +23 -1
- package/es/common/isNumber.js.map +1 -1
- package/es/common/isNumeric.d.ts +25 -0
- package/es/common/isNumeric.js +25 -0
- package/es/common/isNumeric.js.map +1 -1
- package/es/common/isObject.d.ts +21 -0
- package/es/common/isObject.js +22 -0
- package/es/common/isObject.js.map +1 -1
- package/es/common/isObjectLike.d.ts +20 -0
- package/es/common/isObjectLike.js +21 -0
- package/es/common/isObjectLike.js.map +1 -1
- package/es/common/isPlainObject.d.ts +25 -0
- package/es/common/isPlainObject.js +26 -0
- package/es/common/isPlainObject.js.map +1 -1
- package/es/common/isPrototype.js +1 -1
- package/es/common/isRegExp.js +1 -1
- package/es/common/isShallowEqual.js +1 -0
- package/es/common/isShallowEqual.js.map +1 -1
- package/es/common/isString.d.ts +13 -0
- package/es/common/isString.js +13 -1
- package/es/common/isString.js.map +1 -1
- package/es/common/isType.d.ts +6 -0
- package/es/common/isType.js +6 -0
- package/es/common/isType.js.map +1 -1
- package/es/common/isValidNumber.js.map +1 -1
- package/es/common/isValidUrl.js.map +1 -1
- package/es/common/kde.d.ts +28 -0
- package/es/common/kde.js +29 -7
- package/es/common/kde.js.map +1 -1
- package/es/common/mean.d.ts +2 -0
- package/es/common/mean.js +19 -0
- package/es/common/mean.js.map +1 -0
- package/es/common/merge.js +22 -5
- package/es/common/merge.js.map +1 -1
- package/es/common/mixin.js +14 -3
- package/es/common/mixin.js.map +1 -1
- package/es/common/normalQuantile.d.ts +5 -0
- package/es/common/normalQuantile.js +15 -0
- package/es/common/normalQuantile.js.map +1 -0
- package/es/common/number.d.ts +24 -0
- package/es/common/number.js +24 -2
- package/es/common/number.js.map +1 -1
- package/es/common/pad.d.ts +21 -0
- package/es/common/pad.js +21 -1
- package/es/common/pad.js.map +1 -1
- package/es/common/random.d.ts +3 -0
- package/es/common/random.js +13 -1
- package/es/common/random.js.map +1 -1
- package/es/common/regression-bootstrap.d.ts +14 -0
- package/es/common/regression-bootstrap.js +31 -0
- package/es/common/regression-bootstrap.js.map +1 -0
- package/es/common/regression-linear.d.ts +5 -0
- package/es/common/regression-linear.js +25 -39
- package/es/common/regression-linear.js.map +1 -1
- package/es/common/regression-logistic.d.ts +6 -0
- package/es/common/regression-logistic.js +24 -16
- package/es/common/regression-logistic.js.map +1 -1
- package/es/common/regression-lowess.d.ts +11 -1
- package/es/common/regression-lowess.js +120 -118
- package/es/common/regression-lowess.js.map +1 -1
- package/es/common/regression-polynomial.d.ts +1 -0
- package/es/common/regression-polynomial.js +21 -89
- package/es/common/regression-polynomial.js.map +1 -1
- package/es/common/regression-solver.d.ts +26 -0
- package/es/common/regression-solver.js +168 -0
- package/es/common/regression-solver.js.map +1 -0
- package/es/common/regression-utils.d.ts +13 -1
- package/es/common/regression-utils.js +18 -9
- package/es/common/regression-utils.js.map +1 -1
- package/es/common/throttle.js +3 -0
- package/es/common/throttle.js.map +1 -1
- package/es/common/toDate.js +23 -3
- package/es/common/toDate.js.map +1 -1
- package/es/common/uuid.d.ts +7 -0
- package/es/common/uuid.js +15 -1
- package/es/common/uuid.js.map +1 -1
- package/es/data-structure/bounds.d.ts +101 -0
- package/es/data-structure/bounds.js +74 -8
- package/es/data-structure/bounds.js.map +1 -1
- package/es/data-structure/hashTable.d.ts +4 -0
- package/es/data-structure/hashTable.js +11 -2
- package/es/data-structure/hashTable.js.map +1 -1
- package/es/data-structure/index.js +2 -0
- package/es/data-structure/index.js.map +1 -1
- package/es/data-structure/matrix.d.ts +91 -0
- package/es/data-structure/matrix.js +52 -5
- package/es/data-structure/matrix.js.map +1 -1
- package/es/data-structure/point.d.ts +3 -0
- package/es/data-structure/point.js +5 -1
- package/es/data-structure/point.js.map +1 -1
- package/es/dom.d.ts +36 -0
- package/es/dom.js +43 -8
- package/es/dom.js.map +1 -1
- package/es/fmin/blas1.js +10 -0
- package/es/fmin/blas1.js.map +1 -1
- package/es/fmin/conjugate-gradient.js +18 -2
- package/es/fmin/conjugate-gradient.js.map +1 -1
- package/es/fmin/linesearch.js +15 -0
- package/es/fmin/linesearch.js.map +1 -1
- package/es/fmin/nelder-mead.d.ts +1 -0
- package/es/fmin/nelder-mead.js +29 -9
- package/es/fmin/nelder-mead.js.map +1 -1
- package/es/format/number/formatDecimal.js +9 -1
- package/es/format/number/formatDecimal.js.map +1 -1
- package/es/format/number/formatGroup.js +7 -0
- package/es/format/number/formatGroup.js.map +1 -1
- package/es/format/number/formatPrefixAuto.js +8 -0
- package/es/format/number/formatPrefixAuto.js.map +1 -1
- package/es/format/number/formatRounded.js +7 -0
- package/es/format/number/formatRounded.js.map +1 -1
- package/es/format/number/formatTrim.js +7 -0
- package/es/format/number/formatTrim.js.map +1 -1
- package/es/format/number/number.js +40 -8
- package/es/format/number/number.js.map +1 -1
- package/es/format/time.js +23 -5
- package/es/format/time.js.map +1 -1
- package/es/geo/circle-intersection.d.ts +12 -0
- package/es/geo/circle-intersection.js +54 -14
- package/es/geo/circle-intersection.js.map +1 -1
- package/es/geo/constant.js +8 -0
- package/es/geo/constant.js.map +1 -1
- package/es/geo/invariant.d.ts +22 -0
- package/es/geo/invariant.js +24 -0
- package/es/geo/invariant.js.map +1 -1
- package/es/graphics/algorithm/aabb.js +7 -3
- package/es/graphics/algorithm/aabb.js.map +1 -1
- package/es/graphics/algorithm/intersect.d.ts +48 -0
- package/es/graphics/algorithm/intersect.js +75 -12
- package/es/graphics/algorithm/intersect.js.map +1 -1
- package/es/graphics/bounds-util.js +4 -2
- package/es/graphics/bounds-util.js.map +1 -1
- package/es/graphics/graph-util.js +4 -0
- package/es/graphics/graph-util.js.map +1 -1
- package/es/graphics/index.js +2 -0
- package/es/graphics/index.js.map +1 -1
- package/es/graphics/polygon.d.ts +12 -0
- package/es/graphics/polygon.js +28 -6
- package/es/graphics/polygon.js.map +1 -1
- package/es/graphics/text/measure/interface.d.ts +12 -0
- package/es/graphics/text/measure/textMeasure.d.ts +23 -0
- package/es/graphics/text/measure/textMeasure.js +46 -21
- package/es/graphics/text/measure/textMeasure.js.map +1 -1
- package/es/graphics/text/measure/util.js +1 -0
- package/es/graphics/text/measure/util.js.map +1 -1
- package/es/graphics/text/stringWidth.js +7 -3
- package/es/graphics/text/stringWidth.js.map +1 -1
- package/es/index.d.ts +6 -0
- package/es/index.js +15 -1
- package/es/index.js.map +1 -1
- package/es/logger.js +12 -1
- package/es/logger.js.map +1 -1
- package/es/lru.js +14 -6
- package/es/lru.js.map +1 -1
- package/es/math.d.ts +9 -0
- package/es/math.js +10 -1
- package/es/math.js.map +1 -1
- package/es/padding.d.ts +5 -0
- package/es/padding.js +5 -1
- package/es/padding.js.map +1 -1
- package/es/time/formatUtils.d.ts +6 -0
- package/es/time/formatUtils.js +7 -1
- package/es/time/formatUtils.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/matrix.ts"],"names":[],"mappings":"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","file":"matrix.js","sourcesContent":["import { radianToDegree } from '../angle';\nimport type { vec2 } from '../math';\nimport { cos, sin } from '../math';\nimport type { IPointLike } from './point';\n\nexport interface IMatrixLike {\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n}\n\n// 不建议用户直接操作matrix\nexport interface IMatrix {\n /**\n * scale x\n */\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n\n setValue: (a: number, b: number, c: number, d: number, e: number, f: number) => IMatrix;\n /**\n * 获取当前矩阵的逆矩阵\n */\n getInverse: () => IMatrix;\n rotate: (rad: number) => IMatrix;\n rotateByCenter: (rad: number, cx: number, cy: number) => IMatrix;\n scale: (sx: number, sy: number) => IMatrix;\n setScale: (sx: number, sy: number) => IMatrix;\n transform: (a: number, b: number, c: number, d: number, e: number, f: number) => IMatrix;\n translate: (x: number, y: number) => IMatrix;\n transpose: () => IMatrix;\n equalToMatrix: (m2: IMatrixLike) => boolean;\n equalTo: (a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) => boolean;\n /**\n * 矩阵相乘\n * @param matrix\n */\n multiply: (a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) => IMatrix;\n /**\n * 插值计算\n * @param m2\n * @param t\n */\n interpolate: (m2: IMatrix, t: number) => IMatrix;\n\n // 将point转到当前矩阵的坐标空间中\n transformPoint: (source: IPointLike, target: IPointLike) => void;\n\n reset: () => IMatrix;\n\n // 是否只有translate\n onlyTranslate: (scale?: number) => boolean;\n\n clone: () => IMatrix;\n\n toTransformAttrs: () => {\n x: number;\n y: number;\n scaleX: number;\n scaleY: number;\n skewX: number;\n skewY: number;\n rotateDeg: number;\n };\n}\n\nexport class Matrix implements IMatrix {\n /**\n * scale x\n */\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n\n constructor(a: number = 1, b: number = 0, c: number = 0, d: number = 1, e: number = 0, f: number = 0) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n }\n\n equalToMatrix(m2: IMatrixLike): boolean {\n // ef -> ad -> bc\n return !(\n this.e !== m2.e ||\n this.f !== m2.f ||\n this.a !== m2.a ||\n this.d !== m2.d ||\n this.b !== m2.b ||\n this.c !== m2.c\n );\n }\n equalTo(a: number, b: number, c: number, d: number, e: number, f: number): boolean {\n // ef -> ad -> bc\n return !(this.e !== e || this.f !== f || this.a !== a || this.d !== d || this.b !== b || this.c !== c);\n }\n\n setValue(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n\n reset(): this {\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n }\n\n /**\n * 获取当前矩阵的逆矩阵\n */\n getInverse() {\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n const m = new Matrix();\n const dt = a * d - b * c;\n\n m.a = d / dt;\n m.b = -b / dt;\n m.c = -c / dt;\n m.d = a / dt;\n m.e = (c * f - d * e) / dt;\n m.f = -(a * f - b * e) / dt;\n\n return m;\n }\n\n rotate(rad: number) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.a * c + this.c * s;\n const m12 = this.b * c + this.d * s;\n const m21 = this.a * -s + this.c * c;\n const m22 = this.b * -s + this.d * c;\n this.a = m11;\n this.b = m12;\n this.c = m21;\n this.d = m22;\n return this;\n }\n\n rotateByCenter(rad: number, cx: number, cy: number) {\n /** rotate matrix\n * | cos -sin (1-cos)*cx+sin*cy |\n * | sin cos (1-cos)*cy-sin*cx |\n * | 0 0 1 |\n * after multiply\n * m13 = (1-cos)*cx+sin*cy;\n * m23 = (1-cos)*cy-sin*cx;\n * | cos*a-sin*b cos*c-sin*d cos*e-sin*f+m13 |\n * | sin*a+cos*b sin*c+cos*d sin*e+cos*f+m23 |\n * | 0 0 1 |\n */\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const rotateM13 = (1 - cos) * cx + sin * cy;\n const rotateM23 = (1 - cos) * cy - sin * cx;\n const m11 = cos * this.a - sin * this.b;\n const m21 = sin * this.a + cos * this.b;\n const m12 = cos * this.c - sin * this.d;\n const m22 = sin * this.c + cos * this.d;\n const m13 = cos * this.e - sin * this.f + rotateM13;\n const m23 = sin * this.e + cos * this.f + rotateM23;\n this.a = m11;\n this.b = m21;\n this.c = m12;\n this.d = m22;\n this.e = m13;\n this.f = m23;\n return this;\n }\n\n scale(sx: number, sy: number) {\n this.a *= sx;\n this.b *= sx;\n this.c *= sy;\n this.d *= sy;\n return this;\n }\n\n setScale(sx: number, sy: number) {\n this.b = (this.b / this.a) * sx;\n this.c = (this.c / this.d) * sy;\n this.a = sx;\n this.d = sy;\n return this;\n }\n\n transform(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.multiply(a, b, c, d, e, f);\n return this;\n }\n\n translate(x: number, y: number) {\n this.e += this.a * x + this.c * y;\n this.f += this.b * x + this.d * y;\n return this;\n }\n\n transpose() {\n /** transpose matrix\n * | 0 1 0 |\n * | 1 0 0 |\n * | 0 0 1 |\n * after multiply\n * | b d f |\n * | a c e |\n * | 0 0 1 |\n */\n const { a, b, c, d, e, f } = this;\n this.a = b;\n this.b = a;\n this.c = d;\n this.d = c;\n this.e = f;\n this.f = e;\n return this;\n }\n\n /**\n * 矩阵相乘\n * @param matrix\n */\n multiply(a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) {\n const a1 = this.a;\n const b1 = this.b;\n const c1 = this.c;\n const d1 = this.d;\n const e1 = this.e;\n const f1 = this.f;\n\n const m11 = a1 * a2 + c1 * b2;\n const m12 = b1 * a2 + d1 * b2;\n const m21 = a1 * c2 + c1 * d2;\n const m22 = b1 * c2 + d1 * d2;\n const dx = a1 * e2 + c1 * f2 + e1;\n const dy = b1 * e2 + d1 * f2 + f1;\n\n this.a = m11;\n this.b = m12;\n this.c = m21;\n this.d = m22;\n this.e = dx;\n this.f = dy;\n return this;\n }\n\n /**\n * 插值计算\n * @param m2\n * @param t\n */\n interpolate(m2: Matrix, t: number) {\n const m = new Matrix();\n\n m.a = this.a + (m2.a - this.a) * t;\n m.b = this.b + (m2.b - this.b) * t;\n m.c = this.c + (m2.c - this.c) * t;\n m.d = this.d + (m2.d - this.d) * t;\n m.e = this.e + (m2.e - this.e) * t;\n m.f = this.f + (m2.f - this.f) * t;\n\n return m;\n }\n\n /**\n * 将point转到当前矩阵的坐标空间中\n * @param source\n * @param target\n */\n transformPoint(source: IPointLike, target: IPointLike) {\n const { a, b, c, d, e, f } = this;\n const dt = a * d - b * c;\n\n const nextA = d / dt;\n const nextB = -b / dt;\n const nextC = -c / dt;\n const nextD = a / dt;\n const nextE = (c * f - d * e) / dt;\n const nextF = -(a * f - b * e) / dt;\n\n const { x, y } = source;\n target.x = x * nextA + y * nextC + nextE;\n target.y = x * nextB + y * nextD + nextF;\n }\n\n // 只有translate\n onlyTranslate(scale: number = 1): boolean {\n return this.a === scale && this.b === 0 && this.c === 0 && this.d === scale;\n }\n\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n\n toTransformAttrs() {\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n const delta = a * d - b * c;\n\n const result = {\n x: e,\n y: f,\n rotateDeg: 0,\n scaleX: 0,\n scaleY: 0,\n skewX: 0,\n skewY: 0\n };\n\n // Apply the QR-like decomposition.\n if (a !== 0 || b !== 0) {\n const r = Math.sqrt(a * a + b * b);\n result.rotateDeg = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);\n result.scaleX = r;\n result.scaleY = delta / r;\n result.skewX = (a * c + b * d) / delta;\n result.skewY = 0;\n } else if (c !== 0 || d !== 0) {\n const s = Math.sqrt(c * c + d * d);\n result.rotateDeg = Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));\n result.scaleX = delta / s;\n result.scaleY = s;\n result.skewX = 0;\n result.skewY = (a * c + b * d) / delta;\n } else {\n // a = b = c = d = 0\n }\n\n result.rotateDeg = radianToDegree(result.rotateDeg);\n\n return result;\n }\n}\n\n/**\n * 对matrix进行通常的变换(基于rotateCenter进行旋转的同时进行translate和scale)\n * @param out\n * @param origin\n * @param x\n * @param y\n * @param scaleX\n * @param scaleY\n * @param angle\n * @param rotateCenter\n */\nexport function normalTransform(\n out: Matrix,\n origin: Matrix,\n x: number,\n y: number,\n scaleX: number,\n scaleY: number,\n angle: number,\n rotateCenter?: vec2\n) {\n const oa = origin.a;\n const ob = origin.b;\n const oc = origin.c;\n const od = origin.d;\n const oe = origin.e;\n const of = origin.f;\n const cosTheta = cos(angle);\n const sinTheta = sin(angle);\n let rotateCenterX: number;\n let rotateCenterY: number;\n if (rotateCenter) {\n rotateCenterX = rotateCenter[0];\n rotateCenterY = rotateCenter[1];\n } else {\n rotateCenterX = x;\n rotateCenterY = y;\n }\n const offsetX = rotateCenterX - x;\n const offsetY = rotateCenterY - y;\n\n const a1 = oa * cosTheta + oc * sinTheta;\n const b1 = ob * cosTheta + od * sinTheta;\n const c1 = oc * cosTheta - oa * sinTheta;\n const d1 = od * cosTheta - ob * sinTheta;\n out.a = scaleX * a1;\n out.b = scaleX * b1;\n out.c = scaleY * c1;\n out.d = scaleY * d1;\n\n out.e = oe + oa * rotateCenterX + oc * rotateCenterY - a1 * offsetX - c1 * offsetY;\n out.f = of + ob * rotateCenterX + od * rotateCenterY - b1 * offsetX - d1 * offsetY;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-structure/matrix.ts"],"names":[],"mappings":"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","file":"matrix.js","sourcesContent":["import { radianToDegree } from '../angle';\nimport type { vec2 } from '../math';\nimport { cos, sin } from '../math';\nimport type { IPointLike } from './point';\n\nexport interface IMatrixLike {\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n}\n\n// 不建议用户直接操作matrix\nexport interface IMatrix {\n /**\n * scale x\n */\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n\n setValue: (a: number, b: number, c: number, d: number, e: number, f: number) => IMatrix;\n /**\n * 获取当前矩阵的逆矩阵\n */\n getInverse: () => IMatrix;\n rotate: (rad: number) => IMatrix;\n rotateByCenter: (rad: number, cx: number, cy: number) => IMatrix;\n scale: (sx: number, sy: number) => IMatrix;\n setScale: (sx: number, sy: number) => IMatrix;\n transform: (a: number, b: number, c: number, d: number, e: number, f: number) => IMatrix;\n translate: (x: number, y: number) => IMatrix;\n transpose: () => IMatrix;\n equalToMatrix: (m2: IMatrixLike) => boolean;\n equalTo: (a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) => boolean;\n /**\n * 矩阵相乘\n * @param matrix\n */\n multiply: (a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) => IMatrix;\n /**\n * 插值计算\n * @param m2\n * @param t\n */\n interpolate: (m2: IMatrix, t: number) => IMatrix;\n\n // 将point转到当前矩阵的坐标空间中\n transformPoint: (source: IPointLike, target: IPointLike) => void;\n\n reset: () => IMatrix;\n\n // 是否只有translate\n onlyTranslate: (scale?: number) => boolean;\n\n clone: () => IMatrix;\n\n toTransformAttrs: () => {\n x: number;\n y: number;\n scaleX: number;\n scaleY: number;\n skewX: number;\n skewY: number;\n rotateDeg: number;\n };\n}\n\nexport class Matrix implements IMatrix {\n /**\n * scale x\n */\n a: number;\n /**\n * skew y\n */\n b: number;\n /**\n * skewx\n */\n c: number;\n /**\n * scale y\n */\n d: number;\n /**\n * translate x\n */\n e: number;\n /**\n * translate y\n */\n f: number;\n\n constructor(a: number = 1, b: number = 0, c: number = 0, d: number = 1, e: number = 0, f: number = 0) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n }\n\n equalToMatrix(m2: IMatrixLike): boolean {\n // ef -> ad -> bc\n return !(\n this.e !== m2.e ||\n this.f !== m2.f ||\n this.a !== m2.a ||\n this.d !== m2.d ||\n this.b !== m2.b ||\n this.c !== m2.c\n );\n }\n equalTo(a: number, b: number, c: number, d: number, e: number, f: number): boolean {\n // ef -> ad -> bc\n return !(this.e !== e || this.f !== f || this.a !== a || this.d !== d || this.b !== b || this.c !== c);\n }\n\n setValue(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n return this;\n }\n\n reset(): this {\n this.a = 1;\n this.b = 0;\n this.c = 0;\n this.d = 1;\n this.e = 0;\n this.f = 0;\n return this;\n }\n\n /**\n * 获取当前矩阵的逆矩阵\n */\n getInverse() {\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n const m = new Matrix();\n const dt = a * d - b * c;\n\n m.a = d / dt;\n m.b = -b / dt;\n m.c = -c / dt;\n m.d = a / dt;\n m.e = (c * f - d * e) / dt;\n m.f = -(a * f - b * e) / dt;\n\n return m;\n }\n\n rotate(rad: number) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.a * c + this.c * s;\n const m12 = this.b * c + this.d * s;\n const m21 = this.a * -s + this.c * c;\n const m22 = this.b * -s + this.d * c;\n this.a = m11;\n this.b = m12;\n this.c = m21;\n this.d = m22;\n return this;\n }\n\n rotateByCenter(rad: number, cx: number, cy: number) {\n /** rotate matrix\n * | cos -sin (1-cos)*cx+sin*cy |\n * | sin cos (1-cos)*cy-sin*cx |\n * | 0 0 1 |\n * after multiply\n * m13 = (1-cos)*cx+sin*cy;\n * m23 = (1-cos)*cy-sin*cx;\n * | cos*a-sin*b cos*c-sin*d cos*e-sin*f+m13 |\n * | sin*a+cos*b sin*c+cos*d sin*e+cos*f+m23 |\n * | 0 0 1 |\n */\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const rotateM13 = (1 - cos) * cx + sin * cy;\n const rotateM23 = (1 - cos) * cy - sin * cx;\n const m11 = cos * this.a - sin * this.b;\n const m21 = sin * this.a + cos * this.b;\n const m12 = cos * this.c - sin * this.d;\n const m22 = sin * this.c + cos * this.d;\n const m13 = cos * this.e - sin * this.f + rotateM13;\n const m23 = sin * this.e + cos * this.f + rotateM23;\n this.a = m11;\n this.b = m21;\n this.c = m12;\n this.d = m22;\n this.e = m13;\n this.f = m23;\n return this;\n }\n\n scale(sx: number, sy: number) {\n this.a *= sx;\n this.b *= sx;\n this.c *= sy;\n this.d *= sy;\n return this;\n }\n\n setScale(sx: number, sy: number) {\n this.b = (this.b / this.a) * sx;\n this.c = (this.c / this.d) * sy;\n this.a = sx;\n this.d = sy;\n return this;\n }\n\n transform(a: number, b: number, c: number, d: number, e: number, f: number) {\n this.multiply(a, b, c, d, e, f);\n return this;\n }\n\n translate(x: number, y: number) {\n this.e += this.a * x + this.c * y;\n this.f += this.b * x + this.d * y;\n return this;\n }\n\n transpose() {\n /** transpose matrix\n * | 0 1 0 |\n * | 1 0 0 |\n * | 0 0 1 |\n * after multiply\n * | b d f |\n * | a c e |\n * | 0 0 1 |\n */\n const { a, b, c, d, e, f } = this;\n this.a = b;\n this.b = a;\n this.c = d;\n this.d = c;\n this.e = f;\n this.f = e;\n return this;\n }\n\n /**\n * 矩阵相乘\n * @param matrix\n */\n multiply(a2: number, b2: number, c2: number, d2: number, e2: number, f2: number) {\n const a1 = this.a;\n const b1 = this.b;\n const c1 = this.c;\n const d1 = this.d;\n const e1 = this.e;\n const f1 = this.f;\n\n const m11 = a1 * a2 + c1 * b2;\n const m12 = b1 * a2 + d1 * b2;\n const m21 = a1 * c2 + c1 * d2;\n const m22 = b1 * c2 + d1 * d2;\n const dx = a1 * e2 + c1 * f2 + e1;\n const dy = b1 * e2 + d1 * f2 + f1;\n\n this.a = m11;\n this.b = m12;\n this.c = m21;\n this.d = m22;\n this.e = dx;\n this.f = dy;\n return this;\n }\n\n /**\n * 插值计算\n * @param m2\n * @param t\n */\n interpolate(m2: Matrix, t: number) {\n const m = new Matrix();\n\n m.a = this.a + (m2.a - this.a) * t;\n m.b = this.b + (m2.b - this.b) * t;\n m.c = this.c + (m2.c - this.c) * t;\n m.d = this.d + (m2.d - this.d) * t;\n m.e = this.e + (m2.e - this.e) * t;\n m.f = this.f + (m2.f - this.f) * t;\n\n return m;\n }\n\n /**\n * 将point转到当前矩阵的坐标空间中\n * @param source\n * @param target\n */\n transformPoint(source: IPointLike, target: IPointLike) {\n const { a, b, c, d, e, f } = this;\n const dt = a * d - b * c;\n\n const nextA = d / dt;\n const nextB = -b / dt;\n const nextC = -c / dt;\n const nextD = a / dt;\n const nextE = (c * f - d * e) / dt;\n const nextF = -(a * f - b * e) / dt;\n\n const { x, y } = source;\n target.x = x * nextA + y * nextC + nextE;\n target.y = x * nextB + y * nextD + nextF;\n }\n\n // 只有translate\n onlyTranslate(scale: number = 1): boolean {\n return this.a === scale && this.b === 0 && this.c === 0 && this.d === scale;\n }\n\n clone(): Matrix {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n\n toTransformAttrs() {\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n const delta = a * d - b * c;\n\n const result = {\n x: e,\n y: f,\n rotateDeg: 0,\n scaleX: 0,\n scaleY: 0,\n skewX: 0,\n skewY: 0\n };\n\n // Apply the QR-like decomposition.\n if (a !== 0 || b !== 0) {\n const r = Math.sqrt(a * a + b * b);\n result.rotateDeg = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);\n result.scaleX = r;\n result.scaleY = delta / r;\n result.skewX = (a * c + b * d) / delta;\n result.skewY = 0;\n } else if (c !== 0 || d !== 0) {\n const s = Math.sqrt(c * c + d * d);\n result.rotateDeg = Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));\n result.scaleX = delta / s;\n result.scaleY = s;\n result.skewX = 0;\n result.skewY = (a * c + b * d) / delta;\n } else {\n // a = b = c = d = 0\n }\n\n result.rotateDeg = radianToDegree(result.rotateDeg);\n\n return result;\n }\n}\n\n/**\n * 对matrix进行通常的变换(基于rotateCenter进行旋转的同时进行translate和scale)\n * @param out\n * @param origin\n * @param x\n * @param y\n * @param scaleX\n * @param scaleY\n * @param angle\n * @param rotateCenter\n */\nexport function normalTransform(\n out: Matrix,\n origin: Matrix,\n x: number,\n y: number,\n scaleX: number,\n scaleY: number,\n angle: number,\n rotateCenter?: vec2\n) {\n const oa = origin.a;\n const ob = origin.b;\n const oc = origin.c;\n const od = origin.d;\n const oe = origin.e;\n const of = origin.f;\n const cosTheta = cos(angle);\n const sinTheta = sin(angle);\n let rotateCenterX: number;\n let rotateCenterY: number;\n if (rotateCenter) {\n rotateCenterX = rotateCenter[0];\n rotateCenterY = rotateCenter[1];\n } else {\n rotateCenterX = x;\n rotateCenterY = y;\n }\n const offsetX = rotateCenterX - x;\n const offsetY = rotateCenterY - y;\n\n const a1 = oa * cosTheta + oc * sinTheta;\n const b1 = ob * cosTheta + od * sinTheta;\n const c1 = oc * cosTheta - oa * sinTheta;\n const d1 = od * cosTheta - ob * sinTheta;\n out.a = scaleX * a1;\n out.b = scaleX * b1;\n out.c = scaleY * c1;\n out.d = scaleY * d1;\n\n out.e = oe + oa * rotateCenterX + oc * rotateCenterY - a1 * offsetX - c1 * offsetY;\n out.f = of + ob * rotateCenterX + od * rotateCenterY - b1 * offsetX - d1 * offsetY;\n}\n"]}
|
|
@@ -4,6 +4,9 @@ import { pow, sqrt } from "../math";
|
|
|
4
4
|
|
|
5
5
|
export class Point {
|
|
6
6
|
constructor(x = 0, y = 0, x1, y1) {
|
|
7
|
+
/**
|
|
8
|
+
* 面积图的下点
|
|
9
|
+
*/
|
|
7
10
|
this.x = 0, this.y = 0, this.x = x, this.y = y, this.x1 = x1, this.y1 = y1;
|
|
8
11
|
}
|
|
9
12
|
clone() {
|
|
@@ -33,6 +36,7 @@ export class Point {
|
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
export class PointService {
|
|
39
|
+
/* distance */
|
|
36
40
|
static distancePP(p1, p2) {
|
|
37
41
|
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
|
|
38
42
|
}
|
|
@@ -42,7 +46,7 @@ export class PointService {
|
|
|
42
46
|
static distancePN(point, x, y) {
|
|
43
47
|
return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2));
|
|
44
48
|
}
|
|
45
|
-
static pointAtPP(p1, p2, t) {
|
|
49
|
+
/* point at */ static pointAtPP(p1, p2, t) {
|
|
46
50
|
return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);
|
|
47
51
|
}
|
|
48
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/point.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAqBpC,MAAM,OAAO,KAAK;IAWhB,YAAY,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,EAAW,EAAE,EAAW;
|
|
1
|
+
{"version":3,"sources":["../src/data-structure/point.ts"],"names":[],"mappings":"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","file":"point.js","sourcesContent":["import isNumber from '../common/isNumber';\nimport { pow, sqrt } from '../math';\n\nexport interface IPoint {\n x: number;\n y: number;\n x1?: number;\n y1?: number;\n defined?: boolean; // defined表示这个点是否存在\n context?: any; // context stores addition information for point\n\n clone: () => IPoint;\n copyFrom: (p: IPointLike) => IPoint;\n set: (x: number, y: number) => IPoint;\n add: (point: IPointLike | number) => IPoint;\n sub: (point: IPointLike | number) => IPoint;\n multi: (point: IPointLike | number) => IPoint;\n div: (point: IPointLike | number) => IPoint;\n}\n\nexport type IPointLike = Pick<IPoint, 'x' | 'y' | 'x1' | 'y1' | 'defined' | 'context'>;\n\nexport class Point implements IPoint {\n /**\n * 面积图的下点\n */\n x: number = 0;\n y: number = 0;\n x1?: number;\n y1?: number;\n defined?: boolean;\n context?: any;\n\n constructor(x: number = 0, y: number = 0, x1?: number, y1?: number) {\n this.x = x;\n this.y = y;\n this.x1 = x1;\n this.y1 = y1;\n }\n\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n copyFrom(p: IPointLike): this {\n this.x = p.x;\n this.y = p.y;\n this.x1 = p.x1;\n this.y1 = p.y1;\n this.defined = p.defined;\n this.context = p.context;\n return this;\n }\n\n set(x: number, y: number): this {\n this.x = x;\n this.y = y;\n return this;\n }\n\n add(point: IPointLike | number): IPoint {\n if (isNumber(point)) {\n this.x += point as number;\n this.y += point as number;\n return;\n }\n this.x += (<IPointLike>point).x;\n this.y += (<IPointLike>point).y;\n return this;\n }\n sub(point: IPointLike | number): IPoint {\n if (isNumber(point)) {\n this.x -= point as number;\n this.y -= point as number;\n return;\n }\n this.x -= (<IPointLike>point).x;\n this.y -= (<IPointLike>point).y;\n return this;\n }\n multi(point: IPointLike | number): IPoint {\n throw new Error('暂不支持');\n }\n div(point: IPointLike | number): IPoint {\n throw new Error('暂不支持');\n }\n}\n\nexport class PointService {\n /* distance */\n static distancePP(p1: IPointLike, p2: IPointLike): number {\n return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));\n }\n static distanceNN(x: number, y: number, x1: number, y1: number) {\n return sqrt(pow(x - x1, 2) + pow(y - y1, 2));\n }\n static distancePN(point: IPointLike, x: number, y: number) {\n return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2));\n }\n\n /* point at */\n static pointAtPP(p1: IPointLike, p2: IPointLike, t: number): IPoint {\n return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);\n }\n}\n\nexport interface IPolarPoint {\n r: number;\n theta: number;\n r1?: number;\n theta1?: number;\n defined?: boolean;\n context?: any;\n\n clone: () => IPolarPoint;\n copyFrom: (p: IPolarPoint) => IPolarPoint;\n set: (x: number, y: number) => IPolarPoint;\n // TODO: support if needed\n // add: (point: IPolarPoint | number) => IPolarPoint;\n // sub: (point: IPolarPoint | number) => IPolarPoint;\n // multi: (point: IPolarPoint | number) => IPolarPoint;\n // div: (point: IPolarPoint | number) => IPolarPoint;\n}\n\nexport declare type IPolarPointLike = Pick<IPolarPoint, 'r' | 'theta' | 'r1' | 'theta1' | 'defined' | 'context'>;\n\nexport class PolarPoint implements IPolarPoint {\n r: number = 0;\n theta: number = 0;\n r1?: number;\n theta1?: number;\n defined?: boolean;\n context?: any;\n\n constructor(r: number = 0, theta: number = 0, r1?: number, theta1?: number) {\n this.r = r;\n this.theta = theta;\n this.r1 = r1;\n this.theta1 = theta1;\n }\n\n clone(): PolarPoint {\n return new PolarPoint(this.r, this.theta);\n }\n\n copyFrom(p: IPolarPointLike): this {\n this.r = p.r;\n this.theta = p.theta;\n this.r1 = p.r1;\n this.theta1 = p.theta1;\n this.defined = p.defined;\n this.context = p.context;\n return this;\n }\n\n set(r: number, theta: number): this {\n this.r = r;\n this.theta = theta;\n return this;\n }\n}\n"]}
|
package/es/dom.d.ts
CHANGED
|
@@ -3,15 +3,51 @@ export declare function getContainerSize(el: HTMLElement | null, defaultWidth?:
|
|
|
3
3
|
width: number;
|
|
4
4
|
height: number;
|
|
5
5
|
};
|
|
6
|
+
/**
|
|
7
|
+
* 获取元素的绝对位置坐标(相对于页面左上角)
|
|
8
|
+
* @param element
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
6
11
|
export declare function getElementAbsolutePosition(element: HTMLElement): IPointLike;
|
|
12
|
+
/**
|
|
13
|
+
* 获取元素的相对位置坐标(相对于其他dom元素)
|
|
14
|
+
* @param element
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
7
17
|
export declare function getElementRelativePosition(element: HTMLElement, base: HTMLElement): IPointLike;
|
|
8
18
|
export declare const getScrollLeft: (element: HTMLElement) => number;
|
|
9
19
|
export declare const getScrollTop: (element: HTMLElement) => number;
|
|
10
20
|
export declare const getScaleX: (element: HTMLElement) => number;
|
|
11
21
|
export declare const getScaleY: (element: HTMLElement) => number;
|
|
22
|
+
/**
|
|
23
|
+
* 获取目标元素的缩放因数
|
|
24
|
+
* @param element 目标 dom 元素
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
12
27
|
export declare const getScale: (element: HTMLElement) => number;
|
|
28
|
+
/**
|
|
29
|
+
* 判断是否是元素的父元素
|
|
30
|
+
* @param element 从其父元素开始查找的 DOM 元素
|
|
31
|
+
* @param target 要查找的目标父元素
|
|
32
|
+
* @returns boolean, true 代表查找到,false 表示未找到
|
|
33
|
+
*/
|
|
13
34
|
export declare function hasParentElement(element: HTMLElement, target: HTMLElement): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 将style字符串转换成对象形式
|
|
37
|
+
* @param style字符串 例如:"color:red;line-height:20px;"
|
|
38
|
+
* @returns style对象,如 { color: 'red', 'line-height': '20px' }
|
|
39
|
+
*/
|
|
14
40
|
export declare const styleStringToObject: (styleStr?: string) => any;
|
|
41
|
+
/**
|
|
42
|
+
* 将小驼峰转换成中划线连接的字符串
|
|
43
|
+
* @param str 如:'lineHeight' => 'line-height'
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
15
46
|
export declare const lowerCamelCaseToMiddle: (str: string) => string;
|
|
47
|
+
/**
|
|
48
|
+
* 将中划线连接的字符串转换成驼峰字符串
|
|
49
|
+
* @param str 如:'line-height' => 'lineHeight'
|
|
50
|
+
* @returns
|
|
51
|
+
*/
|
|
16
52
|
export declare function toCamelCase(str: string): string;
|
|
17
53
|
export declare function isHTMLElement(obj: any): obj is Element;
|
package/es/dom.js
CHANGED
|
@@ -10,8 +10,13 @@ export function getContainerSize(el, defaultWidth = 0, defaultHeight = 0) {
|
|
|
10
10
|
getComputedStyle = () => ({});
|
|
11
11
|
}
|
|
12
12
|
const style = getComputedStyle(el);
|
|
13
|
-
|
|
13
|
+
// clientWidth/clientHeight: 默认整数,会向上取整,导致canvas > container
|
|
14
|
+
// getBoundingClientRect:默认小数,但是在container上有css类似 transform: scale(0.5)时,获取结果不对
|
|
15
|
+
// getComputedStyle:默认小数,获取最终结果,但是会包含padding;
|
|
16
|
+
if (/^(\d*\.?\d+)(px)$/.exec(style.width)) {
|
|
17
|
+
// 当dom元素的 display: 'none' 的时候,获取到的宽高会变成原始的样式配置,而不是计算后的像素值
|
|
14
18
|
const computedWidth = parseFloat(style.width) - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) || el.clientWidth - 1, computedHeight = parseFloat(style.height) - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom) || el.clientHeight - 1;
|
|
19
|
+
// 理论上不用向下取整,目前没加。
|
|
15
20
|
return {
|
|
16
21
|
width: computedWidth <= 0 ? defaultWidth : computedWidth,
|
|
17
22
|
height: computedHeight <= 0 ? defaultHeight : computedHeight
|
|
@@ -23,7 +28,11 @@ export function getContainerSize(el, defaultWidth = 0, defaultHeight = 0) {
|
|
|
23
28
|
};
|
|
24
29
|
}
|
|
25
30
|
|
|
26
|
-
|
|
31
|
+
/**
|
|
32
|
+
* 获取元素的绝对位置坐标(相对于页面左上角)
|
|
33
|
+
* @param element
|
|
34
|
+
* @returns
|
|
35
|
+
*/ export function getElementAbsolutePosition(element) {
|
|
27
36
|
const {x: x, y: y} = element.getBoundingClientRect();
|
|
28
37
|
return {
|
|
29
38
|
x: x,
|
|
@@ -31,7 +40,11 @@ export function getElementAbsolutePosition(element) {
|
|
|
31
40
|
};
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
|
|
43
|
+
/**
|
|
44
|
+
* 获取元素的相对位置坐标(相对于其他dom元素)
|
|
45
|
+
* @param element
|
|
46
|
+
* @returns
|
|
47
|
+
*/ export function getElementRelativePosition(element, base) {
|
|
35
48
|
const posElement = getElementAbsolutePosition(element), posBase = getElementAbsolutePosition(base);
|
|
36
49
|
return {
|
|
37
50
|
x: posElement.x - posBase.x,
|
|
@@ -53,9 +66,18 @@ export const getScaleX = element => element.getBoundingClientRect().width / elem
|
|
|
53
66
|
|
|
54
67
|
export const getScaleY = element => element.getBoundingClientRect().height / element.offsetHeight;
|
|
55
68
|
|
|
56
|
-
|
|
69
|
+
/**
|
|
70
|
+
* 获取目标元素的缩放因数
|
|
71
|
+
* @param element 目标 dom 元素
|
|
72
|
+
* @returns
|
|
73
|
+
*/ export const getScale = element => element.offsetWidth > 0 ? getScaleX(element) : getScaleY(element);
|
|
57
74
|
|
|
58
|
-
|
|
75
|
+
/**
|
|
76
|
+
* 判断是否是元素的父元素
|
|
77
|
+
* @param element 从其父元素开始查找的 DOM 元素
|
|
78
|
+
* @param target 要查找的目标父元素
|
|
79
|
+
* @returns boolean, true 代表查找到,false 表示未找到
|
|
80
|
+
*/ export function hasParentElement(element, target) {
|
|
59
81
|
let parent = element.parentNode;
|
|
60
82
|
for (;null !== parent; ) {
|
|
61
83
|
if (parent === target) return !0;
|
|
@@ -64,7 +86,11 @@ export function hasParentElement(element, target) {
|
|
|
64
86
|
return !1;
|
|
65
87
|
}
|
|
66
88
|
|
|
67
|
-
|
|
89
|
+
/**
|
|
90
|
+
* 将style字符串转换成对象形式
|
|
91
|
+
* @param style字符串 例如:"color:red;line-height:20px;"
|
|
92
|
+
* @returns style对象,如 { color: 'red', 'line-height': '20px' }
|
|
93
|
+
*/ export const styleStringToObject = (styleStr = "") => {
|
|
68
94
|
const res = {};
|
|
69
95
|
return styleStr.split(";").forEach((item => {
|
|
70
96
|
if (item) {
|
|
@@ -77,9 +103,17 @@ export const styleStringToObject = (styleStr = "") => {
|
|
|
77
103
|
})), res;
|
|
78
104
|
};
|
|
79
105
|
|
|
80
|
-
|
|
106
|
+
/**
|
|
107
|
+
* 将小驼峰转换成中划线连接的字符串
|
|
108
|
+
* @param str 如:'lineHeight' => 'line-height'
|
|
109
|
+
* @returns
|
|
110
|
+
*/ export const lowerCamelCaseToMiddle = str => str.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
81
111
|
|
|
82
|
-
|
|
112
|
+
/**
|
|
113
|
+
* 将中划线连接的字符串转换成驼峰字符串
|
|
114
|
+
* @param str 如:'line-height' => 'lineHeight'
|
|
115
|
+
* @returns
|
|
116
|
+
*/ export function toCamelCase(str) {
|
|
83
117
|
return str.replace(/-([a-z])/g, ((_, letter) => letter.toUpperCase()));
|
|
84
118
|
}
|
|
85
119
|
|
|
@@ -87,6 +121,7 @@ export function isHTMLElement(obj) {
|
|
|
87
121
|
try {
|
|
88
122
|
return obj instanceof Element;
|
|
89
123
|
} catch (_a) {
|
|
124
|
+
// 跨端 plan B
|
|
90
125
|
const htmlElementKeys = [ "children", "innerHTML", "classList", "setAttribute", "tagName", "getBoundingClientRect" ], keys = Object.keys(obj);
|
|
91
126
|
return htmlElementKeys.every((key => keys.includes(key)));
|
|
92
127
|
}
|
package/es/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,EAAsB,EAAE,eAAuB,CAAC,EAAE,gBAAwB,CAAC;IAC1G,IAAI,CAAC,EAAE,EAAE;QACP,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;KACvD;IAED,IAAI,gBAAgB,CAAC;IACrB,IAAI;QACF,gBAAgB,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC;KAC7C;IAAC,OAAO,CAAC,EAAE;QACV,gBAAgB,GAAG,GAAG,EAAE;YACtB,OAAO,EAAyB,CAAC;QACnC,CAAC,CAAC;KACH;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;
|
|
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\n/**\n * 将中划线连接的字符串转换成驼峰字符串\n * @param str 如:'line-height' => 'lineHeight'\n * @returns\n */\nexport function toCamelCase(str: string) {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\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"]}
|
package/es/fmin/blas1.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
/* Adapted from fmin by Ben Frederickson
|
|
2
|
+
* https://github.com/benfred/fmin
|
|
3
|
+
* Licensed under the BSD-3-Clause
|
|
4
|
+
|
|
5
|
+
* url: https://github.com/benfred/fmin/blob/master/src/blas1.js
|
|
6
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
7
|
+
* @license
|
|
8
|
+
*/
|
|
1
9
|
import { dotProduct } from "../math";
|
|
2
10
|
|
|
11
|
+
// need some basic operations on vectors, rather than adding a dependency,
|
|
12
|
+
// just define here
|
|
3
13
|
export function zeros(x) {
|
|
4
14
|
const r = new Array(x);
|
|
5
15
|
for (let i = 0; i < x; ++i) r[i] = 0;
|
package/es/fmin/blas1.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fmin/blas1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/fmin/blas1.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,0EAA0E;AAC1E,mBAAmB;AACnB,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;QAC1B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;KACV;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,CAAS,EAAE,CAAS;IACzC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAClB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAW;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAa,EAAE,KAAe,EAAE,CAAS;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACrC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;KACvB;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAa,EAAE,EAAU,EAAE,EAAY,EAAE,EAAU,EAAE,EAAY;IAC3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACnC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KAClC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,MAAgB,EAAE,CAAa,EAAE,CAAW;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACtC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACjC;AACH,CAAC","file":"blas1.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/blas1.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n\nimport { dotProduct } from '../math';\n\n// need some basic operations on vectors, rather than adding a dependency,\n// just define here\nexport function zeros(x: number): number[] {\n const r = new Array(x);\n for (let i = 0; i < x; ++i) {\n r[i] = 0;\n }\n return r;\n}\nexport function zerosM(x: number, y: number) {\n return zeros(x).map(function () {\n return zeros(y);\n });\n}\n\nexport function norm2(a: number[]) {\n return Math.sqrt(dotProduct(a, a));\n}\n\nexport function scale(ret: number[], value: number[], c: number) {\n for (let i = 0; i < value.length; ++i) {\n ret[i] = value[i] * c;\n }\n}\n\nexport function weightedSum(ret: number[], w1: number, v1: number[], w2: number, v2: number[]) {\n for (let j = 0; j < ret.length; ++j) {\n ret[j] = w1 * v1[j] + w2 * v2[j];\n }\n}\n\nexport function gemv(output: number[], A: number[][], x: number[]) {\n for (let i = 0; i < output.length; ++i) {\n output[i] = dotProduct(A[i], x);\n }\n}\n"]}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/* Adapted from fmin by Ben Frederickson
|
|
2
|
+
* https://github.com/benfred/fmin
|
|
3
|
+
* Licensed under the BSD-3-Clause
|
|
4
|
+
|
|
5
|
+
* url: https://github.com/benfred/fmin/blob/master/src/conjugateGradient.js
|
|
6
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
7
|
+
* @license
|
|
8
|
+
*/
|
|
1
9
|
import { dotProduct } from "../math";
|
|
2
10
|
|
|
3
11
|
import { norm2, scale, weightedSum } from "./blas1";
|
|
@@ -5,6 +13,8 @@ import { norm2, scale, weightedSum } from "./blas1";
|
|
|
5
13
|
import { wolfeLineSearch } from "./linesearch";
|
|
6
14
|
|
|
7
15
|
export function conjugateGradient(f, initial, params) {
|
|
16
|
+
// allocate all memory up front here, keep out of the loop for perfomance
|
|
17
|
+
// reasons
|
|
8
18
|
let current = {
|
|
9
19
|
x: initial.slice(),
|
|
10
20
|
fx: 0,
|
|
@@ -21,16 +31,22 @@ export function conjugateGradient(f, initial, params) {
|
|
|
21
31
|
const pk = current.fxprime.slice();
|
|
22
32
|
scale(pk, current.fxprime, -1);
|
|
23
33
|
for (let i = 0; i < maxIterations; ++i) {
|
|
24
|
-
if (a = wolfeLineSearch(f, pk, current, next, a),
|
|
34
|
+
if (a = wolfeLineSearch(f, pk, current, next, a),
|
|
35
|
+
// todo: history in wrong spot?
|
|
36
|
+
params.history && params.history.push({
|
|
25
37
|
x: current.x.slice(),
|
|
26
38
|
fx: current.fx,
|
|
27
39
|
fxprime: current.fxprime.slice(),
|
|
28
40
|
alpha: a
|
|
29
41
|
}), a) {
|
|
42
|
+
// update direction using Polak–Ribiere CG method
|
|
30
43
|
weightedSum(yk, 1, next.fxprime, -1, current.fxprime);
|
|
31
44
|
const delta_k = dotProduct(current.fxprime, current.fxprime), beta_k = Math.max(0, dotProduct(yk, next.fxprime) / delta_k);
|
|
32
45
|
weightedSum(pk, beta_k, pk, -1, next.fxprime), temp = current, current = next, next = temp;
|
|
33
|
-
} else
|
|
46
|
+
} else
|
|
47
|
+
// faiiled to find point that satifies wolfe conditions.
|
|
48
|
+
// reset direction for next iteration
|
|
49
|
+
scale(pk, current.fxprime, -1);
|
|
34
50
|
if (norm2(current.fxprime) <= 1e-5) break;
|
|
35
51
|
}
|
|
36
52
|
return params.history && params.history.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fmin/conjugate-gradient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/fmin/conjugate-gradient.ts"],"names":[],"mappings":"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","file":"conjugate-gradient.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/conjugateGradient.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n\nimport { dotProduct } from '../math';\nimport { norm2, scale, weightedSum } from './blas1';\nimport { wolfeLineSearch } from './linesearch';\n\nexport function conjugateGradient(f: any, initial: any, params: any) {\n // allocate all memory up front here, keep out of the loop for perfomance\n // reasons\n let current = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n let next = { x: initial.slice(), fx: 0, fxprime: initial.slice() };\n const yk = initial.slice();\n let temp;\n let a = 1;\n\n params = params || {};\n const maxIterations = params.maxIterations || initial.length * 20;\n\n current.fx = f(current.x, current.fxprime);\n const pk = current.fxprime.slice();\n scale(pk, current.fxprime, -1);\n\n for (let i = 0; i < maxIterations; ++i) {\n a = wolfeLineSearch(f, pk, current, next, a);\n\n // todo: history in wrong spot?\n if (params.history) {\n params.history.push({ x: current.x.slice(), fx: current.fx, fxprime: current.fxprime.slice(), alpha: a });\n }\n\n if (!a) {\n // faiiled to find point that satifies wolfe conditions.\n // reset direction for next iteration\n scale(pk, current.fxprime, -1);\n } else {\n // update direction using Polak–Ribiere CG method\n weightedSum(yk, 1, next.fxprime, -1, current.fxprime);\n\n const delta_k = dotProduct(current.fxprime, current.fxprime);\n const beta_k = Math.max(0, dotProduct(yk, next.fxprime) / delta_k);\n\n weightedSum(pk, beta_k, pk, -1, next.fxprime);\n\n temp = current;\n current = next;\n next = temp;\n }\n\n if (norm2(current.fxprime) <= 1e-5) {\n break;\n }\n }\n\n if (params.history) {\n params.history.push({ x: current.x.slice(), fx: current.fx, fxprime: current.fxprime.slice(), alpha: a });\n }\n\n return current;\n}\n"]}
|
package/es/fmin/linesearch.js
CHANGED
|
@@ -1,7 +1,22 @@
|
|
|
1
|
+
/* Adapted from fmin by Ben Frederickson
|
|
2
|
+
* https://github.com/benfred/fmin
|
|
3
|
+
* Licensed under the BSD-3-Clause
|
|
4
|
+
|
|
5
|
+
* url: https://github.com/benfred/fmin/blob/master/src/linesearch.js
|
|
6
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
7
|
+
* @license
|
|
8
|
+
*/
|
|
1
9
|
import { dotProduct } from "../math";
|
|
2
10
|
|
|
3
11
|
import { weightedSum } from "./blas1";
|
|
4
12
|
|
|
13
|
+
/// searches along line 'pk' for a point that satifies the wolfe conditions
|
|
14
|
+
/// See 'Numerical Optimization' by Nocedal and Wright p59-60
|
|
15
|
+
/// f : objective function
|
|
16
|
+
/// pk : search direction
|
|
17
|
+
/// current: object containing current gradient/loss
|
|
18
|
+
/// next: output: contains next gradient/loss
|
|
19
|
+
/// returns a: step size taken
|
|
5
20
|
export function wolfeLineSearch(f, pk, current, next, a, c1, c2) {
|
|
6
21
|
const phi0 = current.fx, phiPrime0 = dotProduct(current.fxprime, pk);
|
|
7
22
|
let phi = phi0, phi_old = phi0, phiPrime = phiPrime0, a0 = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fmin/linesearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/fmin/linesearch.ts"],"names":[],"mappings":"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","file":"linesearch.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/linesearch.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n\nimport { dotProduct } from '../math';\nimport { weightedSum } from './blas1';\n\n/// searches along line 'pk' for a point that satifies the wolfe conditions\n/// See 'Numerical Optimization' by Nocedal and Wright p59-60\n/// f : objective function\n/// pk : search direction\n/// current: object containing current gradient/loss\n/// next: output: contains next gradient/loss\n/// returns a: step size taken\nexport function wolfeLineSearch(f: any, pk: number[], current: any, next: any, a: number, c1?: number, c2?: number) {\n const phi0 = current.fx;\n const phiPrime0 = dotProduct(current.fxprime, pk);\n let phi = phi0;\n let phi_old = phi0;\n let phiPrime = phiPrime0;\n let a0 = 0;\n\n a = a || 1;\n c1 = c1 || 1e-6;\n c2 = c2 || 0.1;\n\n function zoom(a_lo: number, a_high: number, phi_lo: number) {\n for (let iteration = 0; iteration < 16; ++iteration) {\n a = (a_lo + a_high) / 2;\n weightedSum(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = dotProduct(next.fxprime, pk);\n\n if (phi > phi0 + c1 * a * phiPrime0 || phi >= phi_lo) {\n a_high = a;\n } else {\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n\n if (phiPrime * (a_high - a_lo) >= 0) {\n a_high = a_lo;\n }\n\n a_lo = a;\n phi_lo = phi;\n }\n }\n\n return 0;\n }\n\n for (let iteration = 0; iteration < 10; ++iteration) {\n weightedSum(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = dotProduct(next.fxprime, pk);\n if (phi > phi0 + c1 * a * phiPrime0 || (iteration && phi >= phi_old)) {\n return zoom(a0, a, phi_old);\n }\n\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n\n if (phiPrime >= 0) {\n return zoom(a, a0, phi);\n }\n\n phi_old = phi;\n a0 = a;\n a *= 2;\n }\n\n return a;\n}\n"]}
|
package/es/fmin/nelder-mead.d.ts
CHANGED
package/es/fmin/nelder-mead.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
/* Adapted from fmin by Ben Frederickson
|
|
2
|
+
* https://github.com/benfred/fmin
|
|
3
|
+
* Licensed under the BSD-3-Clause
|
|
4
|
+
|
|
5
|
+
* url: https://github.com/benfred/fmin/blob/master/src/nelderMead.js
|
|
6
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
7
|
+
* @license
|
|
8
|
+
*/
|
|
1
9
|
import { weightedSum } from "./blas1";
|
|
2
10
|
|
|
3
|
-
export function nelderMead(f, x0, parameters) {
|
|
11
|
+
/** minimizes a function using the downhill simplex method */ export function nelderMead(f, x0, parameters) {
|
|
4
12
|
const maxIterations = (parameters = parameters || {}).maxIterations || 200 * x0.length, nonZeroDelta = parameters.nonZeroDelta || 1.05, zeroDelta = parameters.zeroDelta || .001, minErrorDelta = parameters.minErrorDelta || 1e-6, minTolerance = parameters.minErrorDelta || 1e-5, rho = void 0 !== parameters.rho ? parameters.rho : 1, chi = void 0 !== parameters.chi ? parameters.chi : 2, psi = void 0 !== parameters.psi ? parameters.psi : -.5, sigma = void 0 !== parameters.sigma ? parameters.sigma : .5;
|
|
5
13
|
let maxDiff;
|
|
6
|
-
|
|
14
|
+
// initialize simplex.
|
|
15
|
+
const N = x0.length, simplex = new Array(N + 1);
|
|
7
16
|
simplex[0] = x0, simplex[0].fx = f(x0), simplex[0].id = 0;
|
|
8
17
|
for (let i = 0; i < N; ++i) {
|
|
9
18
|
const point = x0.slice();
|
|
@@ -19,6 +28,8 @@ export function nelderMead(f, x0, parameters) {
|
|
|
19
28
|
}, centroid = x0.slice(), reflected = x0.slice(), contracted = x0.slice(), expanded = x0.slice();
|
|
20
29
|
for (let iteration = 0; iteration < maxIterations; ++iteration) {
|
|
21
30
|
if (simplex.sort(sortOrder), parameters.history) {
|
|
31
|
+
// copy the simplex (since later iterations will mutate) and
|
|
32
|
+
// sort it to have a consistent order between iterations
|
|
22
33
|
const sortedSimplex = simplex.map((function(x) {
|
|
23
34
|
const state = x.slice();
|
|
24
35
|
return state.fx = x.fx, state.id = x.id, state;
|
|
@@ -34,22 +45,31 @@ export function nelderMead(f, x0, parameters) {
|
|
|
34
45
|
maxDiff = 0;
|
|
35
46
|
for (let i = 0; i < N; ++i) maxDiff = Math.max(maxDiff, Math.abs(simplex[0][i] - simplex[1][i]));
|
|
36
47
|
if (Math.abs(simplex[0].fx - simplex[N].fx) < minErrorDelta && maxDiff < minTolerance) break;
|
|
37
|
-
|
|
48
|
+
// compute the centroid of all but the worst point in the simplex
|
|
49
|
+
for (let i = 0; i < N; ++i) {
|
|
38
50
|
centroid[i] = 0;
|
|
39
51
|
for (let j = 0; j < N; ++j) centroid[i] += simplex[j][i];
|
|
40
52
|
centroid[i] /= N;
|
|
41
53
|
}
|
|
42
|
-
|
|
54
|
+
// reflect the worst point past the centroid and compute loss at reflected
|
|
55
|
+
// point
|
|
56
|
+
const worst = simplex[N];
|
|
57
|
+
// if the reflected point is the best seen, then possibly expand
|
|
43
58
|
if (weightedSum(reflected, 1 + rho, centroid, -rho, worst), reflected.fx = f(reflected),
|
|
44
59
|
reflected.fx < simplex[0].fx) weightedSum(expanded, 1 + chi, centroid, -chi, worst),
|
|
45
60
|
expanded.fx = f(expanded), expanded.fx < reflected.fx ? updateSimplex(expanded) : updateSimplex(reflected); else if (reflected.fx >= simplex[N - 1].fx) {
|
|
46
61
|
let shouldReduce = !1;
|
|
47
|
-
if (reflected.fx > worst.fx ? (
|
|
48
|
-
|
|
49
|
-
contracted
|
|
50
|
-
shouldReduce)
|
|
62
|
+
if (reflected.fx > worst.fx ? (
|
|
63
|
+
// do an inside contraction
|
|
64
|
+
weightedSum(contracted, 1 + psi, centroid, -psi, worst), contracted.fx = f(contracted),
|
|
65
|
+
contracted.fx < worst.fx ? updateSimplex(contracted) : shouldReduce = !0) : (
|
|
66
|
+
// do an outside contraction
|
|
67
|
+
weightedSum(contracted, 1 - psi * rho, centroid, psi * rho, worst), contracted.fx = f(contracted),
|
|
68
|
+
contracted.fx < reflected.fx ? updateSimplex(contracted) : shouldReduce = !0), shouldReduce) {
|
|
69
|
+
// if we don't contract here, we're done
|
|
51
70
|
if (sigma >= 1) break;
|
|
52
|
-
|
|
71
|
+
// do a reduction
|
|
72
|
+
for (let i = 1; i < simplex.length; ++i) weightedSum(simplex[i], 1 - sigma, simplex[0], sigma, simplex[i]),
|
|
53
73
|
simplex[i].fx = f(simplex[i]);
|
|
54
74
|
}
|
|
55
75
|
} else updateSimplex(reflected);
|