Главная страница
    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.389 c
6-1156412329
AlexAlex
2006-08-24 13:38
2007.01.28
Ошибка при отмене печати из объекта TWebbrowser.


5-1147125189
Константинов
2006-05-09 01:53
2007.01.28
Свойства - события


2-1168305883
Yuz
2007-01-09 04:24
2007.01.28
Помогите начинаещему)


2-1168325787
DelphiLexx
2007-01-09 09:56
2007.01.28
Быстрое заполнение дин. массива


1-1165487765
sdram
2006-12-07 13:36
2007.01.28
С обьявлениями хомуты





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