Вы не показываете какой-либо алгоритм или код, поэтому я просто объясню алгоритм высокого уровня. Если вам нужно больше деталей, кода или математических формул, покажите больше своей работы, а затем спросите. Вы не объясняете, что вы подразумеваете под «плавным переходом», - здесь есть несколько значений. Это приведет к непрерывному затенению, но может оказаться недостаточно плавным для ваших целей.
Сначала, учитывая ваши точки в прямоугольном пространстве рисования, найдите диаграмму Вороного для этих точек. Это делит пространство рисования на выпуклые многоугольники, каждый многоугольник вокруг одной из ваших точек.
Для каждой вершины на диаграмме Вороного определите, какие точки находятся ближе всего к вершине - обычно будет только три из ваших точек, но их может быть больше. Затем в этой точке вершины назначьте цвет, который является средним значением RGB для ближайших заданных точек. Таким образом, усредните значения R и значения G и значения B. отдельно.
Для любой точки многоугольника Вороного ребро ее цвет представляет собой средневзвешенное значение двух цветов в конечных точках. То есть Если точка составляет одну треть расстояния от одного конца, ее значение RGB равно одной трети расстояния от значений в конечных точках.
Наконец, для любой точки внутри многоугольника Вороного вычислите луч из точки, которая определила этот многоугольник ("центральная точка"), через текущую точку, на которую вы смотрите. Найдите, где этот луч пересекает многоугольник. Тогда значение RGB является средневзвешенным значением значений центральной точки и точки пересечения многоугольника.
Самая сложная часть из всего, что найти диаграмму Вороного. Алгоритм Фортуны может сделать это в разумные сроки. Вы, вероятно, можете найти библиотеку, чтобы сделать это для вас на выбранном вами языке программирования.
Другой алгоритм - начать с триангуляции заданных вами точек и углов области рисования. Тогда цвет любой точки в треугольнике - это средневзвешенное значение цветов вершин. Это будет автоматически согласовано для точек на вершинах или ребрах треугольников, так что это, вероятно, проще, чем мой предыдущий алгоритм. Трудность здесь заключается в поиске триангуляции (любой подойдет).