@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
package/README.zh-CN.md
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## 标准正态逆 CDF
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { normalQuantile } from '@visactor/vutils';
|
|
5
|
+
normalQuantile(0.975); // 约 1.95996398454
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
`normalQuantile(p)` 复用回归区间原有的 Acklam 近似。p 在 (0,1) 返回有限分位数,0 / 1 返回 −Infinity / Infinity,非法概率或非有限输入返回 NaN。SciPy 1.13.1 基准检查尾部 1e-12 至 1−1e-12 和分段边界,绝对误差小于 5e-8。回归区间也调用此工具,避免维护重复实现。
|
|
9
|
+
|
|
10
|
+
回归区间的 `alpha` 表示显著性水平,置信度为 `1-alpha`,默认 `alpha=0.05`。区间通过下尾概率计算临界值,避免 `1-alpha/2` 在 `alpha` 极小时舍入为 1。
|
|
11
|
+
|
|
12
|
+
`alpha=0` 时,正标准误产生无限区间,零标准误产生退化区间;`alpha=1` 产生退化区间。非有限 `alpha` 或超出 `[0,1]` 的值产生 NaN 区间端点。
|
package/REGRESSION.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# 一元回归与成对 bootstrap 契约
|
|
2
|
+
|
|
3
|
+
本轮修正面向 VUtil 1.0.25 的回归工具;正式 npm 1.0.25 不包含这些修复和新 API。
|
|
4
|
+
|
|
5
|
+
- regressionLinear:使用中心化/缩放的一元 OLS,预测在稳定坐标中求值,保留 coef.a/b。增加 rank;常量 x 的历史常数估计继续有定义,图表需要可识别斜率时由输入边界拒绝。
|
|
6
|
+
- regressionPolynomial:以归一化设计矩阵做增量 Givens QR;秩不足时对小型 R 做 Jacobi SVD 得到最小范数解,增加 rank,不再返回伪造零系数。coef 保持升幂的原始 x 坐标含义,predict 用稳定基底。degree 为非负整数,默认仍为 0。原始系数不能有限表示时明确报 RangeError。
|
|
7
|
+
- regressionLowess:默认 span 从 0.3 改为 2/3、iterations 从 2 改为 3,使用全部有效观测;不再隐藏抽样或按 N 关闭稳健迭代。拟合时固定稳健状态,predict/evaluateGrid/fitted 节点一致。显式 maxSamples 保留历史抽样用途,并包含端点;delta 默认为 0,正值以观测锚点插值加速,全量观测仍参与局部权重与稳健残差。fitted 按 x 排序,保留重复样本。此默认行为调整会改变旧 LOWESS 曲线,调用方需要明确选择参数。
|
|
8
|
+
- LOWESS 使用查询点附近的局部 x/y 坐标,避免远处观测压缩近邻精度;只有距离或插值区间溢出时才改用归一化 x 距离。
|
|
9
|
+
- 等距离邻域选择较小 x,再按 y 排序,不依赖调用方行顺序。相同 x 的零半径邻域包含所有相同 x 观测。零核权重时用最近有效观测的加权常数,等距离取均值;没有有效稳健观测时明确报错。median=0 时保留数值精度内零残差点的权重,对明显非零残差赋零权重。
|
|
10
|
+
- regressionBootstrap 从包根导出,仅 linear/polynomial。options 为 method/degree?/grid/level/resamples/seed,完整 (x,y) 成对有放回抽样,每次拟合一次。原始组须有满秩设计及正残差自由度,退化重采样在原始固定归一化基底中取最小范数解,不删抽样或重抽。每个 grid 位置按线性插值分位数生成 lower/upper,表示均值响应的逐点 percentile CI,不是预测区间。
|
|
11
|
+
|
|
12
|
+
既有 confidenceInterval 的正态临界值与旧区间用途没有在本轮改成 bootstrap。尤其旧多项式/LOWESS 区间近似不能用来声称符合新的回归置信带契约;完整整理独立处理。
|
|
13
|
+
|
|
14
|
+
缺失 accessor 的既有排除行为保留;无穷大不参与拟合,StatPlots 另有更严格的有限原始观测边界。新增求解器不修改输入。bootstrap 在内部对配对排序,同组同 seed 可复现;不承诺与 NumPy RNG 相同。
|
|
15
|
+
|
|
16
|
+
独立数值对照使用 __tests__/fixtures/regression-python.json 的固定参考数据,文件记录参考环境的 Python、NumPy 和 statsmodels 版本;TypeScript 测试直接读取 JSON,无需 Python 运行环境。LOWESS 正常非退化数据对照 statsmodels,bootstrap 重放同一抽样索引后对照 NumPy 最小二乘与分位数。退化/ties 行为及坐标基底差异单独声明,不承诺全部参数逐位相同。
|
|
17
|
+
|
|
18
|
+
性能在真实 Node 构建产物测量,避免 Jest VM 对 Math 属性代理的显著额外成本;先 npm run build,再运行 lowess-performance.test.ts 或 node benchmarks/lowess.cjs。保留原 100/150/200ms 预算,使用显式 delta 并断言所有节点保留,精确路径另由数值测试和浏览器实测覆盖。VUtils 的 Jest 配置使用单 worker,CI 的 Rush test 使用 --parallelism 1,避免同包或其他包并发测试影响墙钟预算;所有单元与性能用例均执行。
|
|
19
|
+
|
|
20
|
+
## 调用示例
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { regressionLinear, regressionBootstrap, regressionLowess } from '@visactor/vutils';
|
|
24
|
+
|
|
25
|
+
const samples = [{ x: 0, y: 1 }, { x: 1, y: 3 }, { x: 2, y: 4 }, { x: 3, y: 7 }];
|
|
26
|
+
const model = regressionLinear(samples);
|
|
27
|
+
const curve = model.evaluateGrid(100);
|
|
28
|
+
const bounds = regressionBootstrap(samples, {
|
|
29
|
+
method: 'linear', grid: curve.map(p => p.x), level: 0.95, resamples: 1000, seed: 0
|
|
30
|
+
});
|
|
31
|
+
const smooth = regressionLowess(samples, undefined, undefined, { span: 2 / 3, iterations: 3, delta: 0 });
|
|
32
|
+
// bounds 与 curve 使用相同 x;LOWESS 的 fitted 保留排序后的全部有效观测。
|
|
33
|
+
const prediction = smooth.predict(1);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
bootstrap 的 level 严格在 (0,1),resamples 为正整数,seed 为 uint32;grid 为有限数字数组。主模型不满秩或没有残差自由度时抛出 RangeError。bootstrap 的多项式使用 method='polynomial' 和正整数 degree。图表层可采用更严格的次数和预算上限,不改变通用求解器契约。
|
package/cjs/angle.d.ts
CHANGED
|
@@ -1,21 +1,82 @@
|
|
|
1
1
|
import type { IPointLike } from './data-structure/point';
|
|
2
|
+
/**
|
|
3
|
+
* degree -> radian
|
|
4
|
+
* @param degree
|
|
5
|
+
* @returns radian
|
|
6
|
+
*/
|
|
2
7
|
export declare function degreeToRadian(degree: number): number;
|
|
8
|
+
/**
|
|
9
|
+
* radian -> degree
|
|
10
|
+
* @param radian
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
3
13
|
export declare function radianToDegree(radian: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* 对弧度进行格式化
|
|
16
|
+
* @param a 传入的弧度
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
4
19
|
export declare const clampRadian: (angle?: number) => number;
|
|
5
20
|
export declare const clampAngleByRadian: (angle?: number) => number;
|
|
21
|
+
/**
|
|
22
|
+
* 对角度进行格式化
|
|
23
|
+
* @param a 角度
|
|
24
|
+
* @returns
|
|
25
|
+
*/
|
|
6
26
|
export declare const clampDegree: (a?: number) => number;
|
|
7
27
|
export declare const clampAngleByDegree: (a?: number) => number;
|
|
28
|
+
/**
|
|
29
|
+
* 根据弧度及半径计算极坐标系下的坐标点
|
|
30
|
+
* @param centerX 圆心坐标
|
|
31
|
+
* @param radius 半径
|
|
32
|
+
* @param angleInRadian 弧度
|
|
33
|
+
* @returns 返回笛卡尔坐标点
|
|
34
|
+
*/
|
|
8
35
|
export declare function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): {
|
|
9
36
|
x: number;
|
|
10
37
|
y: number;
|
|
11
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* 根据笛卡尔坐标系坐标计算极坐标坐标点
|
|
41
|
+
* @param point
|
|
42
|
+
* @param center 极坐标系中心点坐标
|
|
43
|
+
* @param startAngle 极坐标系起始角度
|
|
44
|
+
* @param endAngle 极坐标系结束角度
|
|
45
|
+
* @returns 极坐标系坐标点
|
|
46
|
+
*/
|
|
12
47
|
export declare function cartesianToPolar(point: IPointLike, center?: IPointLike, startAngle?: number, endAngle?: number): {
|
|
13
48
|
radius: number;
|
|
14
49
|
angle: number;
|
|
15
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角
|
|
53
|
+
* @param center 圆心坐标
|
|
54
|
+
* @param point 待求的点坐标
|
|
55
|
+
* @returns 返回夹角对应的弧度值
|
|
56
|
+
*/
|
|
16
57
|
export declare function getAngleByPoint(center: IPointLike, point: IPointLike): number;
|
|
58
|
+
/**
|
|
59
|
+
* 角度标准化处理
|
|
60
|
+
* @param angle 弧度角
|
|
61
|
+
*/
|
|
17
62
|
export declare function normalizeAngle(angle: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* 指定开始角度和结束角度,计算这个范围内的边界角度,
|
|
65
|
+
* 即起始角度以及经过的东、南、西、北四个方向的角度
|
|
66
|
+
* 计算这个角度,可以用于计算一个弧度的bounding box 等
|
|
67
|
+
* @param startAngle 起始角度的弧度值
|
|
68
|
+
* @param endAngle 结束角度的弧度值
|
|
69
|
+
* @returns 边界角度数组
|
|
70
|
+
*/
|
|
18
71
|
export declare function findBoundaryAngles(startAngle: number, endAngle: number): number[];
|
|
72
|
+
/**
|
|
73
|
+
* 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径
|
|
74
|
+
* @param rect 矩形的大小
|
|
75
|
+
* @param center 中心点
|
|
76
|
+
* @param startAngle 起始角度的弧度值
|
|
77
|
+
* @param endAngle 结束角度的弧度值
|
|
78
|
+
* @returns 最大半径
|
|
79
|
+
*/
|
|
19
80
|
export declare function calculateMaxRadius(rect: {
|
|
20
81
|
width: number;
|
|
21
82
|
height: number;
|
package/cjs/angle.js
CHANGED
|
@@ -4,27 +4,58 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: !0
|
|
5
5
|
}), exports.computeQuadrant = exports.calculateMaxRadius = exports.findBoundaryAngles = exports.normalizeAngle = exports.getAngleByPoint = exports.cartesianToPolar = exports.polarToCartesian = exports.clampAngleByDegree = exports.clampDegree = exports.clampAngleByRadian = exports.clampRadian = exports.radianToDegree = exports.degreeToRadian = void 0;
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* 处理角度相关的数据计算
|
|
9
|
+
*/
|
|
7
10
|
const math_1 = require("./math");
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
/**
|
|
13
|
+
* degree -> radian
|
|
14
|
+
* @param degree
|
|
15
|
+
* @returns radian
|
|
16
|
+
*/ function degreeToRadian(degree) {
|
|
10
17
|
return degree * (Math.PI / 180);
|
|
11
18
|
}
|
|
12
19
|
|
|
20
|
+
/**
|
|
21
|
+
* radian -> degree
|
|
22
|
+
* @param radian
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
13
25
|
function radianToDegree(radian) {
|
|
14
26
|
return 180 * radian / Math.PI;
|
|
15
27
|
}
|
|
16
28
|
|
|
17
29
|
exports.degreeToRadian = degreeToRadian, exports.radianToDegree = radianToDegree;
|
|
18
30
|
|
|
31
|
+
/**
|
|
32
|
+
* 对弧度进行格式化
|
|
33
|
+
* @param a 传入的弧度
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
19
36
|
const clampRadian = (angle = 0) => {
|
|
20
37
|
if (angle < 0) for (;angle < -math_1.tau; ) angle += math_1.tau; else if (angle > 0) for (;angle > math_1.tau; ) angle -= math_1.tau;
|
|
21
38
|
return angle;
|
|
22
39
|
};
|
|
23
40
|
|
|
24
|
-
exports.clampRadian = clampRadian,
|
|
41
|
+
exports.clampRadian = clampRadian,
|
|
42
|
+
// alias of clampRadian
|
|
43
|
+
exports.clampAngleByRadian = exports.clampRadian;
|
|
25
44
|
|
|
45
|
+
/**
|
|
46
|
+
* 对角度进行格式化
|
|
47
|
+
* @param a 角度
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
26
50
|
const clampDegree = (a = 0) => a > 360 || a < -360 ? a % 360 : a;
|
|
27
51
|
|
|
52
|
+
/**
|
|
53
|
+
* 根据弧度及半径计算极坐标系下的坐标点
|
|
54
|
+
* @param centerX 圆心坐标
|
|
55
|
+
* @param radius 半径
|
|
56
|
+
* @param angleInRadian 弧度
|
|
57
|
+
* @returns 返回笛卡尔坐标点
|
|
58
|
+
*/
|
|
28
59
|
function polarToCartesian(center, radius, angleInRadian) {
|
|
29
60
|
return radius ? {
|
|
30
61
|
x: center.x + radius * Math.cos(angleInRadian),
|
|
@@ -35,6 +66,14 @@ function polarToCartesian(center, radius, angleInRadian) {
|
|
|
35
66
|
};
|
|
36
67
|
}
|
|
37
68
|
|
|
69
|
+
/**
|
|
70
|
+
* 根据笛卡尔坐标系坐标计算极坐标坐标点
|
|
71
|
+
* @param point
|
|
72
|
+
* @param center 极坐标系中心点坐标
|
|
73
|
+
* @param startAngle 极坐标系起始角度
|
|
74
|
+
* @param endAngle 极坐标系结束角度
|
|
75
|
+
* @returns 极坐标系坐标点
|
|
76
|
+
*/
|
|
38
77
|
function cartesianToPolar(point, center = {
|
|
39
78
|
x: 0,
|
|
40
79
|
y: 0
|
|
@@ -56,16 +95,34 @@ function cartesianToPolar(point, center = {
|
|
|
56
95
|
};
|
|
57
96
|
}
|
|
58
97
|
|
|
98
|
+
/**
|
|
99
|
+
* 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角
|
|
100
|
+
* @param center 圆心坐标
|
|
101
|
+
* @param point 待求的点坐标
|
|
102
|
+
* @returns 返回夹角对应的弧度值
|
|
103
|
+
*/
|
|
59
104
|
function getAngleByPoint(center, point) {
|
|
60
105
|
return Math.atan2(point.y - center.y, point.x - center.x);
|
|
61
106
|
}
|
|
62
107
|
|
|
108
|
+
/**
|
|
109
|
+
* 角度标准化处理
|
|
110
|
+
* @param angle 弧度角
|
|
111
|
+
*/
|
|
63
112
|
function normalizeAngle(angle) {
|
|
64
113
|
for (;angle < 0; ) angle += 2 * Math.PI;
|
|
65
114
|
for (;angle >= 2 * Math.PI; ) angle -= 2 * Math.PI;
|
|
66
115
|
return angle;
|
|
67
116
|
}
|
|
68
117
|
|
|
118
|
+
/**
|
|
119
|
+
* 指定开始角度和结束角度,计算这个范围内的边界角度,
|
|
120
|
+
* 即起始角度以及经过的东、南、西、北四个方向的角度
|
|
121
|
+
* 计算这个角度,可以用于计算一个弧度的bounding box 等
|
|
122
|
+
* @param startAngle 起始角度的弧度值
|
|
123
|
+
* @param endAngle 结束角度的弧度值
|
|
124
|
+
* @returns 边界角度数组
|
|
125
|
+
*/
|
|
69
126
|
function findBoundaryAngles(startAngle, endAngle) {
|
|
70
127
|
const deltaAngle = Math.abs(endAngle - startAngle);
|
|
71
128
|
if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) return [ 0, Math.PI / 2, Math.PI, 1.5 * Math.PI ];
|
|
@@ -76,6 +133,14 @@ function findBoundaryAngles(startAngle, endAngle) {
|
|
|
76
133
|
return steps;
|
|
77
134
|
}
|
|
78
135
|
|
|
136
|
+
/**
|
|
137
|
+
* 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径
|
|
138
|
+
* @param rect 矩形的大小
|
|
139
|
+
* @param center 中心点
|
|
140
|
+
* @param startAngle 起始角度的弧度值
|
|
141
|
+
* @param endAngle 结束角度的弧度值
|
|
142
|
+
* @returns 最大半径
|
|
143
|
+
*/
|
|
79
144
|
function calculateMaxRadius(rect, center, startAngle, endAngle) {
|
|
80
145
|
const {x: x, y: y} = center, steps = findBoundaryAngles(startAngle, endAngle), {width: width, height: height} = rect, radiusList = [];
|
|
81
146
|
return steps.forEach((step => {
|
|
@@ -89,8 +154,9 @@ function computeQuadrant(angle) {
|
|
|
89
154
|
return (angle = normalizeAngle(angle)) > 0 && angle <= Math.PI / 2 ? 2 : angle > Math.PI / 2 && angle <= Math.PI ? 3 : angle > Math.PI && angle <= 3 * Math.PI / 2 ? 4 : 1;
|
|
90
155
|
}
|
|
91
156
|
|
|
92
|
-
exports.clampDegree = clampDegree,
|
|
93
|
-
|
|
94
|
-
exports.
|
|
95
|
-
exports.
|
|
96
|
-
exports.
|
|
157
|
+
exports.clampDegree = clampDegree,
|
|
158
|
+
// alias of clampDegree
|
|
159
|
+
exports.clampAngleByDegree = exports.clampDegree, exports.polarToCartesian = polarToCartesian,
|
|
160
|
+
exports.cartesianToPolar = cartesianToPolar, exports.getAngleByPoint = getAngleByPoint,
|
|
161
|
+
exports.normalizeAngle = normalizeAngle, exports.findBoundaryAngles = findBoundaryAngles,
|
|
162
|
+
exports.calculateMaxRadius = calculateMaxRadius, exports.computeQuadrant = computeQuadrant;
|
package/cjs/angle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/angle.ts"],"names":[],"mappings":"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","file":"angle.js","sourcesContent":["import type { IPointLike } from './data-structure/point';\n/**\n * 处理角度相关的数据计算\n */\n\nimport { tau } from './math';\n\n/**\n * degree -> radian\n * @param degree\n * @returns radian\n */\nexport function degreeToRadian(degree: number) {\n return degree * (Math.PI / 180);\n}\n\n/**\n * radian -> degree\n * @param radian\n * @returns\n */\nexport function radianToDegree(radian: number) {\n return (radian * 180) / Math.PI;\n}\n\n/**\n * 对弧度进行格式化\n * @param a 传入的弧度\n * @returns\n */\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < -tau) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n\n return angle;\n};\n\n// alias of clampRadian\nexport const clampAngleByRadian = clampRadian;\n\n/**\n * 对角度进行格式化\n * @param a 角度\n * @returns\n */\nexport const clampDegree = (a: number = 0) => {\n if (a > 360 || a < -360) {\n return a % 360;\n }\n\n return a;\n};\n\n// alias of clampDegree\nexport const clampAngleByDegree = clampDegree;\n\n/**\n * 根据弧度及半径计算极坐标系下的坐标点\n * @param centerX 圆心坐标\n * @param radius 半径\n * @param angleInRadian 弧度\n * @returns 返回笛卡尔坐标点\n */\nexport function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): { x: number; y: number } {\n if (!radius) {\n return { x: center.x, y: center.y };\n }\n\n return {\n x: center.x + radius * Math.cos(angleInRadian),\n y: center.y + radius * Math.sin(angleInRadian)\n };\n}\n\n/**\n * 根据笛卡尔坐标系坐标计算极坐标坐标点\n * @param point\n * @param center 极坐标系中心点坐标\n * @param startAngle 极坐标系起始角度\n * @param endAngle 极坐标系结束角度\n * @returns 极坐标系坐标点\n */\nexport function cartesianToPolar(\n point: IPointLike,\n center: IPointLike = { x: 0, y: 0 },\n startAngle = 0,\n endAngle = 2 * Math.PI\n) {\n const { x, y } = point;\n const { x: centerX, y: centerY } = center;\n\n let dx = x - centerX;\n let dy = y - centerY;\n const radius = Math.sqrt(dx * dx + dy * dy);\n\n if (radius === 0) {\n return {\n radius: 0,\n angle: 0\n };\n }\n\n dx /= radius;\n dy /= radius;\n\n let radian = Math.atan2(dy, dx);\n if (radian < startAngle) {\n while (radian <= startAngle) {\n radian += Math.PI * 2;\n }\n }\n if (radian > endAngle) {\n while (radian >= endAngle) {\n radian -= Math.PI * 2;\n }\n }\n return {\n radius,\n angle: radian\n };\n}\n\n/**\n * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角\n * @param center 圆心坐标\n * @param point 待求的点坐标\n * @returns 返回夹角对应的弧度值\n */\nexport function getAngleByPoint(center: IPointLike, point: IPointLike): number {\n return Math.atan2(point.y - center.y, point.x - center.x);\n}\n\n/**\n * 角度标准化处理\n * @param angle 弧度角\n */\nexport function normalizeAngle(angle: number): number {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n while (angle >= Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n}\n\n/**\n * 指定开始角度和结束角度,计算这个范围内的边界角度,\n * 即起始角度以及经过的东、南、西、北四个方向的角度\n * 计算这个角度,可以用于计算一个弧度的bounding box 等\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 边界角度数组\n */\nexport function findBoundaryAngles(startAngle: number, endAngle: number) {\n const deltaAngle = Math.abs(endAngle - startAngle);\n\n if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) {\n return [0, Math.PI / 2, Math.PI, 1.5 * Math.PI];\n }\n const min = Math.min(startAngle, endAngle);\n const normalMin = normalizeAngle(min);\n const normalMax = normalMin + deltaAngle;\n const steps = [normalMin, normalMax];\n let directionAngle = (Math.floor(normalMin / Math.PI) * Math.PI) / 2;\n\n while (directionAngle < normalMax) {\n if (directionAngle > normalMin) {\n steps.push(directionAngle);\n }\n directionAngle += Math.PI / 2;\n }\n\n return steps;\n}\n/**\n * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径\n * @param rect 矩形的大小\n * @param center 中心点\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 最大半径\n */\nexport function calculateMaxRadius(\n rect: { width: number; height: number },\n center: { x: number; y: number },\n startAngle: number,\n endAngle: number\n) {\n const { x, y } = center;\n const steps = findBoundaryAngles(startAngle, endAngle);\n const { width, height } = rect;\n\n const radiusList: number[] = [];\n\n steps.forEach(step => {\n const sin = Math.sin(step);\n const cos = Math.cos(step);\n\n if (sin === 1) {\n radiusList.push(height - y);\n } else if (sin === -1) {\n radiusList.push(y);\n } else if (cos === 1) {\n radiusList.push(width - x);\n } else if (cos === -1) {\n radiusList.push(x);\n } else {\n if (sin > 0) {\n radiusList.push(Math.abs((height - y) / sin));\n } else {\n radiusList.push(Math.abs(y / sin));\n }\n\n if (cos > 0) {\n radiusList.push(Math.abs((width - x) / cos));\n } else {\n radiusList.push(Math.abs(x / cos));\n }\n }\n });\n\n return Math.min.apply(null, radiusList);\n}\n\nexport type Quadrant = 1 | 2 | 3 | 4;\n\nexport function computeQuadrant(angle: number): Quadrant {\n angle = normalizeAngle(angle);\n if (angle > 0 && angle <= Math.PI / 2) {\n return 2;\n } else if (angle > Math.PI / 2 && angle <= Math.PI) {\n return 3;\n } else if (angle > Math.PI && angle <= (3 * Math.PI) / 2) {\n return 4;\n }\n return 1;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/angle.ts"],"names":[],"mappings":"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","file":"angle.js","sourcesContent":["import type { IPointLike } from './data-structure/point';\n/**\n * 处理角度相关的数据计算\n */\n\nimport { tau } from './math';\n\n/**\n * degree -> radian\n * @param degree\n * @returns radian\n */\nexport function degreeToRadian(degree: number) {\n return degree * (Math.PI / 180);\n}\n\n/**\n * radian -> degree\n * @param radian\n * @returns\n */\nexport function radianToDegree(radian: number) {\n return (radian * 180) / Math.PI;\n}\n\n/**\n * 对弧度进行格式化\n * @param a 传入的弧度\n * @returns\n */\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < -tau) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n\n return angle;\n};\n\n// alias of clampRadian\nexport const clampAngleByRadian = clampRadian;\n\n/**\n * 对角度进行格式化\n * @param a 角度\n * @returns\n */\nexport const clampDegree = (a: number = 0) => {\n if (a > 360 || a < -360) {\n return a % 360;\n }\n\n return a;\n};\n\n// alias of clampDegree\nexport const clampAngleByDegree = clampDegree;\n\n/**\n * 根据弧度及半径计算极坐标系下的坐标点\n * @param centerX 圆心坐标\n * @param radius 半径\n * @param angleInRadian 弧度\n * @returns 返回笛卡尔坐标点\n */\nexport function polarToCartesian(center: IPointLike, radius: number, angleInRadian: number): { x: number; y: number } {\n if (!radius) {\n return { x: center.x, y: center.y };\n }\n\n return {\n x: center.x + radius * Math.cos(angleInRadian),\n y: center.y + radius * Math.sin(angleInRadian)\n };\n}\n\n/**\n * 根据笛卡尔坐标系坐标计算极坐标坐标点\n * @param point\n * @param center 极坐标系中心点坐标\n * @param startAngle 极坐标系起始角度\n * @param endAngle 极坐标系结束角度\n * @returns 极坐标系坐标点\n */\nexport function cartesianToPolar(\n point: IPointLike,\n center: IPointLike = { x: 0, y: 0 },\n startAngle = 0,\n endAngle = 2 * Math.PI\n) {\n const { x, y } = point;\n const { x: centerX, y: centerY } = center;\n\n let dx = x - centerX;\n let dy = y - centerY;\n const radius = Math.sqrt(dx * dx + dy * dy);\n\n if (radius === 0) {\n return {\n radius: 0,\n angle: 0\n };\n }\n\n dx /= radius;\n dy /= radius;\n\n let radian = Math.atan2(dy, dx);\n if (radian < startAngle) {\n while (radian <= startAngle) {\n radian += Math.PI * 2;\n }\n }\n if (radian > endAngle) {\n while (radian >= endAngle) {\n radian -= Math.PI * 2;\n }\n }\n return {\n radius,\n angle: radian\n };\n}\n\n/**\n * 根据点的笛卡尔坐标获取该点与圆心的连线同正 x 轴方向的夹角\n * @param center 圆心坐标\n * @param point 待求的点坐标\n * @returns 返回夹角对应的弧度值\n */\nexport function getAngleByPoint(center: IPointLike, point: IPointLike): number {\n return Math.atan2(point.y - center.y, point.x - center.x);\n}\n\n/**\n * 角度标准化处理\n * @param angle 弧度角\n */\nexport function normalizeAngle(angle: number): number {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n while (angle >= Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n}\n\n/**\n * 指定开始角度和结束角度,计算这个范围内的边界角度,\n * 即起始角度以及经过的东、南、西、北四个方向的角度\n * 计算这个角度,可以用于计算一个弧度的bounding box 等\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 边界角度数组\n */\nexport function findBoundaryAngles(startAngle: number, endAngle: number) {\n const deltaAngle = Math.abs(endAngle - startAngle);\n\n if (deltaAngle >= 2 * Math.PI || 2 * Math.PI - deltaAngle < 1e-6) {\n return [0, Math.PI / 2, Math.PI, 1.5 * Math.PI];\n }\n const min = Math.min(startAngle, endAngle);\n const normalMin = normalizeAngle(min);\n const normalMax = normalMin + deltaAngle;\n const steps = [normalMin, normalMax];\n let directionAngle = (Math.floor(normalMin / Math.PI) * Math.PI) / 2;\n\n while (directionAngle < normalMax) {\n if (directionAngle > normalMin) {\n steps.push(directionAngle);\n }\n directionAngle += Math.PI / 2;\n }\n\n return steps;\n}\n/**\n * 计算指定范围内,指定中心的情况下,不超出边界的最大可用半径\n * @param rect 矩形的大小\n * @param center 中心点\n * @param startAngle 起始角度的弧度值\n * @param endAngle 结束角度的弧度值\n * @returns 最大半径\n */\nexport function calculateMaxRadius(\n rect: { width: number; height: number },\n center: { x: number; y: number },\n startAngle: number,\n endAngle: number\n) {\n const { x, y } = center;\n const steps = findBoundaryAngles(startAngle, endAngle);\n const { width, height } = rect;\n\n const radiusList: number[] = [];\n\n steps.forEach(step => {\n const sin = Math.sin(step);\n const cos = Math.cos(step);\n\n if (sin === 1) {\n radiusList.push(height - y);\n } else if (sin === -1) {\n radiusList.push(y);\n } else if (cos === 1) {\n radiusList.push(width - x);\n } else if (cos === -1) {\n radiusList.push(x);\n } else {\n if (sin > 0) {\n radiusList.push(Math.abs((height - y) / sin));\n } else {\n radiusList.push(Math.abs(y / sin));\n }\n\n if (cos > 0) {\n radiusList.push(Math.abs((width - x) / cos));\n } else {\n radiusList.push(Math.abs(x / cos));\n }\n }\n });\n\n return Math.min.apply(null, radiusList);\n}\n\nexport type Quadrant = 1 | 2 | 3 | 4;\n\nexport function computeQuadrant(angle: number): Quadrant {\n angle = normalizeAngle(angle);\n if (angle > 0 && angle <= Math.PI / 2) {\n return 2;\n } else if (angle > Math.PI / 2 && angle <= Math.PI) {\n return 3;\n } else if (angle > Math.PI && angle <= (3 * Math.PI) / 2) {\n return 4;\n }\n return 1;\n}\n"]}
|
package/cjs/color/Color.d.ts
CHANGED
|
@@ -174,6 +174,9 @@ export declare class Color {
|
|
|
174
174
|
getLuminance(): number;
|
|
175
175
|
getLuminance2(): number;
|
|
176
176
|
getLuminance3(): number;
|
|
177
|
+
/**
|
|
178
|
+
* https://www.w3.org/TR/WCAG21/#use-of-color
|
|
179
|
+
*/
|
|
177
180
|
getLuminanceWCAG(): number;
|
|
178
181
|
clone(): Color;
|
|
179
182
|
copyGammaToLinear(color: Color, gammaFactor?: number): this;
|
package/cjs/color/Color.js
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/*
|
|
4
|
+
Copyright (c) 2013, Jason Davies.
|
|
5
|
+
All rights reserved.
|
|
6
|
+
|
|
7
|
+
Redistribution and use in source and binary forms, with or without
|
|
8
|
+
modification, are permitted provided that the following conditions are met:
|
|
9
|
+
|
|
10
|
+
* Redistributions of source code must retain the above copyright notice, this
|
|
11
|
+
list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
14
|
+
this list of conditions and the following disclaimer in the documentation
|
|
15
|
+
and/or other materials provided with the distribution.
|
|
16
|
+
|
|
17
|
+
* The name Jason Davies may not be used to endorse or promote products
|
|
18
|
+
derived from this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
21
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
22
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
24
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
26
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
27
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
28
|
+
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
29
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
*/ var __importDefault = this && this.__importDefault || function(mod) {
|
|
4
31
|
return mod && mod.__esModule ? mod : {
|
|
5
32
|
default: mod
|
|
6
33
|
};
|
|
@@ -10,6 +37,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
10
37
|
value: !0
|
|
11
38
|
}), exports.RGB = exports.Color = exports.DEFAULT_COLORS = void 0;
|
|
12
39
|
|
|
40
|
+
// Mike Bostock, https://github.com/d3/d3-color
|
|
41
|
+
/**
|
|
42
|
+
* 参考 d3-color 实现。用于颜色转化
|
|
43
|
+
* 16进制/rgb 转化为r,g,b, o
|
|
44
|
+
*/
|
|
13
45
|
const common_1 = require("../common"), hslToRgb_1 = __importDefault(require("./hslToRgb")), rgbToHsl_1 = __importDefault(require("./rgbToHsl")), REG_HEX = /^#([0-9a-f]{3,8})$/, DEFAULT_COLORS_OPACITY = {
|
|
14
46
|
transparent: 4294967040
|
|
15
47
|
};
|
|
@@ -21,11 +53,13 @@ function hex(value) {
|
|
|
21
53
|
function rgb(value) {
|
|
22
54
|
return (0, common_1.isNumber)(value) ? new RGB(value >> 16, value >> 8 & 255, 255 & value, 1) : (0,
|
|
23
55
|
common_1.isArray)(value) ? new RGB(value[0], value[1], value[2]) : new RGB(255, 255, 255);
|
|
56
|
+
// default return
|
|
24
57
|
}
|
|
25
58
|
|
|
26
59
|
function rgba(value) {
|
|
27
60
|
return (0, common_1.isNumber)(value) ? new RGB(value >>> 24, value >>> 16 & 255, value >>> 8 & 255, 255 & value) : (0,
|
|
28
61
|
common_1.isArray)(value) ? new RGB(value[0], value[1], value[2], value[3]) : new RGB(255, 255, 255, 1);
|
|
62
|
+
// default return
|
|
29
63
|
}
|
|
30
64
|
|
|
31
65
|
function SRGBToLinear(c) {
|
|
@@ -191,7 +225,10 @@ const setHex = (formatValue, forceHex) => {
|
|
|
191
225
|
const isHex = REG_HEX.exec(formatValue);
|
|
192
226
|
if (forceHex || isHex) {
|
|
193
227
|
const hex = parseInt(isHex[1], 16), hexLength = isHex[1].length;
|
|
194
|
-
|
|
228
|
+
// #fff
|
|
229
|
+
return 3 === hexLength ? new RGB((hex >> 8 & 15) + ((hex >> 8 & 15) << 4), (hex >> 4 & 15) + ((hex >> 4 & 15) << 4), (15 & hex) + ((15 & hex) << 4), 1) :
|
|
230
|
+
// #ffffff
|
|
231
|
+
6 === hexLength ? rgb(hex) : 8 === hexLength ? new RGB(hex >> 24 & 255, hex >> 16 & 255, hex >> 8 & 255, (255 & hex) / 255) : null;
|
|
195
232
|
}
|
|
196
233
|
};
|
|
197
234
|
|
|
@@ -226,15 +263,20 @@ class Color {
|
|
|
226
263
|
}
|
|
227
264
|
}
|
|
228
265
|
static parseColorString(value) {
|
|
266
|
+
// case0: transparent
|
|
229
267
|
if ((0, common_1.isValid)(DEFAULT_COLORS_OPACITY[value])) return rgba(DEFAULT_COLORS_OPACITY[value]);
|
|
230
|
-
|
|
268
|
+
// case1: 简写 ['blue','red']
|
|
269
|
+
if ((0, common_1.isValid)(exports.DEFAULT_COLORS[value])) return rgb(exports.DEFAULT_COLORS[value]);
|
|
231
270
|
const formatValue = `${value}`.trim().toLowerCase(), hexRes = setHex(formatValue);
|
|
232
|
-
|
|
233
|
-
|
|
271
|
+
// case2: 16进制
|
|
272
|
+
if (void 0 !== hexRes) return hexRes;
|
|
273
|
+
// case3 : rgb
|
|
274
|
+
if (/^(rgb|RGB|rgba|RGBA)/.test(formatValue)) {
|
|
234
275
|
const aColor = formatValue.replace(/(?:\(|\)|rgba|RGBA|rgb|RGB)*/g, "").split(",");
|
|
235
276
|
return new RGB(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10), parseFloat(aColor[3]));
|
|
236
277
|
}
|
|
237
|
-
|
|
278
|
+
// case4: hsl
|
|
279
|
+
if (/^(hsl|HSL|hsla|HSLA)/.test(formatValue)) {
|
|
238
280
|
const aColor = formatValue.replace(/(?:\(|\)|hsla|HSLA|hsl|HSL)*/g, "").split(","), rgb = (0,
|
|
239
281
|
hslToRgb_1.default)(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10));
|
|
240
282
|
return new RGB(rgb.r, rgb.g, rgb.b, parseFloat(aColor[3]));
|
|
@@ -242,7 +284,10 @@ class Color {
|
|
|
242
284
|
}
|
|
243
285
|
constructor(value) {
|
|
244
286
|
const color = Color.parseColorString(value);
|
|
245
|
-
|
|
287
|
+
// case0: transparent
|
|
288
|
+
color ? this.color = color : (
|
|
289
|
+
// default: 白色
|
|
290
|
+
console.warn(`Warn: 传入${value}无法解析为Color`), this.color = new RGB(255, 255, 255));
|
|
246
291
|
}
|
|
247
292
|
toRGBA() {
|
|
248
293
|
return this.color.formatRgb();
|
|
@@ -276,6 +321,7 @@ class Color {
|
|
|
276
321
|
this.color.g = Math.max(0, Math.min(255, Math.floor(g * color.color.g))), this.color.b = Math.max(0, Math.min(255, Math.floor(b * color.color.b))),
|
|
277
322
|
this;
|
|
278
323
|
}
|
|
324
|
+
// todo: 这里亮度计算都没考虑alpha通道
|
|
279
325
|
getHSVBrightness() {
|
|
280
326
|
return Math.max(this.color.r, this.color.g, this.color.b) / 255;
|
|
281
327
|
}
|
|
@@ -297,9 +343,13 @@ class Color {
|
|
|
297
343
|
return null != res ? res : this;
|
|
298
344
|
}
|
|
299
345
|
setColorName(name) {
|
|
346
|
+
// color keywords
|
|
300
347
|
const hex = exports.DEFAULT_COLORS[name.toLowerCase()];
|
|
301
|
-
return void 0 !== hex ?
|
|
302
|
-
|
|
348
|
+
return void 0 !== hex ?
|
|
349
|
+
// red
|
|
350
|
+
this.setHex(hex) :
|
|
351
|
+
// unknown color
|
|
352
|
+
console.warn("THREE.Color: Unknown color " + name), this;
|
|
303
353
|
}
|
|
304
354
|
setScalar(scalar) {
|
|
305
355
|
return this.color.r = scalar, this.color.g = scalar, this.color.b = scalar, this;
|
|
@@ -316,7 +366,9 @@ class Color {
|
|
|
316
366
|
getLuminance3() {
|
|
317
367
|
return (.299 * this.color.r + .587 * this.color.g + .114 * this.color.b) / 255;
|
|
318
368
|
}
|
|
319
|
-
|
|
369
|
+
/**
|
|
370
|
+
* https://www.w3.org/TR/WCAG21/#use-of-color
|
|
371
|
+
*/ getLuminanceWCAG() {
|
|
320
372
|
const RsRGB = this.color.r / 255, GsRGB = this.color.g / 255, BsRGB = this.color.b / 255;
|
|
321
373
|
let R, G, B;
|
|
322
374
|
R = RsRGB <= .03928 ? RsRGB / 12.92 : Math.pow((RsRGB + .055) / 1.055, 2.4), G = GsRGB <= .03928 ? GsRGB / 12.92 : Math.pow((GsRGB + .055) / 1.055, 2.4),
|
|
@@ -364,6 +416,7 @@ class RGB {
|
|
|
364
416
|
this.r = isNaN(+r) ? 255 : Math.max(0, Math.min(255, +r)), this.g = isNaN(+g) ? 255 : Math.max(0, Math.min(255, +g)),
|
|
365
417
|
this.b = isNaN(+b) ? 255 : Math.max(0, Math.min(255, +b)), (0, common_1.isValid)(opacity) ? this.opacity = isNaN(+opacity) ? 1 : Math.max(0, Math.min(1, +opacity)) : this.opacity = 1;
|
|
366
418
|
}
|
|
419
|
+
// 转为16进制
|
|
367
420
|
formatHex() {
|
|
368
421
|
return `#${hex(this.r) + hex(this.g) + hex(this.b) + (1 === this.opacity ? "" : hex(255 * this.opacity))}`;
|
|
369
422
|
}
|
|
@@ -375,6 +428,7 @@ class RGB {
|
|
|
375
428
|
const opacity = this.opacity, {h: h, s: s, l: l} = (0, rgbToHsl_1.default)(this.r, this.g, this.b);
|
|
376
429
|
return `${1 === opacity ? "hsl(" : "hsla("}${h},${s}%,${l}%${1 === opacity ? ")" : `,${opacity})`}`;
|
|
377
430
|
}
|
|
431
|
+
// 转为16进制
|
|
378
432
|
toString() {
|
|
379
433
|
return this.formatHex();
|
|
380
434
|
}
|