Похоже, вы хотите заменить свой ??? с
Round((R1*Percent + R2*(100-Percent))/100.0)
EnsureRange
в вашем коде не является необходимым, поскольку эта функция должна возвращать значения в диапазоне от 0 до 255 при условии, что Percent
находится в диапазоне от 0 до 100. Я думаю, что я бы применил EnsureRange
к Percent
(принудительно установите его в диапазоне от 0,0 до 100,0) и затем используйте следующий код:
Result := RGB(
Round((R1*Percent + R2*(100-Percent))/100.0),
Round((G1*Percent + G2*(100-Percent))/100.0),
Round((B1*Percent + B2*(100-Percent))/100.0),
);
Ваша первая функция возвращает массив, первый цвет которого ColorA
. Может быть, вам будет лучше с этим:
for X:= 0 to Count - 1 do
Result[X]:= ColorBetween(ColorA, ColorB, (X+1) / (Count+1) * 100.0);
Это дает одинаковое поведение на обоих концах массива. Или, возможно, вы хотите, чтобы ColorA
и ColorB
были включены. Тогда вы будете использовать:
X / (Count-1) * 100.0
Но если вы сделаете это, помните, что Count должен быть больше 1, иначе вы будете делиться на ноль. Это никогда не получается !!
Не беспокойтесь о производительности. Код можно сделать немного быстрее, без сомнения, но это не будет узким местом. Вы возьмете эти цвета и начертите их. Это потребует значительно больше ресурсов, чем эти простые процедуры.
Один последний момент. Интерполяция в пространстве RGB не будет выглядеть особенно гладкой или линейной для человеческого глаза. Использование процента с плавающей запятой не может избежать этого факта. Для получения наилучших результатов при просмотре вам нужно будет интерполировать в другом цветовом пространстве.