Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [SL] градиент и цвет, получить цвет градиента в точке 
V
    Опции темы
NightBlaze
Дата 26.4.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Имеем горизонтальный градиент.

Код

Rectangle horizontalFillRectangle = new Rectangle();
horizontalFillRectangle.Width = 200;
horizontalFillRectangle.Height = 100;

LinearGradientBrush myHorizontalGradient = new LinearGradientBrush();
myHorizontalGradient.StartPoint = new Point(0, 0.5);
myHorizontalGradient.EndPoint = new Point(1, 0.5);
myHorizontalGradient.GradientStops.Add(new GradientStop { Offset = 0, Color = Colors.White });
myHorizontalGradient.GradientStops.Add(new GradientStop { Offset = 1, Color = Colors.Black });
horizontalFillRectangle.Fill = myHorizontalGradient;


При таком градиенте и офсете равном 0.5 мы имеем серый цвет (R=125, G=125, B=125).
Вопрос: как мне получить цвет заливки в заданной точке, зная офсет? Или можно как-то это реализовать не через LinearGradientBrush?
Интересует реализация на SL3 или SL2.
PM MAIL   Вверх
-Mikle-
Дата 26.4.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Цитата(NightBlaze @  26.4.2009,  16:38 Найти цитируемый пост)
При таком градиенте и офсете равном 0.5 мы имеем серый цвет (R=125, G=125, B=125).

нет 127.5, 127.5, 127.5 smile

[по сабжу]
Значение цвета градиента в позиции легко узнать и без рисования градиента где-либо.
Для серого градиента от чисто белого до чисто черного, формула будет проста.

Если офсет задается в интервале от 0 до 1, то очень просто:
Код

double offset = .......; // параметр
// при offset = 0, k = 255
// при offset = 1, k = 0
double k = 255 - (255 * offset);
R = G = B = k;


Если офсет задается в X-координате твоего Rectangle, то тоже просто:
Код

double x = .......; // параметр
double offset = x / rectangle.Width;
// далее код приведенный выше


Для любого двухцветного градиента, расчитать тоже не сложнее. Для многоцветного будет, тоже что и для двухцветного, только с пересчетом офсета в офсет между двумя цветами. Если нужен будет пример, пиши чего конкретно.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
NightBlaze
Дата 27.4.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



-Mikle-, 
Цитата(-Mikle- @  26.4.2009,  22:21 Найти цитируемый пост)
нет 127.5, 127.5, 127.5 smile

Да. Ступил чуть-чуть smile

Цитата(-Mikle- @  26.4.2009,  22:21 Найти цитируемый пост)
Значение цвета градиента в позиции легко узнать и без рисования градиента где-либо.

Я примерно так и придумал. Единственно, чтобы каждый раз не вычислять, то прохожусь по градиенту с шагом 0.01 (для меня приемлимая точность), определяю цвет и записываю его в массив.
PM MAIL   Вверх
-Mikle-
Дата 27.4.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Цитата(NightBlaze @  27.4.2009,  12:45 Найти цитируемый пост)
Единственно, чтобы каждый раз не вычислять, то прохожусь по градиенту с шагом 0.01 (для меня приемлимая точность), определяю цвет и записываю его в массив.

гы... вычисление против использования памяти?
это вычисление выполняется даже чуть быстрее, чем доступ к элементу массива длинной в 100 единиц.
При том, что чистая длина массива одной сотни структур Color будет равна 2400 байт.
Стоит ли? Решать конечно тебе...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
NightBlaze
Дата 29.4.2009, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



У меня не переход от белого к черному. Градиент может иметь сколько угодно GradientStops. Соответственно там не просто просчет по одной этой формуле, а чуть сложнее.
Цитата(-Mikle- @  27.4.2009,  19:11 Найти цитируемый пост)
это вычисление выполняется даже чуть быстрее, чем доступ к элементу массива длинной в 100 единиц.

Спс. Не знал. Сделаю какой-нибудь тест потом, проверю что быстрее будет.
PM MAIL   Вверх
-Mikle-
Дата 29.4.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Ну, дело твое. В принципе не так критична эта разница.
На моем компе 1 млрд. вычислений ~12 сек., а доступа к 50-ому элементу в массиве из 100 равен ~15 сек.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.