From b52950edbc3b0181e52988b1c181c5555a51a77e Mon Sep 17 00:00:00 2001 From: skie1997 Date: Wed, 14 Aug 2024 03:42:20 +0800 Subject: [PATCH 1/3] fix: gange angle compute limit error --- packages/vchart/src/series/gauge/gauge.ts | 11 +++++++++-- packages/vchart/src/util/math.ts | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/vchart/src/series/gauge/gauge.ts b/packages/vchart/src/series/gauge/gauge.ts index 5effa1a1d8..0397e5629d 100644 --- a/packages/vchart/src/series/gauge/gauge.ts +++ b/packages/vchart/src/series/gauge/gauge.ts @@ -16,6 +16,7 @@ import type { IMark } from '../../mark/interface'; import { GaugeSeriesSpecTransformer } from './gauge-transformer'; import { registerArcMark, type IArcMark } from '../../mark/arc'; import { registerPolarLinearAxis } from '../../component/axis/polar'; +import { valueInRange } from '../../util'; export class GaugeSeries extends ProgressLikeSeries { static readonly type: string = SeriesTypeEnum.gauge; @@ -133,13 +134,19 @@ export class GaugeSeries extends protected _getAngleValueStartWithoutMask(datum: Datum) { const startAngle = this._getAngleValueStartWithoutPadAngle(datum); const endAngle = this._getAngleValueEndWithoutPadAngle(datum); - return Math.min(startAngle + this._padAngle / 2, (startAngle + endAngle) / 2); + return valueInRange(startAngle + (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2), [ + startAngle, + (startAngle + endAngle) / 2 + ]); } protected _getAngleValueEndWithoutMask(datum: Datum) { const startAngle = this._getAngleValueStartWithoutPadAngle(datum); const endAngle = this._getAngleValueEndWithoutPadAngle(datum); - return Math.max(endAngle - this._padAngle / 2, (startAngle + endAngle) / 2); + return valueInRange(endAngle - (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2), [ + endAngle, + (startAngle + endAngle) / 2 + ]); } protected _getAngleValueStartWithoutPadAngle(datum: Datum) { diff --git a/packages/vchart/src/util/math.ts b/packages/vchart/src/util/math.ts index 56fa6ae439..dd706559f2 100644 --- a/packages/vchart/src/util/math.ts +++ b/packages/vchart/src/util/math.ts @@ -278,3 +278,12 @@ export function getPercentValue(valueList: number[], precision = 2) { return seats.map(entry => entry / digits); } + +export function valueInRange(v: number, range?: number[]) { + if (!range) { + return v; + } + const min = Math.min(range[0], range[range.length - 1]); + const max = Math.max(range[0], range[range.length - 1]); + return Math.min(Math.max(min, v), max); +} From 0122a8e8ba6fcc50630278314353fb5f5ca3de5c Mon Sep 17 00:00:00 2001 From: skie1997 Date: Wed, 14 Aug 2024 03:43:21 +0800 Subject: [PATCH 2/3] chore: rush change log --- .../vchart/fix-gauge-angle_2024-08-13-19-43.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@visactor/vchart/fix-gauge-angle_2024-08-13-19-43.json diff --git a/common/changes/@visactor/vchart/fix-gauge-angle_2024-08-13-19-43.json b/common/changes/@visactor/vchart/fix-gauge-angle_2024-08-13-19-43.json new file mode 100644 index 0000000000..8a3e05efcd --- /dev/null +++ b/common/changes/@visactor/vchart/fix-gauge-angle_2024-08-13-19-43.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vchart", + "comment": " git push --set-upstream origin fix/gauge-angle", + "type": "none" + } + ], + "packageName": "@visactor/vchart" +} \ No newline at end of file From 8d856236e25c608ffab03dbc8567c2de15782cf7 Mon Sep 17 00:00:00 2001 From: skie1997 Date: Wed, 14 Aug 2024 15:01:58 +0800 Subject: [PATCH 3/3] fix: use vutil clamp to replace valueInrange method --- packages/vchart/src/series/gauge/gauge.ts | 11 +++++------ packages/vchart/src/util/math.ts | 9 --------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/packages/vchart/src/series/gauge/gauge.ts b/packages/vchart/src/series/gauge/gauge.ts index 0397e5629d..6791db5630 100644 --- a/packages/vchart/src/series/gauge/gauge.ts +++ b/packages/vchart/src/series/gauge/gauge.ts @@ -9,14 +9,13 @@ import type { Datum } from '@visactor/vgrammar-core'; import type { IStateAnimateSpec } from '../../animation/spec'; import { animationConfig, userAnimationConfig } from '../../animation/utils'; import { gaugeSeriesMark } from './constant'; -import { degreeToRadian, isValid } from '@visactor/vutils'; +import { clamper, degreeToRadian, isValid } from '@visactor/vutils'; import { Factory } from '../../core/factory'; import { registerProgressLikeAnimation } from '../polar/progress-like'; import type { IMark } from '../../mark/interface'; import { GaugeSeriesSpecTransformer } from './gauge-transformer'; import { registerArcMark, type IArcMark } from '../../mark/arc'; import { registerPolarLinearAxis } from '../../component/axis/polar'; -import { valueInRange } from '../../util'; export class GaugeSeries extends ProgressLikeSeries { static readonly type: string = SeriesTypeEnum.gauge; @@ -134,19 +133,19 @@ export class GaugeSeries extends protected _getAngleValueStartWithoutMask(datum: Datum) { const startAngle = this._getAngleValueStartWithoutPadAngle(datum); const endAngle = this._getAngleValueEndWithoutPadAngle(datum); - return valueInRange(startAngle + (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2), [ + return clamper( startAngle, (startAngle + endAngle) / 2 - ]); + )(startAngle + (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2)); } protected _getAngleValueEndWithoutMask(datum: Datum) { const startAngle = this._getAngleValueStartWithoutPadAngle(datum); const endAngle = this._getAngleValueEndWithoutPadAngle(datum); - return valueInRange(endAngle - (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2), [ + return clamper( endAngle, (startAngle + endAngle) / 2 - ]); + )(endAngle - (endAngle > startAngle ? 1 : -1) * Math.abs(this._padAngle / 2)); } protected _getAngleValueStartWithoutPadAngle(datum: Datum) { diff --git a/packages/vchart/src/util/math.ts b/packages/vchart/src/util/math.ts index dd706559f2..56fa6ae439 100644 --- a/packages/vchart/src/util/math.ts +++ b/packages/vchart/src/util/math.ts @@ -278,12 +278,3 @@ export function getPercentValue(valueList: number[], precision = 2) { return seats.map(entry => entry / digits); } - -export function valueInRange(v: number, range?: number[]) { - if (!range) { - return v; - } - const min = Math.min(range[0], range[range.length - 1]); - const max = Math.max(range[0], range[range.length - 1]); - return Math.min(Math.max(min, v), max); -}