| 123456789101112131415161718192021222324252627282930313233343536 |
- 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 }
- }
|