Я создаю расходящуюся шкалу , используя D3. js с:
scaleDiverging = d3.scaleDivergingSymlog(d3.interpolateBrBG)
.domain([-0.1, 0, 0.1])
Затем я могу позвонить scaleDiverging(0.05)
, и я верну значение 'rgb(87, 175, 165)'
. Это прекрасно работает, за исключением того, что мне нужно заполнить canvas
изображение целыми числами RGB. Поэтому мне нужно разобрать эти строки, возвращенные из scaleDiverging
:
const parseRgb = color =>
color.substring(4, color.length - 1).split(', ')
.map(n => parseInt(n))
Простое решение, но это проблемная часть c, где мое приложение тратит большую часть своего времени и является причиной, по которой мой интерактивный график не гладко Вы перемещаете ползунок и через 2 секунды изображение меняется. Если я заменю parseRgb
простой функцией, которая неточно возвращает массив чисел, график будет гладким! Мне нужен массив значений RGB для функции Canvas 'putImageData
:
const context = canvas.node().getContext('2d'),
imageData = context.getImageData(0, 0, width, height),
data = imageData.data
for (int i = 0; i < width * height * 4; i += 4) {
const color = parseRgb(scaleDiverging(calcVal(i)))
data[i] = color[0]
data[i + 1] = color[1]
data[i + 2] = color[2]
data[i + 3] = 255
}
context.putImageData(imageData, 0, 0)
Могу ли я получить функциональность scaleDivergingSymlog
из D3. js, где мне не нужно анализировать полученную строку? Я знаю, что могу посмотреть код и реализовать его самостоятельно, но, помимо того, чтобы избежать этой работы, я хотел бы знать, как правильно использовать D3. js в будущем для интерактивных графиков.
У кого-то еще в stackoverflow была похожая проблема, и единственным ответом было использование d3.color
. По сути, это то же самое, что и моя parseRgb
функция выше, но производительность еще хуже: (.