Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 20:27   #1
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию Подобие градиента

Есть два цвета, допустим 0хFF13A4 и 0x25CCFF (цвета могут быть любые). И есть 10 (не важно, сколько. Но пусть будет 10 для того, чтобы можно было составить какое-то процентное соотношение - пока что я вижу так решение задачи) квадратиков, расположенных в линию. Цвет первого и последнего квадратиков совпадает с заданными цветами соответственно. Те квадраты, которые находятся между ними раскрашены промежуточными цветами из заданного диапазона.
Как, собственно, это реализовать (без привязки к языковым функциям)? Я подозреваю, что здесь будут замешаны битовые операции. Только не понимаю, каким образом можно приблизить один цвет на 10% к другому...
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 29.03.2013 в 22:54.
ACE Valery вне форума Ответить с цитированием
Старый 29.03.2013, 20:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

Например, color = color1 + (i/10) * (color2 - color1), где i от 1 до 9.
Можно делать для цвета, как числа, либо разбивать цвет на каналы и делать так для каждого канала.

ПС Градиент, поточечно сгенерированный в дельфи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.03.2013 в 20:39.
BDA вне форума Ответить с цитированием
Старый 29.03.2013, 21:00   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Не-а, не катит Ну то есть выпадает совсем не тот цвет. Ни при полном изменении цвета, ни при поканальном. Возможно, связано с тем, что в Делфи как-то по-другому операции с цветами работают
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 29.03.2013, 21:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://delphiworld.narod.ru/base/grad_fill.html
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2013, 21:20   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

