@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
|
@@ -11,9 +11,11 @@ class Matrix {
|
|
|
11
11
|
this.a = a, this.b = b, this.c = c, this.d = d, this.e = e, this.f = f;
|
|
12
12
|
}
|
|
13
13
|
equalToMatrix(m2) {
|
|
14
|
+
// ef -> ad -> bc
|
|
14
15
|
return !(this.e !== m2.e || this.f !== m2.f || this.a !== m2.a || this.d !== m2.d || this.b !== m2.b || this.c !== m2.c);
|
|
15
16
|
}
|
|
16
17
|
equalTo(a, b, c, d, e, f) {
|
|
18
|
+
// ef -> ad -> bc
|
|
17
19
|
return !(this.e !== e || this.f !== f || this.a !== a || this.d !== d || this.b !== b || this.c !== c);
|
|
18
20
|
}
|
|
19
21
|
setValue(a, b, c, d, e, f) {
|
|
@@ -22,7 +24,9 @@ class Matrix {
|
|
|
22
24
|
reset() {
|
|
23
25
|
return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this;
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
/**
|
|
28
|
+
* 获取当前矩阵的逆矩阵
|
|
29
|
+
*/ getInverse() {
|
|
26
30
|
const a = this.a, b = this.b, c = this.c, d = this.d, e = this.e, f = this.f, m = new Matrix, dt = a * d - b * c;
|
|
27
31
|
return m.a = d / dt, m.b = -b / dt, m.c = -c / dt, m.d = a / dt, m.e = (c * f - d * e) / dt,
|
|
28
32
|
m.f = -(a * f - b * e) / dt, m;
|
|
@@ -32,6 +36,17 @@ class Matrix {
|
|
|
32
36
|
return this.a = m11, this.b = m12, this.c = m21, this.d = m22, this;
|
|
33
37
|
}
|
|
34
38
|
rotateByCenter(rad, cx, cy) {
|
|
39
|
+
/** rotate matrix
|
|
40
|
+
* | cos -sin (1-cos)*cx+sin*cy |
|
|
41
|
+
* | sin cos (1-cos)*cy-sin*cx |
|
|
42
|
+
* | 0 0 1 |
|
|
43
|
+
* after multiply
|
|
44
|
+
* m13 = (1-cos)*cx+sin*cy;
|
|
45
|
+
* m23 = (1-cos)*cy-sin*cx;
|
|
46
|
+
* | cos*a-sin*b cos*c-sin*d cos*e-sin*f+m13 |
|
|
47
|
+
* | sin*a+cos*b sin*c+cos*d sin*e+cos*f+m23 |
|
|
48
|
+
* | 0 0 1 |
|
|
49
|
+
*/
|
|
35
50
|
const cos = Math.cos(rad), sin = Math.sin(rad), rotateM13 = (1 - cos) * cx + sin * cy, rotateM23 = (1 - cos) * cy - sin * cx, m11 = cos * this.a - sin * this.b, m21 = sin * this.a + cos * this.b, m12 = cos * this.c - sin * this.d, m22 = sin * this.c + cos * this.d, m13 = cos * this.e - sin * this.f + rotateM13, m23 = sin * this.e + cos * this.f + rotateM23;
|
|
36
51
|
return this.a = m11, this.b = m21, this.c = m12, this.d = m22, this.e = m13, this.f = m23,
|
|
37
52
|
this;
|
|
@@ -50,24 +65,45 @@ class Matrix {
|
|
|
50
65
|
return this.e += this.a * x + this.c * y, this.f += this.b * x + this.d * y, this;
|
|
51
66
|
}
|
|
52
67
|
transpose() {
|
|
68
|
+
/** transpose matrix
|
|
69
|
+
* | 0 1 0 |
|
|
70
|
+
* | 1 0 0 |
|
|
71
|
+
* | 0 0 1 |
|
|
72
|
+
* after multiply
|
|
73
|
+
* | b d f |
|
|
74
|
+
* | a c e |
|
|
75
|
+
* | 0 0 1 |
|
|
76
|
+
*/
|
|
53
77
|
const {a: a, b: b, c: c, d: d, e: e, f: f} = this;
|
|
54
78
|
return this.a = b, this.b = a, this.c = d, this.d = c, this.e = f, this.f = e, this;
|
|
55
79
|
}
|
|
56
|
-
|
|
80
|
+
/**
|
|
81
|
+
* 矩阵相乘
|
|
82
|
+
* @param matrix
|
|
83
|
+
*/ multiply(a2, b2, c2, d2, e2, f2) {
|
|
57
84
|
const a1 = this.a, b1 = this.b, c1 = this.c, d1 = this.d, m11 = a1 * a2 + c1 * b2, m12 = b1 * a2 + d1 * b2, m21 = a1 * c2 + c1 * d2, m22 = b1 * c2 + d1 * d2, dx = a1 * e2 + c1 * f2 + this.e, dy = b1 * e2 + d1 * f2 + this.f;
|
|
58
85
|
return this.a = m11, this.b = m12, this.c = m21, this.d = m22, this.e = dx, this.f = dy,
|
|
59
86
|
this;
|
|
60
87
|
}
|
|
61
|
-
|
|
88
|
+
/**
|
|
89
|
+
* 插值计算
|
|
90
|
+
* @param m2
|
|
91
|
+
* @param t
|
|
92
|
+
*/ interpolate(m2, t) {
|
|
62
93
|
const m = new Matrix;
|
|
63
94
|
return m.a = this.a + (m2.a - this.a) * t, m.b = this.b + (m2.b - this.b) * t, m.c = this.c + (m2.c - this.c) * t,
|
|
64
95
|
m.d = this.d + (m2.d - this.d) * t, m.e = this.e + (m2.e - this.e) * t, m.f = this.f + (m2.f - this.f) * t,
|
|
65
96
|
m;
|
|
66
97
|
}
|
|
67
|
-
|
|
98
|
+
/**
|
|
99
|
+
* 将point转到当前矩阵的坐标空间中
|
|
100
|
+
* @param source
|
|
101
|
+
* @param target
|
|
102
|
+
*/ transformPoint(source, target) {
|
|
68
103
|
const {a: a, b: b, c: c, d: d, e: e, f: f} = this, dt = a * d - b * c, nextA = d / dt, nextB = -b / dt, nextC = -c / dt, nextD = a / dt, nextE = (c * f - d * e) / dt, nextF = -(a * f - b * e) / dt, {x: x, y: y} = source;
|
|
69
104
|
target.x = x * nextA + y * nextC + nextE, target.y = x * nextB + y * nextD + nextF;
|
|
70
105
|
}
|
|
106
|
+
// 只有translate
|
|
71
107
|
onlyTranslate(scale = 1) {
|
|
72
108
|
return this.a === scale && 0 === this.b && 0 === this.c && this.d === scale;
|
|
73
109
|
}
|
|
@@ -84,6 +120,7 @@ class Matrix {
|
|
|
84
120
|
skewX: 0,
|
|
85
121
|
skewY: 0
|
|
86
122
|
};
|
|
123
|
+
// Apply the QR-like decomposition.
|
|
87
124
|
if (0 !== a || 0 !== b) {
|
|
88
125
|
const r = Math.sqrt(a * a + b * b);
|
|
89
126
|
result.rotateDeg = b > 0 ? Math.acos(a / r) : -Math.acos(a / r), result.scaleX = r,
|
|
@@ -97,6 +134,17 @@ class Matrix {
|
|
|
97
134
|
}
|
|
98
135
|
}
|
|
99
136
|
|
|
137
|
+
/**
|
|
138
|
+
* 对matrix进行通常的变换(基于rotateCenter进行旋转的同时进行translate和scale)
|
|
139
|
+
* @param out
|
|
140
|
+
* @param origin
|
|
141
|
+
* @param x
|
|
142
|
+
* @param y
|
|
143
|
+
* @param scaleX
|
|
144
|
+
* @param scaleY
|
|
145
|
+
* @param angle
|
|
146
|
+
* @param rotateCenter
|
|
147
|
+
*/
|
|
100
148
|
function normalTransform(out, origin, x, y, scaleX, scaleY, angle, rotateCenter) {
|
|
101
149
|
const oa = origin.a, ob = origin.b, oc = origin.c, od = origin.d, oe = origin.e, of = origin.f, cosTheta = (0,
|
|
102
150
|
math_1.cos)(angle), sinTheta = (0, math_1.sin)(angle);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/matrix.ts"],"names":[],"mappings":";;;AAAA,oCAA0C;AAE1C,kCAAmC;AAqGnC,MAAa,MAAM;IA0BjB,YAAY,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,IAAY,CAAC;QAClG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,aAAa,CAAC,EAAe;QAE3B,OAAO,CAAC,CACN,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QAEtE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACvE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,UAAU;QACR,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAE5B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,GAAW,EAAE,EAAU,EAAE,EAAU;QAYhD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QACpD,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QACpD,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,EAAU;QAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,EAAU,EAAE,EAAU;QAC7B,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QACxE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,CAAS,EAAE,CAAS;QAC5B,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS;QAUP,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,QAAQ,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;QAC7E,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAElB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,WAAW,CAAC,EAAU,EAAE,CAAS;QAC/B,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;QAEvB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEnC,OAAO,CAAC,CAAC;IACX,CAAC;IAOD,cAAc,CAAC,MAAkB,EAAE,MAAkB;QACnD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;QACxB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;QACzC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3C,CAAC;IAGD,aAAa,CAAC,QAAgB,CAAC;QAC7B,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;IAC9E,CAAC;IAED,KAAK;QACH,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,gBAAgB;QACd,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAEjB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;SACT,CAAC;QAGF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACtB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YACvC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;SAClB;aAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YACjB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;SACxC;aAAM;SAEN;QAED,MAAM,CAAC,SAAS,GAAG,IAAA,sBAAc,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAjTD,wBAiTC;AAaD,SAAgB,eAAe,CAC7B,GAAW,EACX,MAAc,EACd,CAAS,EACT,CAAS,EACT,MAAc,EACd,MAAc,EACd,KAAa,EACb,YAAmB;IAEnB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAA,UAAG,EAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAA,UAAG,EAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,aAAqB,CAAC;IAC1B,IAAI,aAAqB,CAAC;IAC1B,IAAI,YAAY,EAAE;QAChB,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;KACjC;SAAM;QACL,aAAa,GAAG,CAAC,CAAC;QAClB,aAAa,GAAG,CAAC,CAAC;KACnB;IACD,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC;IAElC,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC;IACzC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;IACpB,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;IACpB,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;IACpB,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;IAEpB,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC;IACnF,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC;AACrF,CAAC;AAzCD,0CAyCC","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"]}
|
|
@@ -14,6 +14,9 @@ const isNumber_1 = __importDefault(require("../common/isNumber")), math_1 = requ
|
|
|
14
14
|
|
|
15
15
|
class Point {
|
|
16
16
|
constructor(x = 0, y = 0, x1, y1) {
|
|
17
|
+
/**
|
|
18
|
+
* 面积图的下点
|
|
19
|
+
*/
|
|
17
20
|
this.x = 0, this.y = 0, this.x = x, this.y = y, this.x1 = x1, this.y1 = y1;
|
|
18
21
|
}
|
|
19
22
|
clone() {
|
|
@@ -45,6 +48,7 @@ class Point {
|
|
|
45
48
|
exports.Point = Point;
|
|
46
49
|
|
|
47
50
|
class PointService {
|
|
51
|
+
/* distance */
|
|
48
52
|
static distancePP(p1, p2) {
|
|
49
53
|
return (0, math_1.sqrt)((0, math_1.pow)(p1.x - p2.x, 2) + (0, math_1.pow)(p1.y - p2.y, 2));
|
|
50
54
|
}
|
|
@@ -54,7 +58,7 @@ class PointService {
|
|
|
54
58
|
static distancePN(point, x, y) {
|
|
55
59
|
return (0, math_1.sqrt)((0, math_1.pow)(x - point.x, 2) + (0, math_1.pow)(y - point.y, 2));
|
|
56
60
|
}
|
|
57
|
-
static pointAtPP(p1, p2, t) {
|
|
61
|
+
/* point at */ static pointAtPP(p1, p2, t) {
|
|
58
62
|
return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);
|
|
59
63
|
}
|
|
60
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/point.ts"],"names":[],"mappings":";;;;;;AAAA,kEAA0C;AAC1C,kCAAoC;AAqBpC,MAAa,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/cjs/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/cjs/dom.js
CHANGED
|
@@ -12,8 +12,13 @@ function getContainerSize(el, defaultWidth = 0, defaultHeight = 0) {
|
|
|
12
12
|
getComputedStyle = () => ({});
|
|
13
13
|
}
|
|
14
14
|
const style = getComputedStyle(el);
|
|
15
|
-
|
|
15
|
+
// clientWidth/clientHeight: 默认整数,会向上取整,导致canvas > container
|
|
16
|
+
// getBoundingClientRect:默认小数,但是在container上有css类似 transform: scale(0.5)时,获取结果不对
|
|
17
|
+
// getComputedStyle:默认小数,获取最终结果,但是会包含padding;
|
|
18
|
+
if (/^(\d*\.?\d+)(px)$/.exec(style.width)) {
|
|
19
|
+
// 当dom元素的 display: 'none' 的时候,获取到的宽高会变成原始的样式配置,而不是计算后的像素值
|
|
16
20
|
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;
|
|
21
|
+
// 理论上不用向下取整,目前没加。
|
|
17
22
|
return {
|
|
18
23
|
width: computedWidth <= 0 ? defaultWidth : computedWidth,
|
|
19
24
|
height: computedHeight <= 0 ? defaultHeight : computedHeight
|
|
@@ -25,6 +30,11 @@ function getContainerSize(el, defaultWidth = 0, defaultHeight = 0) {
|
|
|
25
30
|
};
|
|
26
31
|
}
|
|
27
32
|
|
|
33
|
+
/**
|
|
34
|
+
* 获取元素的绝对位置坐标(相对于页面左上角)
|
|
35
|
+
* @param element
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
28
38
|
function getElementAbsolutePosition(element) {
|
|
29
39
|
const {x: x, y: y} = element.getBoundingClientRect();
|
|
30
40
|
return {
|
|
@@ -33,6 +43,11 @@ function getElementAbsolutePosition(element) {
|
|
|
33
43
|
};
|
|
34
44
|
}
|
|
35
45
|
|
|
46
|
+
/**
|
|
47
|
+
* 获取元素的相对位置坐标(相对于其他dom元素)
|
|
48
|
+
* @param element
|
|
49
|
+
* @returns
|
|
50
|
+
*/
|
|
36
51
|
function getElementRelativePosition(element, base) {
|
|
37
52
|
const posElement = getElementAbsolutePosition(element), posBase = getElementAbsolutePosition(base);
|
|
38
53
|
return {
|
|
@@ -69,9 +84,20 @@ const getScaleY = element => element.getBoundingClientRect().height / element.of
|
|
|
69
84
|
|
|
70
85
|
exports.getScaleY = getScaleY;
|
|
71
86
|
|
|
87
|
+
/**
|
|
88
|
+
* 获取目标元素的缩放因数
|
|
89
|
+
* @param element 目标 dom 元素
|
|
90
|
+
* @returns
|
|
91
|
+
*/
|
|
72
92
|
const getScale = element => element.offsetWidth > 0 ? (0, exports.getScaleX)(element) : (0,
|
|
73
93
|
exports.getScaleY)(element);
|
|
74
94
|
|
|
95
|
+
/**
|
|
96
|
+
* 判断是否是元素的父元素
|
|
97
|
+
* @param element 从其父元素开始查找的 DOM 元素
|
|
98
|
+
* @param target 要查找的目标父元素
|
|
99
|
+
* @returns boolean, true 代表查找到,false 表示未找到
|
|
100
|
+
*/
|
|
75
101
|
function hasParentElement(element, target) {
|
|
76
102
|
let parent = element.parentNode;
|
|
77
103
|
for (;null !== parent; ) {
|
|
@@ -83,6 +109,11 @@ function hasParentElement(element, target) {
|
|
|
83
109
|
|
|
84
110
|
exports.getScale = getScale, exports.hasParentElement = hasParentElement;
|
|
85
111
|
|
|
112
|
+
/**
|
|
113
|
+
* 将style字符串转换成对象形式
|
|
114
|
+
* @param style字符串 例如:"color:red;line-height:20px;"
|
|
115
|
+
* @returns style对象,如 { color: 'red', 'line-height': '20px' }
|
|
116
|
+
*/
|
|
86
117
|
const styleStringToObject = (styleStr = "") => {
|
|
87
118
|
const res = {};
|
|
88
119
|
return styleStr.split(";").forEach((item => {
|
|
@@ -98,8 +129,18 @@ const styleStringToObject = (styleStr = "") => {
|
|
|
98
129
|
|
|
99
130
|
exports.styleStringToObject = styleStringToObject;
|
|
100
131
|
|
|
132
|
+
/**
|
|
133
|
+
* 将小驼峰转换成中划线连接的字符串
|
|
134
|
+
* @param str 如:'lineHeight' => 'line-height'
|
|
135
|
+
* @returns
|
|
136
|
+
*/
|
|
101
137
|
const lowerCamelCaseToMiddle = str => str.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
102
138
|
|
|
139
|
+
/**
|
|
140
|
+
* 将中划线连接的字符串转换成驼峰字符串
|
|
141
|
+
* @param str 如:'line-height' => 'lineHeight'
|
|
142
|
+
* @returns
|
|
143
|
+
*/
|
|
103
144
|
function toCamelCase(str) {
|
|
104
145
|
return str.replace(/-([a-z])/g, ((_, letter) => letter.toUpperCase()));
|
|
105
146
|
}
|
|
@@ -108,6 +149,7 @@ function isHTMLElement(obj) {
|
|
|
108
149
|
try {
|
|
109
150
|
return obj instanceof Element;
|
|
110
151
|
} catch (_a) {
|
|
152
|
+
// 跨端 plan B
|
|
111
153
|
const htmlElementKeys = [ "children", "innerHTML", "classList", "setAttribute", "tagName", "getBoundingClientRect" ], keys = Object.keys(obj);
|
|
112
154
|
return htmlElementKeys.every((key => keys.includes(key)));
|
|
113
155
|
}
|
package/cjs/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom.ts"],"names":[],"mappings":";;;AAEA,SAAgB,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/cjs/fmin/blas1.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/* Adapted from fmin by Ben Frederickson
|
|
4
|
+
* https://github.com/benfred/fmin
|
|
5
|
+
* Licensed under the BSD-3-Clause
|
|
6
|
+
|
|
7
|
+
* url: https://github.com/benfred/fmin/blob/master/src/blas1.js
|
|
8
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
9
|
+
* @license
|
|
10
|
+
*/ Object.defineProperty(exports, "__esModule", {
|
|
4
11
|
value: !0
|
|
5
12
|
}), exports.gemv = exports.weightedSum = exports.scale = exports.norm2 = exports.zerosM = exports.zeros = void 0;
|
|
6
13
|
|
|
7
14
|
const math_1 = require("../math");
|
|
8
15
|
|
|
16
|
+
// need some basic operations on vectors, rather than adding a dependency,
|
|
17
|
+
// just define here
|
|
9
18
|
function zeros(x) {
|
|
10
19
|
const r = new Array(x);
|
|
11
20
|
for (let i = 0; i < x; ++i) r[i] = 0;
|
package/cjs/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,kCAAqC;AAErC,0EAA0E;AAC1E,mBAAmB;AACnB,SAAgB,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;AAND,sBAMC;AACD,SAAgB,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;AAJD,wBAIC;AAED,SAAgB,KAAK,CAAC,CAAW;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,iBAAU,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAFD,sBAEC;AAED,SAAgB,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;AAJD,sBAIC;AAED,SAAgB,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;AAJD,kCAIC;AAED,SAAgB,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,IAAA,iBAAU,EAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACjC;AACH,CAAC;AAJD,oBAIC","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,12 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/* Adapted from fmin by Ben Frederickson
|
|
4
|
+
* https://github.com/benfred/fmin
|
|
5
|
+
* Licensed under the BSD-3-Clause
|
|
6
|
+
|
|
7
|
+
* url: https://github.com/benfred/fmin/blob/master/src/conjugateGradient.js
|
|
8
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
9
|
+
* @license
|
|
10
|
+
*/ Object.defineProperty(exports, "__esModule", {
|
|
4
11
|
value: !0
|
|
5
12
|
}), exports.conjugateGradient = void 0;
|
|
6
13
|
|
|
7
14
|
const math_1 = require("../math"), blas1_1 = require("./blas1"), linesearch_1 = require("./linesearch");
|
|
8
15
|
|
|
9
16
|
function conjugateGradient(f, initial, params) {
|
|
17
|
+
// allocate all memory up front here, keep out of the loop for perfomance
|
|
18
|
+
// reasons
|
|
10
19
|
let current = {
|
|
11
20
|
x: initial.slice(),
|
|
12
21
|
fx: 0,
|
|
@@ -23,18 +32,24 @@ function conjugateGradient(f, initial, params) {
|
|
|
23
32
|
const pk = current.fxprime.slice();
|
|
24
33
|
(0, blas1_1.scale)(pk, current.fxprime, -1);
|
|
25
34
|
for (let i = 0; i < maxIterations; ++i) {
|
|
26
|
-
if (a = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, a),
|
|
35
|
+
if (a = (0, linesearch_1.wolfeLineSearch)(f, pk, current, next, a),
|
|
36
|
+
// todo: history in wrong spot?
|
|
37
|
+
params.history && params.history.push({
|
|
27
38
|
x: current.x.slice(),
|
|
28
39
|
fx: current.fx,
|
|
29
40
|
fxprime: current.fxprime.slice(),
|
|
30
41
|
alpha: a
|
|
31
42
|
}), a) {
|
|
43
|
+
// update direction using Polak–Ribiere CG method
|
|
32
44
|
(0, blas1_1.weightedSum)(yk, 1, next.fxprime, -1, current.fxprime);
|
|
33
45
|
const delta_k = (0, math_1.dotProduct)(current.fxprime, current.fxprime), beta_k = Math.max(0, (0,
|
|
34
46
|
math_1.dotProduct)(yk, next.fxprime) / delta_k);
|
|
35
47
|
(0, blas1_1.weightedSum)(pk, beta_k, pk, -1, next.fxprime), temp = current, current = next,
|
|
36
48
|
next = temp;
|
|
37
|
-
} else
|
|
49
|
+
} else
|
|
50
|
+
// faiiled to find point that satifies wolfe conditions.
|
|
51
|
+
// reset direction for next iteration
|
|
52
|
+
(0, blas1_1.scale)(pk, current.fxprime, -1);
|
|
38
53
|
if ((0, blas1_1.norm2)(current.fxprime) <= 1e-5) break;
|
|
39
54
|
}
|
|
40
55
|
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"]}
|