export type FixedAxis = { min: number; max: number; interval: number } export function niceTickInterval(range: number, targetTicks: number): number { if (!Number.isFinite(range) || range <= 0) return 1 const raw = range / targetTicks const magnitude = 10 ** Math.floor(Math.log10(raw)) const fraction = raw / magnitude const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10 return niceFraction * magnitude } export function fixedAxisRange( type: string, dataMin: number | undefined, dataMax: number | undefined, ): FixedAxis | null { if (dataMin == null || dataMax == null || !Number.isFinite(dataMin) || !Number.isFinite(dataMax)) return null let range = dataMax - dataMin if (range <= 0) range = Math.max(Math.abs(dataMax) * 0.1, 1e-9) const pad = range * 0.1 let min = dataMin - pad let max = dataMax + pad if (type === '位移') { const interval = niceTickInterval(max - min, 6) min = Math.floor(min / interval) * interval max = Math.ceil(max / interval) * interval return { min, max, interval } } const raw = (max - min) / 6 const interval = type === '压力' ? Math.max(1, niceTickInterval(Math.max(raw, 1), 1)) : niceTickInterval(max - min, 6) min = Math.floor(min / interval) * interval max = Math.ceil(max / interval) * interval return { min, max, interval } }