@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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 回归共用的稳定坐标与小型最小二乘求解器;不构造 XᵀX。 */
|
|
2
|
+
export interface RegressionPoint {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
export interface RegressionBasis {
|
|
7
|
+
xCenter: number;
|
|
8
|
+
xScale: number;
|
|
9
|
+
yCenter: number;
|
|
10
|
+
yScale: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function regressionPoints(data: readonly any[], x: (d: any) => number, y: (d: any) => number): RegressionPoint[];
|
|
13
|
+
export declare function normalizeRegression(value: number, center: number, scale: number): number;
|
|
14
|
+
export declare function regressionBasis(points: readonly RegressionPoint[]): RegressionBasis;
|
|
15
|
+
export declare function fitRegression(points: readonly RegressionPoint[], degree: number, basis?: RegressionBasis): {
|
|
16
|
+
coef: number[];
|
|
17
|
+
rank: number;
|
|
18
|
+
basis: RegressionBasis;
|
|
19
|
+
};
|
|
20
|
+
export declare function regressionPrediction(model: ReturnType<typeof fitRegression>, x: number): number;
|
|
21
|
+
/** 保留公开的升幂 coef;预测始终使用稳定基底。 */
|
|
22
|
+
export declare function regressionCoefficients(model: ReturnType<typeof fitRegression>): number[];
|
|
23
|
+
export declare function regressionGrid(min: number, max: number, count: number, predict: (x: number) => number): {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
}[];
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
export function regressionPoints(data, x, y) {
|
|
2
|
+
const points = [];
|
|
3
|
+
return data.forEach((d => {
|
|
4
|
+
const a = x(d), b = y(d);
|
|
5
|
+
// 保留既有 accessor 对缺失观测的排除行为;无穷大不是可拟合观测。
|
|
6
|
+
null != a && null != b && Number.isFinite(+a) && Number.isFinite(+b) && points.push({
|
|
7
|
+
x: +a,
|
|
8
|
+
y: +b
|
|
9
|
+
});
|
|
10
|
+
})), points;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function normalizeRegression(value, center, scale) {
|
|
14
|
+
const delta = value - center;
|
|
15
|
+
return Number.isFinite(delta) ? delta / scale : value / scale - center / scale;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function regressionBasis(points) {
|
|
19
|
+
let xMin = 1 / 0, xMax = -1 / 0, yMin = 1 / 0, yMax = -1 / 0;
|
|
20
|
+
for (const p of points) xMin = Math.min(xMin, p.x), xMax = Math.max(xMax, p.x),
|
|
21
|
+
yMin = Math.min(yMin, p.y), yMax = Math.max(yMax, p.y);
|
|
22
|
+
if (!points.length) return {
|
|
23
|
+
xCenter: 0,
|
|
24
|
+
xScale: 1,
|
|
25
|
+
yCenter: 0,
|
|
26
|
+
yScale: 1
|
|
27
|
+
};
|
|
28
|
+
const xCenter = xMin / 2 + xMax / 2, yCenter = yMin / 2 + yMax / 2;
|
|
29
|
+
return {
|
|
30
|
+
xCenter: xCenter,
|
|
31
|
+
yCenter: yCenter,
|
|
32
|
+
xScale: Math.max(Math.abs(xMin - xCenter), Math.abs(xMax - xCenter)) || 1,
|
|
33
|
+
yScale: Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** 秩不足时对 QR 的小型 R 做单边 Jacobi SVD,获得明确的最小范数解。 */ function minimumNorm(r, rhs) {
|
|
38
|
+
const p = rhs.length, a = r.map((row => row.slice())), v = Array.from({
|
|
39
|
+
length: p
|
|
40
|
+
}, ((_, i) => Array.from({
|
|
41
|
+
length: p
|
|
42
|
+
}, ((_, j) => +(i === j)))));
|
|
43
|
+
for (let sweep = 0; sweep < 50; sweep++) {
|
|
44
|
+
let changed = !1;
|
|
45
|
+
for (let j = 0; j < p - 1; j++) for (let k = j + 1; k < p; k++) {
|
|
46
|
+
let aa = 0, bb = 0, ab = 0;
|
|
47
|
+
for (let i = 0; i < p; i++) aa += a[i][j] ** 2, bb += a[i][k] ** 2, ab += a[i][j] * a[i][k];
|
|
48
|
+
if (Math.abs(ab) <= 8 * Number.EPSILON * Math.sqrt(aa * bb)) continue;
|
|
49
|
+
changed = !0;
|
|
50
|
+
const tau = (bb - aa) / (2 * ab), t = (tau >= 0 ? 1 : -1) / (Math.abs(tau) + Math.hypot(1, tau)), c = 1 / Math.hypot(1, t), s = c * t;
|
|
51
|
+
for (let i = 0; i < p; i++) {
|
|
52
|
+
const aj = a[i][j], ak = a[i][k], vj = v[i][j], vk = v[i][k];
|
|
53
|
+
a[i][j] = c * aj - s * ak, a[i][k] = s * aj + c * ak, v[i][j] = c * vj - s * vk,
|
|
54
|
+
v[i][k] = s * vj + c * vk;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (!changed) break;
|
|
58
|
+
}
|
|
59
|
+
const norms = Array.from({
|
|
60
|
+
length: p
|
|
61
|
+
}, ((_, j) => Math.hypot(...a.map((row => row[j]))))), tolerance = Math.max(...norms) * Number.EPSILON * p * 64, coef = new Array(p).fill(0);
|
|
62
|
+
let rank = 0;
|
|
63
|
+
for (let j = 0; j < p; j++) {
|
|
64
|
+
if (norms[j] <= tolerance) continue;
|
|
65
|
+
rank++;
|
|
66
|
+
let projection = 0;
|
|
67
|
+
for (let i = 0; i < p; i++) projection += a[i][j] * rhs[i];
|
|
68
|
+
projection /= norms[j] ** 2;
|
|
69
|
+
for (let i = 0; i < p; i++) coef[i] += v[i][j] * projection;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
coef: coef,
|
|
73
|
+
rank: rank
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function fitRegression(points, degree, basis = regressionBasis(points)) {
|
|
78
|
+
const p = degree + 1;
|
|
79
|
+
if (1 === degree) {
|
|
80
|
+
let mx = 0, my = 0, n = 0;
|
|
81
|
+
for (const row of points) n++, mx += (normalizeRegression(row.x, basis.xCenter, basis.xScale) - mx) / n,
|
|
82
|
+
my += (normalizeRegression(row.y, basis.yCenter, basis.yScale) - my) / n;
|
|
83
|
+
let sxx = 0, sxy = 0;
|
|
84
|
+
for (const row of points) {
|
|
85
|
+
const dx = normalizeRegression(row.x, basis.xCenter, basis.xScale) - mx;
|
|
86
|
+
sxx += dx * dx, sxy += dx * (normalizeRegression(row.y, basis.yCenter, basis.yScale) - my);
|
|
87
|
+
}
|
|
88
|
+
const b = 0 === sxx ? 0 : sxy / sxx;
|
|
89
|
+
return {
|
|
90
|
+
coef: 0 === sxx ? [ my / (1 + mx * mx), mx * my / (1 + mx * mx) ] : [ my - b * mx, b ],
|
|
91
|
+
rank: 0 === n ? 0 : 0 === sxx ? 1 : 2,
|
|
92
|
+
basis: basis
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const r = Array.from({
|
|
96
|
+
length: p
|
|
97
|
+
}, (() => new Array(p).fill(0))), rhs = new Array(p).fill(0), row = new Array(p);
|
|
98
|
+
for (const point of points) {
|
|
99
|
+
const z = normalizeRegression(point.x, basis.xCenter, basis.xScale);
|
|
100
|
+
row[0] = 1;
|
|
101
|
+
for (let j = 1; j < p; j++) row[j] = row[j - 1] * z;
|
|
102
|
+
let value = normalizeRegression(point.y, basis.yCenter, basis.yScale);
|
|
103
|
+
// 增量 Givens QR 仅保留 p×p 的 R,bootstrap 不分配 N×p 矩阵。
|
|
104
|
+
for (let j = 0; j < p; j++) {
|
|
105
|
+
const norm = Math.hypot(r[j][j], row[j]);
|
|
106
|
+
if (0 === norm) continue;
|
|
107
|
+
const c = r[j][j] / norm, s = row[j] / norm;
|
|
108
|
+
r[j][j] = norm;
|
|
109
|
+
for (let k = j + 1; k < p; k++) {
|
|
110
|
+
const previous = r[j][k];
|
|
111
|
+
r[j][k] = c * previous + s * row[k], row[k] = -s * previous + c * row[k];
|
|
112
|
+
}
|
|
113
|
+
const previous = rhs[j];
|
|
114
|
+
rhs[j] = c * previous + s * value, value = -s * previous + c * value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const tolerance = Math.max(...r.map(((row, i) => Math.abs(row[i])))) * Number.EPSILON * p * 64;
|
|
118
|
+
if (r.some(((row, i) => Math.abs(row[i]) <= tolerance))) return Object.assign(Object.assign({}, minimumNorm(r, rhs)), {
|
|
119
|
+
basis: basis
|
|
120
|
+
});
|
|
121
|
+
const coef = new Array(p);
|
|
122
|
+
for (let i = p - 1; i >= 0; i--) {
|
|
123
|
+
let value = rhs[i];
|
|
124
|
+
for (let j = i + 1; j < p; j++) value -= r[i][j] * coef[j];
|
|
125
|
+
coef[i] = value / r[i][i];
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
coef: coef,
|
|
129
|
+
rank: p,
|
|
130
|
+
basis: basis
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function regressionPrediction(model, x) {
|
|
135
|
+
const z = normalizeRegression(x, model.basis.xCenter, model.basis.xScale);
|
|
136
|
+
let value = 0;
|
|
137
|
+
for (let j = model.coef.length - 1; j >= 0; j--) value = value * z + model.coef[j];
|
|
138
|
+
return model.basis.yCenter + model.basis.yScale * value;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** 保留公开的升幂 coef;预测始终使用稳定基底。 */ export function regressionCoefficients(model) {
|
|
142
|
+
let coef = [ model.coef[model.coef.length - 1] ];
|
|
143
|
+
const a = -model.basis.xCenter / model.basis.xScale, b = 1 / model.basis.xScale;
|
|
144
|
+
for (let j = model.coef.length - 2; j >= 0; j--) {
|
|
145
|
+
const next = new Array(coef.length + 1).fill(0);
|
|
146
|
+
coef.forEach(((c, i) => {
|
|
147
|
+
next[i] += a * c, next[i + 1] += b * c;
|
|
148
|
+
})), next[0] += model.coef[j], coef = next;
|
|
149
|
+
}
|
|
150
|
+
if (coef = coef.map((c => c * model.basis.yScale)), coef[0] += model.basis.yCenter,
|
|
151
|
+
coef.some((c => !Number.isFinite(c)))) throw new RangeError("Regression coefficients are not finite");
|
|
152
|
+
return coef;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function regressionGrid(min, max, count, predict) {
|
|
156
|
+
if (!Number.isInteger(count) || count <= 0 || !Number.isFinite(min) || !Number.isFinite(max)) return [];
|
|
157
|
+
const width = max - min, step = 1 === count ? 0 : width / (count - 1);
|
|
158
|
+
return Array.from({
|
|
159
|
+
length: count
|
|
160
|
+
}, ((_, i) => {
|
|
161
|
+
const t = 1 === count ? 0 : i / (count - 1), x = 0 === i ? min : i === count - 1 ? max : Number.isFinite(width) ? min + i * step : (1 - t) * min + t * max;
|
|
162
|
+
return {
|
|
163
|
+
x: x,
|
|
164
|
+
y: predict(x)
|
|
165
|
+
};
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=regression-solver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/regression-solver.ts"],"names":[],"mappings":"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","file":"regression-solver.js","sourcesContent":["/** 回归共用的稳定坐标与小型最小二乘求解器;不构造 XᵀX。 */\nexport interface RegressionPoint {\n x: number;\n y: number;\n}\nexport interface RegressionBasis {\n xCenter: number;\n xScale: number;\n yCenter: number;\n yScale: number;\n}\n\nexport function regressionPoints(data: readonly any[], x: (d: any) => number, y: (d: any) => number) {\n const points: RegressionPoint[] = [];\n data.forEach(d => {\n const a = x(d);\n const b = y(d);\n // 保留既有 accessor 对缺失观测的排除行为;无穷大不是可拟合观测。\n if (a != null && b != null && Number.isFinite(+a) && Number.isFinite(+b)) {\n points.push({ x: +a, y: +b });\n }\n });\n return points;\n}\n\nexport function normalizeRegression(value: number, center: number, scale: number) {\n const delta = value - center;\n return Number.isFinite(delta) ? delta / scale : value / scale - center / scale;\n}\n\nexport function regressionBasis(points: readonly RegressionPoint[]): RegressionBasis {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n for (const p of points) {\n xMin = Math.min(xMin, p.x);\n xMax = Math.max(xMax, p.x);\n yMin = Math.min(yMin, p.y);\n yMax = Math.max(yMax, p.y);\n }\n if (!points.length) {\n return { xCenter: 0, xScale: 1, yCenter: 0, yScale: 1 };\n }\n const xCenter = xMin / 2 + xMax / 2;\n const yCenter = yMin / 2 + yMax / 2;\n return {\n xCenter,\n yCenter,\n xScale: Math.max(Math.abs(xMin - xCenter), Math.abs(xMax - xCenter)) || 1,\n yScale: Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1\n };\n}\n\n/** 秩不足时对 QR 的小型 R 做单边 Jacobi SVD,获得明确的最小范数解。 */\nfunction minimumNorm(r: number[][], rhs: number[]) {\n const p = rhs.length;\n const a = r.map(row => row.slice());\n const v = Array.from({ length: p }, (_, i) => Array.from({ length: p }, (_, j) => +(i === j)));\n for (let sweep = 0; sweep < 50; sweep++) {\n let changed = false;\n for (let j = 0; j < p - 1; j++) {\n for (let k = j + 1; k < p; k++) {\n let aa = 0;\n let bb = 0;\n let ab = 0;\n for (let i = 0; i < p; i++) {\n aa += a[i][j] ** 2;\n bb += a[i][k] ** 2;\n ab += a[i][j] * a[i][k];\n }\n if (Math.abs(ab) <= Number.EPSILON * 8 * Math.sqrt(aa * bb)) {\n continue;\n }\n changed = true;\n const tau = (bb - aa) / (2 * ab);\n const t = (tau >= 0 ? 1 : -1) / (Math.abs(tau) + Math.hypot(1, tau));\n const c = 1 / Math.hypot(1, t);\n const s = c * t;\n for (let i = 0; i < p; i++) {\n const aj = a[i][j];\n const ak = a[i][k];\n const vj = v[i][j];\n const vk = v[i][k];\n a[i][j] = c * aj - s * ak;\n a[i][k] = s * aj + c * ak;\n v[i][j] = c * vj - s * vk;\n v[i][k] = s * vj + c * vk;\n }\n }\n }\n if (!changed) {\n break;\n }\n }\n const norms = Array.from({ length: p }, (_, j) => Math.hypot(...a.map(row => row[j])));\n const tolerance = Math.max(...norms) * Number.EPSILON * p * 64;\n const coef = new Array<number>(p).fill(0);\n let rank = 0;\n for (let j = 0; j < p; j++) {\n if (norms[j] <= tolerance) {\n continue;\n }\n rank++;\n let projection = 0;\n for (let i = 0; i < p; i++) {\n projection += a[i][j] * rhs[i];\n }\n projection /= norms[j] ** 2;\n for (let i = 0; i < p; i++) {\n coef[i] += v[i][j] * projection;\n }\n }\n return { coef, rank };\n}\n\nexport function fitRegression(points: readonly RegressionPoint[], degree: number, basis = regressionBasis(points)) {\n const p = degree + 1;\n if (degree === 1) {\n let mx = 0;\n let my = 0;\n let n = 0;\n for (const row of points) {\n n++;\n mx += (normalizeRegression(row.x, basis.xCenter, basis.xScale) - mx) / n;\n my += (normalizeRegression(row.y, basis.yCenter, basis.yScale) - my) / n;\n }\n let sxx = 0;\n let sxy = 0;\n for (const row of points) {\n const dx = normalizeRegression(row.x, basis.xCenter, basis.xScale) - mx;\n sxx += dx * dx;\n sxy += dx * (normalizeRegression(row.y, basis.yCenter, basis.yScale) - my);\n }\n const b = sxx === 0 ? 0 : sxy / sxx;\n const coef = sxx === 0 ? [my / (1 + mx * mx), (mx * my) / (1 + mx * mx)] : [my - b * mx, b];\n return { coef, rank: n === 0 ? 0 : sxx === 0 ? 1 : 2, basis };\n }\n const r = Array.from({ length: p }, () => new Array<number>(p).fill(0));\n const rhs = new Array<number>(p).fill(0);\n const row = new Array<number>(p);\n for (const point of points) {\n const z = normalizeRegression(point.x, basis.xCenter, basis.xScale);\n row[0] = 1;\n for (let j = 1; j < p; j++) {\n row[j] = row[j - 1] * z;\n }\n let value = normalizeRegression(point.y, basis.yCenter, basis.yScale);\n // 增量 Givens QR 仅保留 p×p 的 R,bootstrap 不分配 N×p 矩阵。\n for (let j = 0; j < p; j++) {\n const norm = Math.hypot(r[j][j], row[j]);\n if (norm === 0) {\n continue;\n }\n const c = r[j][j] / norm;\n const s = row[j] / norm;\n r[j][j] = norm;\n for (let k = j + 1; k < p; k++) {\n const previous = r[j][k];\n r[j][k] = c * previous + s * row[k];\n row[k] = -s * previous + c * row[k];\n }\n const previous = rhs[j];\n rhs[j] = c * previous + s * value;\n value = -s * previous + c * value;\n }\n }\n const tolerance = Math.max(...r.map((row, i) => Math.abs(row[i]))) * Number.EPSILON * p * 64;\n if (r.some((row, i) => Math.abs(row[i]) <= tolerance)) {\n return { ...minimumNorm(r, rhs), basis };\n }\n const coef = new Array<number>(p);\n for (let i = p - 1; i >= 0; i--) {\n let value = rhs[i];\n for (let j = i + 1; j < p; j++) {\n value -= r[i][j] * coef[j];\n }\n coef[i] = value / r[i][i];\n }\n return { coef, rank: p, basis };\n}\n\nexport function regressionPrediction(model: ReturnType<typeof fitRegression>, x: number) {\n const z = normalizeRegression(x, model.basis.xCenter, model.basis.xScale);\n let value = 0;\n for (let j = model.coef.length - 1; j >= 0; j--) {\n value = value * z + model.coef[j];\n }\n return model.basis.yCenter + model.basis.yScale * value;\n}\n\n/** 保留公开的升幂 coef;预测始终使用稳定基底。 */\nexport function regressionCoefficients(model: ReturnType<typeof fitRegression>) {\n let coef = [model.coef[model.coef.length - 1]];\n const a = -model.basis.xCenter / model.basis.xScale;\n const b = 1 / model.basis.xScale;\n for (let j = model.coef.length - 2; j >= 0; j--) {\n const next = new Array<number>(coef.length + 1).fill(0);\n coef.forEach((c, i) => {\n next[i] += a * c;\n next[i + 1] += b * c;\n });\n next[0] += model.coef[j];\n coef = next;\n }\n coef = coef.map(c => c * model.basis.yScale);\n coef[0] += model.basis.yCenter;\n if (coef.some(c => !Number.isFinite(c))) {\n throw new RangeError('Regression coefficients are not finite');\n }\n return coef;\n}\n\nexport function regressionGrid(min: number, max: number, count: number, predict: (x: number) => number) {\n if (!Number.isInteger(count) || count <= 0 || !Number.isFinite(min) || !Number.isFinite(max)) {\n return [];\n }\n const width = max - min;\n const step = count === 1 ? 0 : width / (count - 1);\n return Array.from({ length: count }, (_, i) => {\n const t = count === 1 ? 0 : i / (count - 1);\n const x = i === 0 ? min : i === count - 1 ? max : Number.isFinite(width) ? min + i * step : (1 - t) * min + t * max;\n return { x, y: predict(x) };\n });\n}\n"]}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { normalQuantile as invNorm } from './normalQuantile';
|
|
2
|
+
export { invNorm };
|
|
3
|
+
/** Compute a two-sided normal critical value without subtracting a small tail probability from one. */
|
|
4
|
+
export declare function confidenceCriticalValue(alpha: number): number;
|
|
5
|
+
/** A zero standard error gives a degenerate interval even when the critical value is infinite. */
|
|
6
|
+
export declare function confidenceHalfWidth(z: number, standardError: number): number;
|
|
2
7
|
export interface LinearCIComponents {
|
|
3
8
|
min: number;
|
|
4
9
|
max: number;
|
|
@@ -7,7 +12,14 @@ export interface LinearCIComponents {
|
|
|
7
12
|
SSE: number;
|
|
8
13
|
Sxx: number;
|
|
9
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Compute basic components used for linear regression confidence / prediction intervals.
|
|
17
|
+
* - scans data to compute min/max of x, n, mean X, SSE and Sxx (sum (xi - X)^2).
|
|
18
|
+
*/
|
|
10
19
|
export declare function computeLinearCIComponents(data: any[], x: (d: any) => number, y: (d: any) => number, predict: (x: number) => number): LinearCIComponents;
|
|
20
|
+
/**
|
|
21
|
+
* Compute standard errors for mean and prediction at px using components.
|
|
22
|
+
*/
|
|
11
23
|
export declare function stdErrorsAt(px: number, comps: LinearCIComponents): {
|
|
12
24
|
seMean: number;
|
|
13
25
|
sePred: number;
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import isNil from "./isNil";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { normalQuantile as invNorm } from "./normalQuantile";
|
|
4
|
+
|
|
5
|
+
export { invNorm };
|
|
6
|
+
|
|
7
|
+
/** Compute a two-sided normal critical value without subtracting a small tail probability from one. */ export function confidenceCriticalValue(alpha) {
|
|
8
|
+
return !Number.isFinite(alpha) || alpha < 0 || alpha > 1 ? NaN : -invNorm(alpha / 2);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** A zero standard error gives a degenerate interval even when the critical value is infinite. */ export function confidenceHalfWidth(z, standardError) {
|
|
12
|
+
return Number.isNaN(z) ? NaN : 0 === standardError ? 0 : z * standardError;
|
|
10
13
|
}
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Compute basic components used for linear regression confidence / prediction intervals.
|
|
17
|
+
* - scans data to compute min/max of x, n, mean X, SSE and Sxx (sum (xi - X)^2).
|
|
18
|
+
*/ export function computeLinearCIComponents(data, x, y, predict) {
|
|
19
|
+
// simple local scanner to avoid circular imports
|
|
13
20
|
let min = 1 / 0, max = -1 / 0, n = 0, sumX = 0;
|
|
14
21
|
for (let i = 0; i < data.length; i++) {
|
|
15
22
|
const d = data[i];
|
|
@@ -47,7 +54,9 @@ export function computeLinearCIComponents(data, x, y, predict) {
|
|
|
47
54
|
};
|
|
48
55
|
}
|
|
49
56
|
|
|
50
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Compute standard errors for mean and prediction at px using components.
|
|
59
|
+
*/ export function stdErrorsAt(px, comps) {
|
|
51
60
|
const {n: n, X: X, Sxx: Sxx, SSE: SSE} = comps, s2 = n > 2 ? SSE / (n - 2) : 0;
|
|
52
61
|
return {
|
|
53
62
|
seMean: Sxx > 0 ? Math.sqrt(s2 * (1 / n + (px - X) * (px - X) / Sxx)) : Math.sqrt(s2 / n),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/regression-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/regression-utils.ts"],"names":[],"mappings":"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","file":"regression-utils.js","sourcesContent":["import isNil from './isNil';\nimport { normalQuantile as invNorm } from './normalQuantile';\nexport { invNorm };\n\n/** Compute a two-sided normal critical value without subtracting a small tail probability from one. */\nexport function confidenceCriticalValue(alpha: number): number {\n if (!Number.isFinite(alpha) || alpha < 0 || alpha > 1) {\n return NaN;\n }\n return -invNorm(alpha / 2);\n}\n\n/** A zero standard error gives a degenerate interval even when the critical value is infinite. */\nexport function confidenceHalfWidth(z: number, standardError: number): number {\n if (Number.isNaN(z)) {\n return NaN;\n }\n return standardError === 0 ? 0 : z * standardError;\n}\n\nexport interface LinearCIComponents {\n min: number;\n max: number;\n n: number;\n X: number; // mean of x\n SSE: number;\n Sxx: number;\n}\n\n/**\n * Compute basic components used for linear regression confidence / prediction intervals.\n * - scans data to compute min/max of x, n, mean X, SSE and Sxx (sum (xi - X)^2).\n */\nexport function computeLinearCIComponents(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n predict: (x: number) => number\n): LinearCIComponents {\n // simple local scanner to avoid circular imports\n let min = Infinity;\n let max = -Infinity;\n let n = 0;\n let sumX = 0;\n\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let dx = x(d);\n let dy = y(d);\n if (!isNil(dx) && (dx = +dx) >= dx && !isNil(dy) && (dy = +dy) >= dy) {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n n++;\n sumX += dx;\n }\n }\n\n if (n === 0) {\n return { min, max, n, X: 0, SSE: 0, Sxx: 0 };\n }\n\n const X = sumX / n;\n let SSE = 0;\n let Sxx = 0;\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let dx = x(d);\n let dy = y(d);\n if (!isNil(dx) && (dx = +dx) >= dx && !isNil(dy) && (dy = +dy) >= dy) {\n const r = dy - predict(dx);\n SSE += r * r;\n const dxc = dx - X;\n Sxx += dxc * dxc;\n }\n }\n\n return { min, max, n, X, SSE, Sxx };\n}\n\n/**\n * Compute standard errors for mean and prediction at px using components.\n */\nexport function stdErrorsAt(px: number, comps: LinearCIComponents) {\n const { n, X, Sxx, SSE } = comps;\n const s2 = n > 2 ? SSE / (n - 2) : 0;\n const seMean = Sxx > 0 ? Math.sqrt(s2 * (1 / n + ((px - X) * (px - X)) / Sxx)) : Math.sqrt(s2 / n);\n const sePred = Math.sqrt(s2 * (1 + 1 / n + (Sxx > 0 ? ((px - X) * (px - X)) / Sxx : 0)));\n return { seMean, sePred };\n}\n\nexport default {\n invNorm,\n computeLinearCIComponents,\n stdErrorsAt\n};\n"]}
|
package/es/common/throttle.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/throttle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/common/throttle.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,SAAS,QAAQ,CACf,IAAyB,EACzB,IAAY,EACZ,OAAmD;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;QAC9B,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;KAC5C;IACD,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;QACrB,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;KAClE;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE;QAC1B,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC;AAED,eAAe,QAAQ,CAAC","file":"throttle.js","sourcesContent":["/**\n * @see https://github.com/lodash/lodash/blob/master/throttle.js\n */\nimport debounce from './debounce';\nimport isObject from './isObject';\n\nfunction throttle<T, S>(\n func: (...args: T[]) => S,\n wait: number,\n options?: { leading?: boolean; trailing?: boolean }\n): (...args: T[]) => S {\n let leading = true;\n let trailing = true;\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function');\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n });\n}\n\nexport default throttle;\n"]}
|
package/es/common/toDate.js
CHANGED
|
@@ -2,15 +2,35 @@ import isNil from "./isNil";
|
|
|
2
2
|
|
|
3
3
|
import isString from "./isString";
|
|
4
4
|
|
|
5
|
+
// eslint-disable-next-line no-useless-escape
|
|
5
6
|
const TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d{1,2})(?::(\d{1,2})(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;
|
|
6
7
|
|
|
8
|
+
// eslint-disable-line
|
|
7
9
|
export function toDate(val) {
|
|
8
10
|
if (val instanceof Date) return val;
|
|
9
11
|
if (isString(val)) {
|
|
12
|
+
// Different browsers parse date in different way, so we parse it manually.
|
|
13
|
+
// Some other issues:
|
|
14
|
+
// new Date('1970-01-01') is UTC,
|
|
15
|
+
// new Date('1970/01/01') and new Date('1970-1-01') is local.
|
|
16
|
+
// See issue #3623
|
|
10
17
|
const match = TIME_REG.exec(val);
|
|
11
|
-
if (!match)
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
if (!match)
|
|
19
|
+
// return Invalid Date.
|
|
20
|
+
return new Date(NaN);
|
|
21
|
+
// Use local time when no timezone offset specifed.
|
|
22
|
+
if (!match[8])
|
|
23
|
+
// match[n] can only be string or undefined.
|
|
24
|
+
// But take care of '12' + 1 => '121'.
|
|
25
|
+
return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0);
|
|
26
|
+
// Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,
|
|
27
|
+
// https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).
|
|
28
|
+
// For example, system timezone is set as "Time Zone: America/Toronto",
|
|
29
|
+
// then these code will get different result:
|
|
30
|
+
// `new Date(1478411999999).getTimezoneOffset(); // get 240`
|
|
31
|
+
// `new Date(1478412000000).getTimezoneOffset(); // get 300`
|
|
32
|
+
// So we should not use `new Date`, but use `Date.UTC`.
|
|
33
|
+
let hour = +match[4] || 0;
|
|
14
34
|
return "Z" !== match[8].toUpperCase() && (hour -= +match[8].slice(0, 3)), new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0));
|
|
15
35
|
}
|
|
16
36
|
return isNil(val) ? new Date(NaN) : new Date(Math.round(val));
|
package/es/common/toDate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/toDate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,QAAQ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/toDate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAIlC,6CAA6C;AAC7C,MAAM,QAAQ,GACZ,yIAAyI,CAAC,CAAC,sBAAsB;AAEnK,MAAM,UAAU,MAAM,CAAC,GAAiB;IACtC,IAAI,GAAG,YAAY,IAAI,EAAE;QACvB,OAAO,GAAG,CAAC;KACZ;SAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;QACxB,2EAA2E;QAC3E,qBAAqB;QACrB,iCAAiC;QACjC,6DAA6D;QAC7D,kBAAkB;QAClB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;YACV,uBAAuB;YACvB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;SACtB;QAED,mDAAmD;QACnD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACb,4CAA4C;YAC5C,sCAAsC;YACtC,OAAO,IAAI,IAAI,CACb,CAAC,KAAK,CAAC,CAAC,CAAC,EACT,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EACpB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAChB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACzC,CAAC;SACH;QACD,8EAA8E;QAC9E,wEAAwE;QACxE,uEAAuE;QACvE,6CAA6C;QAC7C,6DAA6D;QAC7D,6DAA6D;QAC7D,uDAAuD;QAEvD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,IAAI,CACb,IAAI,CAAC,GAAG,CACN,CAAC,KAAK,CAAC,CAAC,CAAC,EACT,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EACpB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,IAAI,EACJ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAChB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACd,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACzC,CACF,CAAC;KACH;SAAM,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;QACrB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;KACtB;IAED,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAa,CAAC,CAAC,CAAC;AAC7C,CAAC","file":"toDate.js","sourcesContent":["import isNil from './isNil';\nimport isString from './isString';\n\nexport type DateLikeType = number | string | Date;\n\n// eslint-disable-next-line no-useless-escape\nconst TIME_REG =\n /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; // eslint-disable-line\n\nexport function toDate(val: DateLikeType): Date {\n if (val instanceof Date) {\n return val;\n } else if (isString(val)) {\n // Different browsers parse date in different way, so we parse it manually.\n // Some other issues:\n // new Date('1970-01-01') is UTC,\n // new Date('1970/01/01') and new Date('1970-1-01') is local.\n // See issue #3623\n const match = TIME_REG.exec(val);\n\n if (!match) {\n // return Invalid Date.\n return new Date(NaN);\n }\n\n // Use local time when no timezone offset specifed.\n if (!match[8]) {\n // match[n] can only be string or undefined.\n // But take care of '12' + 1 => '121'.\n return new Date(\n +match[1],\n +(match[2] || 1) - 1,\n +match[3] || 1,\n +match[4] || 0,\n +(match[5] || 0),\n +match[6] || 0,\n match[7] ? +match[7].substring(0, 3) : 0\n );\n }\n // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,\n // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).\n // For example, system timezone is set as \"Time Zone: America/Toronto\",\n // then these code will get different result:\n // `new Date(1478411999999).getTimezoneOffset(); // get 240`\n // `new Date(1478412000000).getTimezoneOffset(); // get 300`\n // So we should not use `new Date`, but use `Date.UTC`.\n\n let hour = +match[4] || 0;\n if (match[8].toUpperCase() !== 'Z') {\n hour -= +match[8].slice(0, 3);\n }\n return new Date(\n Date.UTC(\n +match[1],\n +(match[2] || 1) - 1,\n +match[3] || 1,\n hour,\n +(match[5] || 0),\n +match[6] || 0,\n match[7] ? +match[7].substring(0, 3) : 0\n )\n );\n } else if (isNil(val)) {\n return new Date(NaN);\n }\n\n return new Date(Math.round(val as number));\n}\n"]}
|
package/es/common/uuid.d.ts
CHANGED
package/es/common/uuid.js
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
// TODO: 性能不是很好,需要优化,后续升级到最新版本的 canvas 之后就可以删除了
|
|
2
|
+
/**
|
|
3
|
+
* 生成uuid字符串.
|
|
4
|
+
* 参考https://github.com/yangjunning/issues/issues/56
|
|
5
|
+
* @param len
|
|
6
|
+
* @param radix
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
1
9
|
const uuid = (len, radix) => {
|
|
2
10
|
const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), uuid = [];
|
|
3
11
|
let i;
|
|
4
|
-
if (radix = radix || chars.length, len)
|
|
12
|
+
if (radix = radix || chars.length, len)
|
|
13
|
+
// Compact form
|
|
14
|
+
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]; else {
|
|
15
|
+
// rfc4122, version 4 form
|
|
5
16
|
let r;
|
|
17
|
+
// rfc4122 requires these characters
|
|
18
|
+
// Fill in random data. At i==19 set the high bits of clock sequence as
|
|
19
|
+
// per rfc4122, sec. 4.1.5
|
|
6
20
|
for (uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-", uuid[14] = "4", i = 0; i < 36; i++) uuid[i] || (r = 0 | 16 * Math.random(),
|
|
7
21
|
uuid[i] = chars[19 === i ? 3 & r | 8 : r]);
|
|
8
22
|
}
|
package/es/common/uuid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/uuid.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/common/uuid.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAa,EAAU,EAAE;IAClD,MAAM,KAAK,GAAG,gEAAgE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,CAAC;IACN,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;IAE9B,IAAI,GAAG,EAAE;QACP,eAAe;QACf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;SAC9C;KACF;SAAM;QACL,0BAA0B;QAC1B,IAAI,CAAC,CAAC;QAEN,oCAAoC;QACpC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAEf,wEAAwE;QACxE,0BAA0B;QAC1B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACZ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACjD;SACF;KACF;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC","file":"uuid.js","sourcesContent":["// TODO: 性能不是很好,需要优化,后续升级到最新版本的 canvas 之后就可以删除了\n/**\n * 生成uuid字符串.\n * 参考https://github.com/yangjunning/issues/issues/56\n * @param len\n * @param radix\n * @returns\n */\nconst uuid = (len: number, radix: number): string => {\n const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\n const uuid = [];\n let i;\n radix = radix || chars.length;\n\n if (len) {\n // Compact form\n for (i = 0; i < len; i++) {\n uuid[i] = chars[0 | (Math.random() * radix)];\n }\n } else {\n // rfc4122, version 4 form\n let r;\n\n // rfc4122 requires these characters\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\n uuid[14] = '4';\n\n // Fill in random data. At i==19 set the high bits of clock sequence as\n // per rfc4122, sec. 4.1.5\n for (i = 0; i < 36; i++) {\n if (!uuid[i]) {\n r = 0 | (Math.random() * 16);\n uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r];\n }\n }\n }\n\n return uuid.join('');\n};\n\nexport default uuid;\n"]}
|
|
@@ -20,11 +20,42 @@ export interface IBounds {
|
|
|
20
20
|
translate: (dx: number, dy: number) => IBounds;
|
|
21
21
|
rotate: (angle: number, x: number, y: number) => IBounds;
|
|
22
22
|
scale: (sx: number, sy: number, x: number, y: number) => IBounds;
|
|
23
|
+
/**
|
|
24
|
+
* 并集
|
|
25
|
+
* @param b
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
23
28
|
union: (b: IBoundsLike) => IBounds;
|
|
29
|
+
/**
|
|
30
|
+
* 交集
|
|
31
|
+
* @param b
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
24
34
|
intersect: (b: IBoundsLike) => IBounds;
|
|
35
|
+
/**
|
|
36
|
+
* 是否包含b
|
|
37
|
+
* @param b
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
25
40
|
encloses: (b: IBoundsLike) => boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 是否共边
|
|
43
|
+
* @param b
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
26
46
|
alignsWith: (b: IBoundsLike) => boolean;
|
|
47
|
+
/**
|
|
48
|
+
* 是否相交
|
|
49
|
+
* @param b
|
|
50
|
+
* @returns
|
|
51
|
+
*/
|
|
27
52
|
intersects: (b: IBoundsLike) => boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 是否包含
|
|
55
|
+
* @param x
|
|
56
|
+
* @param y
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
28
59
|
contains: (x: number, y: number) => boolean;
|
|
29
60
|
containsPoint: (p: IPointLike) => boolean;
|
|
30
61
|
width: () => number;
|
|
@@ -40,7 +71,46 @@ export interface IOBBBounds extends IBounds {
|
|
|
40
71
|
getRotatedCorners: () => IPointLike[];
|
|
41
72
|
}
|
|
42
73
|
export declare function transformBoundsWithMatrix(out: IBounds, bounds: IBounds, matrix: IMatrix): IBounds;
|
|
74
|
+
/**
|
|
75
|
+
* 依据graphic的属性对bounds进行变换
|
|
76
|
+
* @param bounds
|
|
77
|
+
* @param x
|
|
78
|
+
* @param y
|
|
79
|
+
* @param scaleX
|
|
80
|
+
* @param scaleY
|
|
81
|
+
* @param angle
|
|
82
|
+
* @param rotateCenter
|
|
83
|
+
*/
|
|
43
84
|
export declare function transformBounds(bounds: IBounds, x: number, y: number, scaleX: number, scaleY: number, angle: number, rotateCenter?: [number, number]): void;
|
|
85
|
+
/**
|
|
86
|
+
Copyright (c) 2015-2021, University of Washington Interactive Data Lab
|
|
87
|
+
All rights reserved.
|
|
88
|
+
|
|
89
|
+
Redistribution and use in source and binary forms, with or without
|
|
90
|
+
modification, are permitted provided that the following conditions are met:
|
|
91
|
+
|
|
92
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
93
|
+
list of conditions and the following disclaimer.
|
|
94
|
+
|
|
95
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
96
|
+
this list of conditions and the following disclaimer in the documentation
|
|
97
|
+
and/or other materials provided with the distribution.
|
|
98
|
+
|
|
99
|
+
3. Neither the name of the copyright holder nor the names of its contributors
|
|
100
|
+
may be used to endorse or promote products derived from this software
|
|
101
|
+
without specific prior written permission.
|
|
102
|
+
|
|
103
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
104
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
105
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
106
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
107
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
108
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
109
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
110
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
111
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
112
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
113
|
+
*/
|
|
44
114
|
export declare class Bounds implements IBounds {
|
|
45
115
|
x1: number;
|
|
46
116
|
y1: number;
|
|
@@ -59,11 +129,42 @@ export declare class Bounds implements IBounds {
|
|
|
59
129
|
translate(dx?: number, dy?: number): Bounds;
|
|
60
130
|
rotate(angle?: number, x?: number, y?: number): Bounds;
|
|
61
131
|
scale(sx?: number, sy?: number, x?: number, y?: number): Bounds;
|
|
132
|
+
/**
|
|
133
|
+
* 并集
|
|
134
|
+
* @param b
|
|
135
|
+
* @returns
|
|
136
|
+
*/
|
|
62
137
|
union(b: IBoundsLike): Bounds;
|
|
138
|
+
/**
|
|
139
|
+
* 交集
|
|
140
|
+
* @param b
|
|
141
|
+
* @returns
|
|
142
|
+
*/
|
|
63
143
|
intersect(b: IBoundsLike): Bounds;
|
|
144
|
+
/**
|
|
145
|
+
* 是否包含b
|
|
146
|
+
* @param b
|
|
147
|
+
* @returns
|
|
148
|
+
*/
|
|
64
149
|
encloses(b: IBoundsLike): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* 是否共边
|
|
152
|
+
* @param b
|
|
153
|
+
* @returns
|
|
154
|
+
*/
|
|
65
155
|
alignsWith(b: IBoundsLike): boolean;
|
|
156
|
+
/**
|
|
157
|
+
* 是否相交
|
|
158
|
+
* @param b
|
|
159
|
+
* @returns
|
|
160
|
+
*/
|
|
66
161
|
intersects(b: IBoundsLike): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* 是否包含
|
|
164
|
+
* @param x
|
|
165
|
+
* @param y
|
|
166
|
+
* @returns
|
|
167
|
+
*/
|
|
67
168
|
contains(x?: number, y?: number): boolean;
|
|
68
169
|
containsPoint(p: IPointLike): boolean;
|
|
69
170
|
width(): number;
|