Существует два способа обработки интерполяционных цветов. Один - быстрый и простой (что вы делаете), другой - немного медленнее, но в некоторых случаях он может выглядеть лучше.
Первый - это очевидный, простой метод (x * s) + (y * (1-s))
, который представляет собой чисто линейную интерполяцию и выполняет то, что предлагает название. Тем не менее, на некоторых цветовых парах (скажем, зеленый и оранжевый), вы получаете некоторые неприятные цвета в середине (грязно-коричневый). Это потому, что вы лепите каждый компонент (R, G и B), и есть моменты, когда комбинация неприятна. Если вам нужен самый простой lerp, то это тот метод, который вам нужен, и ваш код примерно верен.
Если вам нужен эффект, который выглядит лучше, но немного медленнее, вам нужно интерполировать в цветовом пространстве HSL. Так как оттенок, насыщенность и яркость интерполируются, вы получаете цвет, который ожидаете между ними, и можете избежать большинства уродливых. Так как цвета обычно рисуются в каком-то колесе, этот метод знает об этом (где в качестве основного рычага RGB действует так, как будто он работает с 3 дискретными линиями).
Чтобы использовать lepp HSL, вам нужно конвертировать значения RGB, переходить между результатами и конвертировать обратно. Эта страница имеет некоторые формулы, которые могут быть полезны для этого, а эта имеет PHP-код для ее обработки.