Я не уверен, какой случай вы представляете, но, читая ваш желаемый результат, что не так, просто масштабируя, поэтому максимальное значение становится 255?
function scaleUp(rgb) {
let max = Math.max(rgb.r, rgb.g, rgb.b);
if (!max) { // 0 or NaN
return {r: 255, g: 255, b: 255};
}
let factor = 255/max;
return {
r: factor * rgb.r,
g: factor * rgb.g,
b: factor * rgb.b,
};
}
Таким образом, вы получите результаты, как
scaleUp({r: 0, g: 0, b: 0}); // {r: 255, g: 255, b: 255}
scaleUp({r: 255, g: 0, b: 0}); // {r: 255, g: 0, b: 0}
scaleUp({r: 50, g: 80, b: 66}); // {r: 159.375, g: 255, b: 210.375}
Обратите внимание, это сводит все {x, 0, 0}
к {255, 0, 0}
, означая {1, 0, 0}
сильно отличается в {1, 1, 1}
. Если это нежелательно, вам необходимо будет рассмотреть специальную обработку таких случаев.
Дополнительные подсказки RGB; вы получаете более плавные «более естественные» световые переходы и т. д., если вы квадрат и корень вокруг вашего op, например. а не x + y
, do sqrt(x*x + y*y)
Это приводит к другому представлению о том, как решить проблему; добавление белого и сворачивает
function scaleDown(rgb) {
let whiteAdded = {
r: Math.sqrt(255 * 255 + rgb.r * rgb.r),
g: Math.sqrt(255 * 255 + rgb.g * rgb.g),
b: Math.sqrt(255 * 255 + rgb.b * rgb.b)
};
return scaleUp(whiteAdded);
}
На этот раз
scaleDown({r: 0, g: 0, b: 0}); // {r: 255, g: 255, b: 255}
scaleDown({r: 255, g: 0, b: 0}); // {r: 255, g: 180.3122292025696, b: 180.3122292025696}
scaleDown({r: 50, g: 80, b: 66}); // {r: 247.94043129928136, g: 255, b: 251.32479296236951}
и имеет меньше скачки вокруг краевых точек, например
scaleDown({r: 1, g: 0, b: 0}); // {r: 255, g: 254.99803923830171, b: 254.99803923830171}
Наконец, обратите внимание на это карты RGB на диапазоне 180..255
, так что вы можете преобразовать это 0..255
если вы хотите сохранить свою "истинный красный" s и т.д.
function solution(rgb) {
let high = scaleDown(rgb);
return {
r: 3.4 * (high.r - 180),
g: 3.4 * (high.g - 180),
b: 3.4 * (high.b - 180),
};
}
So
solution({r: 255, g: 0, b: 0}); // {r: 255, g: 1.0615792887366295, b: 1.0615792887366295}
solution({r: 1, g: 0, b: 0}); // {r: 255, g: 254.99333341022583, b: 254.99333341022583}
solution({r: 50, g: 80, b: 66}); // {r: 230.9974664175566, g: 255, b: 242.50429607205635}
Пожалуйста, пост код у вас есть, так что мы можем увидеть и указать на то, что случилось с вашей попытки. – Bergi
Вы после визуального FX или математической модели? Лучший способ смоделировать реальный объект - это установить некоторые фотографии и видео, использовать подборщик цветов и увеличить масштаб, чтобы увидеть, как распространяется градиент. Изучите, как изменяются цвета пикселей, поскольку светодиоды меняют яркость и оттенок. Это поможет вам получить желаемый FX – Blindman67