axis.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. export type FixedAxis = { min: number; max: number; interval: number }
  2. export function niceTickInterval(range: number, targetTicks: number): number {
  3. if (!Number.isFinite(range) || range <= 0) return 1
  4. const raw = range / targetTicks
  5. const magnitude = 10 ** Math.floor(Math.log10(raw))
  6. const fraction = raw / magnitude
  7. const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10
  8. return niceFraction * magnitude
  9. }
  10. export function fixedAxisRange(
  11. type: string,
  12. dataMin: number | undefined,
  13. dataMax: number | undefined,
  14. ): FixedAxis | null {
  15. if (dataMin == null || dataMax == null || !Number.isFinite(dataMin) || !Number.isFinite(dataMax)) return null
  16. let range = dataMax - dataMin
  17. if (range <= 0) range = Math.max(Math.abs(dataMax) * 0.1, 1e-9)
  18. const pad = range * 0.1
  19. let min = dataMin - pad
  20. let max = dataMax + pad
  21. if (type === '位移') {
  22. const interval = niceTickInterval(max - min, 6)
  23. min = Math.floor(min / interval) * interval
  24. max = Math.ceil(max / interval) * interval
  25. return { min, max, interval }
  26. }
  27. const raw = (max - min) / 6
  28. const interval = type === '压力'
  29. ? Math.max(1, niceTickInterval(Math.max(raw, 1), 1))
  30. : niceTickInterval(max - min, 6)
  31. min = Math.floor(min / interval) * interval
  32. max = Math.ceil(max / interval) * interval
  33. return { min, max, interval }
  34. }