mirror of
https://github.com/VisActor/VChart
synced 2024-11-21 23:51:05 +00:00
fix: fix sampling of flush axis
This commit is contained in:
parent
73fbca1c0d
commit
e3166136d1
@ -1,7 +1,7 @@
|
|||||||
import type { IBaseScale } from '@visactor/vscale';
|
import type { IBaseScale } from '@visactor/vscale';
|
||||||
import type { IBoundsLike } from '@visactor/vutils';
|
import type { IBoundsLike } from '@visactor/vutils';
|
||||||
// eslint-disable-next-line no-duplicate-imports
|
// eslint-disable-next-line no-duplicate-imports
|
||||||
import { AABBBounds, degreeToRadian, maxInArray, minInArray } from '@visactor/vutils';
|
import { AABBBounds, degreeToRadian } from '@visactor/vutils';
|
||||||
import type { IGraphic, TextAlignType, TextBaselineType } from '@visactor/vrender-core';
|
import type { IGraphic, TextAlignType, TextBaselineType } from '@visactor/vrender-core';
|
||||||
import { initTextMeasure } from '../../utils/text';
|
import { initTextMeasure } from '../../utils/text';
|
||||||
import type { ICartesianTickDataOpt, IOrientType, IPolarTickDataOpt, ITickData } from './interface';
|
import type { ICartesianTickDataOpt, IOrientType, IPolarTickDataOpt, ITickData } from './interface';
|
||||||
@ -63,6 +63,12 @@ export function hasOverlap<T>(items: ILabelItem<T>[], pad: number): boolean {
|
|||||||
|
|
||||||
export const MIN_TICK_GAP = 12;
|
export const MIN_TICK_GAP = 12;
|
||||||
|
|
||||||
|
const calculateFlushPos = (basePosition: number, size: number, rangePosition: number) => {
|
||||||
|
return rangePosition <= basePosition
|
||||||
|
? Math.max(basePosition - size / 2, rangePosition)
|
||||||
|
: Math.min(basePosition - size / 2, rangePosition - size);
|
||||||
|
};
|
||||||
|
|
||||||
export const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt): AABBBounds[] => {
|
export const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt): AABBBounds[] => {
|
||||||
const { labelStyle, axisOrientType, labelFlush, labelFormatter, startAngle = 0 } = op;
|
const { labelStyle, axisOrientType, labelFlush, labelFormatter, startAngle = 0 } = op;
|
||||||
let labelAngle = labelStyle.angle ?? 0;
|
let labelAngle = labelStyle.angle ?? 0;
|
||||||
@ -85,8 +91,6 @@ export const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: IC
|
|||||||
|
|
||||||
const textMeasure = initTextMeasure(labelStyle);
|
const textMeasure = initTextMeasure(labelStyle);
|
||||||
const range = scale.range();
|
const range = scale.range();
|
||||||
const rangeMin = minInArray<number>(range);
|
|
||||||
const rangeMax = maxInArray<number>(range);
|
|
||||||
const labelBoundsList = domain.map((v: any, i: number) => {
|
const labelBoundsList = domain.map((v: any, i: number) => {
|
||||||
const str = labelFormatter ? labelFormatter(v) : `${v}`;
|
const str = labelFormatter ? labelFormatter(v) : `${v}`;
|
||||||
|
|
||||||
@ -104,9 +108,9 @@ export const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: IC
|
|||||||
|
|
||||||
let align: TextAlignType;
|
let align: TextAlignType;
|
||||||
if (labelFlush && isHorizontal && i === 0) {
|
if (labelFlush && isHorizontal && i === 0) {
|
||||||
textX = rangeMin;
|
textX = calculateFlushPos(baseTextX, textWidth, range[0]);
|
||||||
} else if (labelFlush && isHorizontal && i === domain.length - 1) {
|
} else if (labelFlush && isHorizontal && i === domain.length - 1) {
|
||||||
textX = Math.max(baseTextX - textWidth / 2, rangeMax - textWidth);
|
textX = calculateFlushPos(baseTextX, textWidth, range[range.length - 1]);
|
||||||
} else {
|
} else {
|
||||||
align = labelStyle.textAlign ?? 'center';
|
align = labelStyle.textAlign ?? 'center';
|
||||||
}
|
}
|
||||||
@ -118,9 +122,9 @@ export const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: IC
|
|||||||
|
|
||||||
let baseline: TextBaselineType;
|
let baseline: TextBaselineType;
|
||||||
if (labelFlush && isVertical && i === 0) {
|
if (labelFlush && isVertical && i === 0) {
|
||||||
textY = rangeMin;
|
textY = calculateFlushPos(baseTextY, textHeight, range[0]);
|
||||||
} else if (labelFlush && isVertical && i === domain.length - 1) {
|
} else if (labelFlush && isVertical && i === domain.length - 1) {
|
||||||
textY = Math.max(baseTextY - textHeight / 2, rangeMax - textHeight);
|
textY = calculateFlushPos(baseTextY, textHeight, range[range.length - 1]);
|
||||||
} else {
|
} else {
|
||||||
baseline = labelStyle.textBaseline ?? 'middle';
|
baseline = labelStyle.textBaseline ?? 'middle';
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user