Хм, у меня поканальный нормально работает.
Вложения
Тип файла: rar Градиент.rar (4.3 Кб, 12 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.03.2013, 22:40   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Не-а, не катит Ну то есть выпадает совсем не тот цвет. Ни при полном изменении цвета, ни при поканальном. Возможно, связано с тем, что в Делфи как-то по-другому операции с цветами работают
Если использовать integer переменные приведенная формула не сработает: 1/10 в целочисленной арифметике будет 0. Сначала умножайте, потом делите. IMHO использовать платформенное API лучше - весьмя вероятно, что градиент будет делать железо.
waleri вне форума Ответить с цитированием
Старый 29.03.2013, 22:44   #7
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Всем спасибо! Помогло. Итак, отчитываюсь:
Код:
for (var i:int = 0; i < 10; i++ ) {
     var testColor2:int = beginColor - (beginColor - endColor) / 10 * i;
}
Не работаить. По какой причине - мой скудный умишко не понимать.

Код:
for (var i:int = 0; i < 10; i++ ) {
	var r3:int = r1 - (r1 - r2) / 10 * i; //0xE9
	var g3:int = g1 - (g1 - g2) / 10 * i;
	var b3:int = b1 - (b1 - b2) / 10 * i;
	var testColor2:int = (r3 << 16 | (g3 << 8) | b3 );				
}
Работаить! Если че, язык ActionScript3

UPD:
Цитата:
IMHO использовать платформенное API лучше - весьмя вероятно, что градиент будет делать железо.
Задача состоит совсем в другом, поэтому и невозможно использовать специфические функции для создания градиента. Просто для удобства я задачу немного сократила.

ПыСы: у нас 8/10 будет 0.8 даже если использовать в интовом выражении.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 29.03.2013 в 22:52.
ACE Valery вне форума Ответить с цитированием
Старый 29.03.2013, 22:47   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

ACE Valery, я не имел ввиду, что поканальное преобразование и преобразование сразу всего цвета дадут одинаковый результат.
Зря написал про переход сразу всего цвета
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.03.2013, 11:17   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Есть два цвета, допустим 0хFF13A4 и 0x25CCFF (цвета могут быть любые). И есть 10 (не важно, сколько. Но пусть будет 10 для того, чтобы можно было составить какое-то процентное соотношение - пока что я вижу так решение задачи) квадратиков, расположенных в линию. Цвет первого и последнего квадратиков совпадает с заданными цветами соответственно. Те квадраты, которые находятся между ними раскрашены промежуточными цветами из заданного диапазона.
Как, собственно, это реализовать (без привязки к языковым функциям)? Я подозреваю, что здесь будут замешаны битовые операции. Только не понимаю, каким образом можно приблизить один цвет на 10% к другому...
В математике есть такое понятие - интерполяция. Именно ею в данном случае и нужно пользоваться.
Правда, здесь существует несколько неоднозначностей.

1. Вид интерполяции.
В принципе, их достаточно много разных, но если исходить из того, что точек именно две, то выбора, по сути и не остается - только линейная.

2. Цветовое пространство.
Вот здесь неоднозначность имеет место.
Действительно, по сути нам нужно отметить в этом пространстве 2 точки, провести через них прямую, и взять цвета, равномерно расположенные на отрезке между этими двумя точками.
Все.
Проблема лишь в том, что цветовые пространства бывают различными, а потому то, что в ордном пространстве будет прямой, в другом превратится в кривую.

Теперь пару замечаний:

1. К "языковым функциям" это не имеет ни малейшего отношения. И иметь не может. На любом языке это реализуется совершено одинаково точно так же, как фундаментальные математические законы не зависят (да и не могут зависеть) от языка программирования.

2. Битовые операции - явно шаг не в том направлении.
Повторюсь: здесь нужна интерполяция. По хорошему, это операции с вещественными числами.

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Не-а, не катит Ну то есть выпадает совсем не тот цвет. Ни при полном изменении цвета, ни при поканальном. Возможно, связано с тем, что в Делфи как-то по-другому операции с цветами работают
Объясните, пожалуйста, почему Вы решили, что "совсем не тот цвет".
Собственно, это объяснение нужно прежде всего Вам, чтобы Вы поняли, чего именно хотите (ну и смогли это сформулировать и объяснить нам - но это уже второстепенная задача).

Вообще же, как я уже писал, результаты могут сильно меняться в зависимости от выбранного цветового пространства.
В частности, предложенный в сообщении #2 вариант может рассматриваться как иллюстрация, но вряд ли пригоден для реального использования.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да, это один из частных случаев. Конкретно - в пространстве RGB.

Цитата:
Сообщение от BDA Посмотреть сообщение
ACE Valery, я не имел ввиду, что поканальное преобразование и преобразование сразу всего цвета дадут одинаковый результат.
Зря написал про переход сразу всего цвета
Вы написали все верно. Просто, чтобы воспользоваться Вашим советом, нужно понимать, что цвет - вектор, а не скаляр, и операции над цветом - векторные операции.

Последний раз редактировалось Stilet; 30.03.2013 в 12:06.
s-andriano вне форума Ответить с цитированием
Старый 30.03.2013, 15:00   #10
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Госспади... А теорему Пифагора можно выводить из каких-то логических соображений, а можно использовать знание формулы о сумме квадратов катетов. А законы физики Земли не такие, как законы физики в какой-нибудь далекой-далекой галактике. А подключение к базе данных можно писать и на машинных кодах. Не нужно усложнять, иначе у меня возникает ощущение, что я не адекватно задаю вопросы, и сразу хочется себя забанить за это.

По паре замечаний:
1. Для создания цвета в одном языке есть функция new RGB(r, g, b), в другом - createColor(r, g, b), в третьем new RgbColor(r, g, b). Изменение цвета в одном transformColor, в другом еще как-то.
2. Очень даже в битовых операциях. Код я привела выше.

Цитата:
Объясните, пожалуйста, почему Вы решили, что "совсем не тот цвет".
Объясняю: я задала начальный цвет желтый, конечный фиолетовый. При использовании формулы в зависимости от i получался малиновый, светло-розовый и т.п., которых в эталонном градиенте не было.

Цитата:
Конкретно - в пространстве RGB.
Конкретно - оно и нужно.

Смотрите на мир проще, тем более, я отчиталась, что моя задача полностью решена с помощью вышеприведенных ребятами советов.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
итерации методом градиента маленький монстрик Помощь студентам 6 03.01.2011 19:43
Использование градиента в качестве фона. vedro-compota HTML и CSS 7 06.10.2010 11:12
Подсчет градиента яркости (математический расчет градиента) Hellrazah Помощь студентам 0 04.06.2010 20:21
Формула получения цвета с градиента strel-core Общие вопросы C/C++ 9 19.05.2009 18:13