Я реализовал нечто подобное в Winamp AVS некоторое время назад. Он использует подход типа «метабол» для вычисления обратного квадрата расстояния (чтобы избежать квадрата по скорости) от каждой точки данных, его ограничения (например, до 1,0) и взятия суммы этих расстояний для каждой точки на двумерной сетке. Это даст плавно меняющуюся карту цвета / высоты.
Если вы хотите взглянуть на код, он находится в предустановке «Glowy» из моего J10 AVS пакета .
РЕДАКТИРОВАТЬ: Просто глядя на это, я добавил еще какой-то джаз, чтобы он выглядел красивее, наиболее важной частью является:
d1=s/(sqr(px1-rx)+sqr(py1-ry));
d2=s/(sqr(px2-rx)+sqr(py2-ry));
d3=s/(sqr(px3-rx)+sqr(py3-ry));
d4=s/(sqr(px4-rx)+sqr(py4-ry));
d5=s/(sqr(px5-rx)+sqr(py5-ry));
d6=s/(sqr(px6-rx)+sqr(py6-ry));
d=d1+d2+d3+d4+d5+d6;
Который берет сумму за 6 баллов. Все остальное, что делается с выходными значениями красного, зеленого и синего, - это сделать его красивее. 6 баллов - это не много, но имейте в виду, что я пытался сделать это в режиме реального времени на сетке 320x200 на машине 400 МГц, когда она была новой (что она делает при ~ 20 кадрах в секунду). :)
Заменить красные =, зеленые = и синие = ... строки красным = d; и т.д ... чтобы понять, что я имею в виду. Вся привлекательность исчезает, и у вас остается изображение в градациях серого с плавно изменяющимися пятнами вокруг точек данных.
Другое редактирование: я забыл сказать, что «s» - это общий вес для всех точек, изменение его для каждого дает веса, индивидуальные для каждой точки, например, d1 = 2 / (...) и d2 = 1 / (...) дали бы d1 вдвое большую высоту в его центре, чем d2. Вы можете также захотеть ограничить выражение внизу чем-то вроде d1 = 2 / max (..., 1.0), чтобы сгладить вершины точек, чтобы они не достигали пика на бесконечности в середине. :)
Извините за беспорядочный ответ ... Я подумал, что опубликовать пример кода будет достаточно, но при проверке мой код сбивает с толку и его трудно прочитать. (