Files
waveform-analysis/src/components/core/useWaveformData.ts

63 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-07-20 10:21:30 +08:00
import { shallowRef, watch } from 'vue'
import { normalizeWaveformSeries, resolveWaveformPointErrors } from '../../core'
import type {
ResolvedWaveformErrorBarOptions,
WaveformData,
WaveformLineType,
WaveformPoint,
WaveformPointType,
} from '../../types'
2026-07-20 10:21:30 +08:00
import { paddedDomain } from '../../utils'
export interface PreparedWaveformSeries {
id: string
trackId?: string
2026-07-20 10:21:30 +08:00
name: string
unit?: string
color?: string
lineType: WaveformLineType
pointType: WaveformPointType
errorBar: ResolvedWaveformErrorBarOptions
2026-07-20 10:21:30 +08:00
points: WaveformPoint[]
xDomain: [number, number]
yDomain: [number, number]
}
function pointDomain(
points: WaveformPoint[],
key: 'x' | 'y',
includeErrors = false,
): [number, number] {
2026-07-20 10:21:30 +08:00
let minimum = Number.POSITIVE_INFINITY
let maximum = Number.NEGATIVE_INFINITY
points.forEach((point) => {
const value = point[key]
if (value < minimum) minimum = value
if (value > maximum) maximum = value
if (key === 'y' && includeErrors) {
const errors = resolveWaveformPointErrors(point)
minimum = Math.min(minimum, point.y - errors.lower)
maximum = Math.max(maximum, point.y + errors.upper)
}
2026-07-20 10:21:30 +08:00
})
return paddedDomain(Number.isFinite(minimum) ? [minimum, maximum] : [])
}
export function prepareWaveformSeries(data: WaveformData): PreparedWaveformSeries[] {
return normalizeWaveformSeries(data).map((series) => ({
...series,
xDomain: pointDomain(series.points, 'x'),
yDomain: pointDomain(series.points, 'y', series.errorBar.visible),
2026-07-20 10:21:30 +08:00
}))
}
export function usePreparedWaveformSeries(data: () => WaveformData, onDataChange: () => void) {
2026-07-20 10:21:30 +08:00
const preparedSeries = shallowRef<PreparedWaveformSeries[]>(prepareWaveformSeries(data()))
watch(data, (nextData) => {
preparedSeries.value = prepareWaveformSeries(nextData)
onDataChange()
})
return preparedSeries
}