Главная страница
    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.048 c
15-1167686051
Riply
2007-01-02 00:14
2007.01.28
Книга по ассемблеру.


2-1168546687
CaLL|ok
2007-01-11 23:18
2007.01.28
заполнение ПрогрессБара за заданный промежуток времени


1-1165034574
SerB
2006-12-02 07:42
2007.01.28
Variant


4-1158154410
Jimmm
2006-09-13 17:33
2007.01.28
COM сервер в Win32 Service


11-1145617791
netsend
2006-04-21 15:09
2007.01.28
KOL plugins





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский