Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Процентное отношение 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
15-1167555536
Slider007
2006-12-31 11:58
2007.01.28
С Но..., тьфу .. с днем рождения ! 31 декабря


2-1167434222
Wind
2006-12-30 02:17
2007.01.28
FieldByName


11-1147040827
DevilDevil
2006-05-08 02:27
2007.01.28
JpegObj - требует obj файлы


15-1167866497
lookin
2007-01-04 02:21
2007.01.28
В Скайп?


15-1168240374
Slider007
2007-01-08 10:12
2007.01.28
С днем рождения ! 8 января