Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
2-1168501791
Apachi
2007-01-11 10:49
2007.01.28
сохранение результатов работы командной строки


15-1168186755
VolJinn
2007-01-07 19:19
2007.01.28
Еще задачка :)


15-1168183981
kaZaNoVa
2007-01-07 18:33
2007.01.28
Философия познания или возможности непознанного


2-1168353038
FIL-23
2007-01-09 17:30
2007.01.28
RadioButton свойство Caption в две, три строки


2-1168593143
vigo_
2007-01-12 12:12
2007.01.28
Вызов переменной из другого Unit a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский