Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354

Плавный переход между двумя цветами

29.12.2018, 15:20. Показов 3655. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени!
Прошу помощи в написании функции по следующему описанию:
Color SCC(Color clr0, Color clr1, int res, int step)
Где clr0-1 - цвета между которыми производим плавный переход, res - колво шагов для перехода (повлияет на прерывистость), step - конкретный шаг.
Не представляю как нужно вести расчет.
Если кому не трудно - буду благодарен за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2018, 15:20
Ответы с готовыми решениями:

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

Как сделать тест с двумя уровнями вопросов и переход между уровнями
Ребята подскажите пожалуйста, как можно сделать тест с двумя уровнями вопросов и переход между уровнями! У теста будет такая логика,...

Плавный переход с одной картинки на другую
Народ, плизз помогите задали написать простейшую программу для просмотра картинок. Всего 4 контролоа; <Вперед> <Назад>...

14
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
29.12.2018, 16:54
Ну допустим у вас цвет меняется от 0 до 255. Вам необходимо задать шаг, с которым он будет изменятся, а конкретный шаг - это значение цвета. Например
Color за три раза изменится на определенный градиент.
Т.е за 5 шагов 255 / 5 = значение 51. Но вот в stem мы можем указать что будет изменяться на 24 например. И на выходе будет 120 - наш итоговый цвет. Как-то так наверное, если я правильно понял.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
29.12.2018, 19:39  [ТС]
Jman, Примерно так, но цветовых каналов то 4, и нужно сделать чтобы переход был одновременным, а не так что самое близкое к имеющемуся завершилось первым а остальные еще отрисовываются...
Хотя я не знаю как это реализовать наиболее правильно, потому и написал сюда.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
29.12.2018, 20:12
Цитата Сообщение от Pin1999 Посмотреть сообщение
Хотя я не знаю как это реализовать наиболее правильно,
а что тут думать?! Цвет - это 3 (!) цветовых канала и 1 альфа канал, который в вашем случае всегда равен 255
-берете n количество шагов
-находите разность значений определенного канала
-рассчитываете изменение цвета канала на 1 шаг

На примере R канала. Исходное значение 216, конечно 89.
Количество шагов - 10
Изменение R канала на 1 шаг - (89-216)/10.
Далее просто каждый шаг таймера инкременируете R каналу найденное значение.
И так для 3 каналов.
2
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
30.12.2018, 11:56  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
альфа канал, который в вашем случае всегда равен 255
Не всегда.
Альфа тоже может быть разная.

Настрочил такое:
Но не всегда работает правильно.
C#
1
2
3
4
5
6
7
8
public Color SCC(Color clr0, Color clr1, int res, int step)
{
    return Color.FromArgb(
        (byte)((float)(clr0.A - clr1.A) / res * step), 
        (byte)((float)(clr0.R - clr1.R) / res * step), 
        (byte)((float)(clr0.G - clr1.G) / res * step), 
        (byte)((float)(clr0.B - clr1.B) / res * step));
}
Чем меньше разница каналов первого и второго цветов тем меньше вероятность что сработает правильно.

Добавлено через 36 минут
Вроде бы так более правильные результаты:
C#
1
2
3
4
5
6
7
8
public Color SCC(Color clr0, Color clr1, int res, int step)
{
    return Color.FromArgb(
        (byte)(clr0.A - ((float)(clr0.A - clr1.A) / res * step)),
        (byte)(clr0.R - ((float)(clr0.R - clr1.R) / res * step)),
        (byte)(clr0.G - ((float)(clr0.G - clr1.G) / res * step)),
        (byte)(clr0.B - ((float)(clr0.B - clr1.B) / res * step)));
}
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
30.12.2018, 15:31
Цитата Сообщение от Pin1999 Посмотреть сообщение
Альфа тоже может быть разная.
так у вас же задача сделать переход между цветами, на которые альфа канал не влияет.
Цитата Сообщение от Pin1999 Посмотреть сообщение
Но не всегда работает правильно
а что работает не правильно, не хотите указать?
C#
1
2
3
4
5
6
return Color.FromArgb(
        (byte)(clr0.A - ((float)(clr0.A - clr1.A) / res * step)),
        (byte)(clr0.R - ((float)(clr0.R - clr1.R) / res * step)),
        (byte)(clr0.G - ((float)(clr0.G - clr1.G) / res * step)),
        (byte)(clr0.B - ((float)(clr0.B - clr1.B) / res * step)));
}
почему вы вычитаете, а не складываете?
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
30.12.2018, 23:38  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
так у вас же задача сделать переход между цветами, на которые альфа канал не влияет.
С чего вдруг не влияет?
Один цвет может быть одной прозрачности, другой другой прозрачности, нужно сдалать и тут плавный переход.
А то получится резкое переключение прозрачности, и плавное переключение цвета.

Цитата Сообщение от Рядовой Посмотреть сообщение
а что работает не правильно, не хотите указать?
А вы сами посчитайте.
Кликните здесь для просмотра всего текста
На пример clr0.G = 255, clr1.G = 255
255-255 = 0
0 / 10 = 0
0 * 4 = 0
Вот потому и вычитаю
255-255 = 0
0 / 10 = 0
0 * 3 = 0
255 - 0 = 255

А если на пример clr0.G = 75, clr1.G = 255
75 - 255 = -180
-180 / 10 = -18
-18 * 0 = 0
75 - 0 = 75
-18 * 1 = -18
75 - (-18) = 93
-18 * 2 = -36
75 - (-36) = 111
-18 * 3 = -54
75 - (-54) = 129
Как видите значение идет от начального к конечному
Если же складывать то
-18 * 0 = 0
75 - 0 = 75
-18 * 1 = -18
75 + (-18) = 57
-18 * 2 = -36
75 + (-36) = 39
-18 * 3 = -54
75 + (-54) = 21
И падает далее.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
31.12.2018, 13:14
Цитата Сообщение от Pin1999 Посмотреть сообщение
... но цветовых каналов то 4, и нужно сделать чтобы переход был одновременным, а не так что самое близкое к имеющемуся завершилось первым а остальные еще отрисовываются...
Хотя я не знаю как это реализовать наиболее правильно, потому и написал сюда.
Может я что-то упускаю, но мне кажется, что функция SCC должна возвращать не цвет Color, а последовательность цветов IEnumerable<Color>.

И ещё, при визуальном восприятии, может иметь значение является эта последовательность арифметической или геометрической прогрессией. Из-за особенностей человеческого восприятия, геометрическая прогрессия выглядит более плавной.

Добавлено через 16 минут
Допустим для арифметической прогрессии, что-то в таком духе
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public IEnumerable<Color> SCC(Color clr0, Color clr1, uint res)
        {
            double stepA = (double)(clr0.A - clr1.A) / res;
            double stepR = (double)(clr0.R - clr1.R) / res;
            double stepG = (double)(clr0.G - clr1.G) / res;
            double stepB = (double)(clr0.B - clr1.B) / res;
 
 
            return Enumerable.Range(0,(int) res+1).Select
                (
                    step =>
                        Color.FromArgb(
                                        (byte)(clr0.A - stepA * step),
                                        (byte)(clr0.R - stepR * step),
                                        (byte)(clr0.G - stepG * step),
                                        (byte)(clr0.B - stepB * step)
                                        )
                );
        }
Добавлено через 14 минут
Для геометрической прогрессии
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public IEnumerable<Color> SCC(Color clr0, Color clr1, uint res)
        {
            // Смещение для всех цветов на время вычисления. 
            // Влияет на первые шаги и устраняет вероятность деления на ноль
            int offset = 5;
 
            double stepA = Math.Pow((double)(clr1.A + offset) / (double)(clr0.A + offset), 1.0 / (double)res);
            double stepR = Math.Pow((double)(clr1.R + offset) / (double)(clr0.R + offset), 1.0 / (double)res);
            double stepG = Math.Pow((double)(clr1.G + offset) / (double)(clr0.G + offset), 1.0 / (double)res);
            double stepB = Math.Pow((double)(clr1.B + offset) / (double)(clr0.B + offset), 1.0 / (double)res);
 
 
            return Enumerable.Range(0, (int)res + 1).Select
                (
                    step =>
                        Color.FromArgb(
                                        (byte)(clr0.A * Math.Pow(stepA, step) - offset),
                                        (byte)(clr0.R * Math.Pow(stepR, step) - offset),
                                        (byte)(clr0.G * Math.Pow(stepG, step) - offset),
                                        (byte)(clr0.B * Math.Pow(stepB, step) - offset)
                                        )
                );
        }
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
31.12.2018, 13:26
Цитата Сообщение от Pin1999 Посмотреть сообщение
На пример clr0.G = 255, clr1.G = 255
255-255 = 0
0 / 10 = 0
0 * 4 = 0
Вот потому и вычитаю
ну если исходное значение == результирующему, выходит надо прибавлять 0 - все верно.
Цитата Сообщение от Pin1999 Посмотреть сообщение
А если на пример clr0.G = 75, clr1.G = 255
75 - 255 = -180
-180 / 10 = -18
-18 * 0 = 0
75 - 0 = 75
-18 * 1 = -18
75 - (-18) = 93
-18 * 2 = -36
75 - (-36) = 111
-18 * 3 = -54
75 - (-54) = 129
потрудитесь перечитать еще раз, что я написал, вычитать надо из конечного значения, а не начального.
А если вы все знаете лучше других так и делайте сами, нечего вопросы задавать
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.12.2018, 13:27
Цитата Сообщение от Pin1999 Посмотреть сообщение
С чего вдруг не влияет?
Один цвет может быть одной прозрачности, другой другой прозрачности, нужно сдалать и тут плавный переход.
Вообще-то цвет не может быть прозрачным. Прозрачность - это характеристика смешивания данного цвета и цвета фона.
И здесь просто не может не быть этой ссылки
Кликните здесь для просмотра всего текста
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
31.12.2018, 13:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может я что-то упускаю, но мне кажется, что функция SCC должна возвращать не цвет Color, а последовательность цветов IEnumerable<Color>.
Данную функцию использую как на ПК так и на МК, так что на МК последовательность просто забьет всю озу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
31.12.2018, 13:55
Цитата Сообщение от Pin1999 Посмотреть сообщение
Данную функцию использую как на ПК так и на МК, так что на МК последовательность просто забьет всю озу.
Последовательность не может забить сколько нибудь память. Она ничего не занимает. Это просто выражение. Она даже не вычисляется пока не понадобится какой-то из челнов последовательности.
Память могут занять объекты созданные на основе элемента (или элементов) последовательности. Но они по любому у Вас создаются или не создаются в зависимости от внешнего кода, а не самой последовательности.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
31.12.2018, 14:00  [ТС]
Цитата Сообщение от Рядовой Посмотреть сообщение
А если вы все знаете лучше других так и делайте сами, нечего вопросы задавать
Я не знаю лучше других, я говорю то что вижу на практике которой добился методом проб и ошибок.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16117 / 11238 / 2887
Регистрация: 21.04.2018
Сообщений: 33,039
Записей в блоге: 2
31.12.2018, 14:00
Можно пойти другим путём. Создать класс или структуру (допустим, Gradient). В конструкторе он принимает Gradient(Color Begin, Color End, uint Res), а метод Color Step (uint count) возвращает значение для конкретного шага.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
31.12.2018, 14:09  [ТС]
Элд Хасп, Можно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.12.2018, 14:09
Помогаю со студенческими работами здесь

Плавный переход между двумя изображениями
Скажите,что делать? Я уже создал кучу тем про один и тот же вопрос,но внятного ответа до сих пор не получил. Возможно ли сделать кнопку...

Плавный переход между картинками
Помогите пожалуйста,у меня есть 3 картинки-кадры и мне нужно сделать плавный переход между этими кадрами. Поясняю:картинка 1 загружается...

Плавный переход между формами
Всем привет! Как можно осуществить плавный переход между формами (чтобы не сразу форма выскакивала, а как-то плавно)?

Плавный переход между картинками
Здравствуйте, у меня на форме есть кнопки, при щелчке на которые в image должна грузиться определенная картинка. Как можно добиться...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru