Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизПроцентное отношение 2-х цветов из 3-го цвета Найти похожие ветки
← →
AndreyRu (2006-12-03 02:26) [0]Доброго времени суток Мастера!
Встала необходимость в программе найти процентное отношение 2-х смешанных цветов по 3-му. Т.е. есть два фиксированных цвета - Например :
const
Col1 = $12345678
Col2 = $87654321
Необходимо вычислить процент отношения первого Col1 цвета ко Второму Col2. //В результате получить это - Col1Persent = 60%
var
Col3 : TColor;
begin
.....
.....
Col3 := Canvas.Pixels[x, y];
//Нужно чтото типа вот этого
function GetPVals(Col1, Col2, Col3) : byte;
//Где Result - Col1Persent
end;
Заранее всем спасибо за ответы.. Сорри если не особо понятно выражался..
← →
Чапаев © (2006-12-03 09:32) [1]> Сорри если не особо понятно выражался
Таки непонятно... Какие цвета считать "абсолютно непохожими"?
← →
Alx2 © (2006-12-03 11:38) [2]Если правильно понял, ищется ответ на вопрос "можно ли получить третий цвет смешением двух других, и если можно, то в каких соотношениях брать компоненты?"
То есть ищем такое alpha от 0 до 1, что
Col3 = (1-alpha)*Col1+alpha*Col2
(цвета рассматриваются как векторы).
Тогда alpha*100 - "процентное содержание" Col2 и 1-alpha - Col1 в цвете Col3
← →
Чапаев © (2006-12-03 12:13) [3]А... Что-то подобное пытался реализовать, оказалось не по зубам.
← →
Alx2 © (2006-12-03 12:35) [4]Не всегда в таком виде можно представить. Но найти alpha, с которым ошибка будет минимальной, довольно просто.
Пусть c3 - цвет, который пытаемся получить "смешиванием" c1 и c2
Смешанный цвет выражаем в виде (1-alpha)*c1+alpha*c2. Здесь alpha - доля с2 в смешанном.
Так как результат должен быть похожим на с3, то попробуем найти alpha, которое минимизирует разницу между ними.
Квадрат длины вектора, "соединяющего" смешанный цвет и цвет c3 есть
R^2 = ( (1-alpha)*c1+alpha*c2 - с3 )^2
или
R^2 = (L12)*alpha^2-2*s*alpha+L13
Где L12 = (c1-c2)^2, L13=(c1-c3)^2, s=(c1-c3)*(c1-c2)
alpha, минимизирующее R^2 есть
alpha = s/L12
(напомню, L12 - квадрат длины вектора "от c1 к c2", L13 - квадрат длины вектора "от c1 к c3",s - скалярное произведение вектора "от с1 к с3" на вектор "от c1 к c2").
PS
Сорри за наивность в обозначениях. Старался как проще.
← →
Alx2 © (2006-12-03 12:46) [5]Забыл добавить: результат будет точным, если s^2=L13*L12 и alpha получилось от 0 до 1.
Или, другими словами, если третий цвет c3 лежит между цветами с1 и с2 на прямой, соединяющей c1 и с2
← →
AndreyRu (2006-12-03 17:25) [6]Спасибо Alx2!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.053 c