![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение цвета линий в цикле
Link © (2002-10-08 13:49:00)Никто не встречался с проблемой: как менять цвета линий в цикле.
С каждой прокруткой цикла строится один график. Нужно, чтобы в итоге все графики оказались разных цветов. Массивом не получится, т.к. число прокруток не ограничено.
Желательно, чтобы в итоге можно было узнать программно какому графику соответствует какой цвет.
Заранее спасибо!
han_malign (2002-10-18 15:53:00) [1]>
var
color:array[1..10] of TColor=($CC3300, $FFFF00, $660033, $FF00FF, $6600CC, $009999, $0099FF, $006633, $CCCC33, $FFCC33);
2 Ru - область видимости абсолютно не причем.
Правильно будет(наверное сами уже догадались)
const
color:array[1..10] of TColor=($CC3300, $FFFF00, $660033, $FF00FF, $6600CC, $009999, $0099FF, $006633, $CCCC33, $FFCC33);
> Но при разворачивании окна сам график (не координатная сетка) получается двух разных цветов.
Случайно не знаете с чем это может быть связано?
Судя по всему текущий цвет меняется по OnDraw, который вызывется не только при отрисовке следущего графика, но и при изменении зоны видимости компоненты (при этом, по идее, в отрисовываемой заново половине должны исчезать все предыдущие графики).
Как бороться - рисовать в Bitmap которую по OnDraw Stretch-ить на Canvas
k (2002-10-18 15:24:00) [2]как мне кажется
с каждым графиком должен быть проассоциирован цвет.
т.е. есть у тебя график - структура или класс - у него должно быть свойство - цвет (я бы добавил еще и стиль, заметил han_malign ярких цветов маловато, а если еще и стили комбинировать - смотри сам)
дальше создай список цветов или сгенери его
то есть получи массив
MyColors :array[1..MaxColors] of TColor = (clBlack, clGreen, $00ff00, и т.д)
как назначить цвет для нового графика,
перебираем все графики, смотрим у них цвета (если число графиков меньше тысячи то это произойдет оч. быстро ). можно сразу составить список(массив с нумерами) занятых (или незанятых) цветов
назначаем первый же незанятый.....
при таком раскладе легко можно создавать/удалять графики не парясь над конфликтом цветов.
таков алгоритм в общих чертах..
Ru (2002-10-18 13:57:00) [3]такое сообщение может быть при попытке инициализации массива в процеуре, присваивать значения константе необходимо за пределами процедуры - делать их глобальными (если я правильно понял первую часть последнего вопроса)
Link (2002-10-12 14:18:00) [4]???
Очень нужно!!!!!!!!!!!!
Хоть какие-то соображения выскажите!!
Пожалуйста!!!
Link (2002-10-12 13:30:00) [5]Заменил color на colr, пишет:
Cannot initialize local variables
Но теперь другой вопрос. Я воспользовался советом Skier.
Всё замечательно. Даже цвета получаются вполне хорошие. Но при разворачивании окна сам график (не координатная сетка) получается двух разных цветов.
Случайно не знаете с чем это может быть связано?
Или, может быть, что-нибудь с массивом подскажите?
Заранее благодарю.
DieHard (2002-10-08 17:11:00) [6]color - не совсем удачное названия для переменной
скорее всего оно с чем-нибудь конфликтует
Link (2002-10-08 15:46:00) [7]ОК. Уговорили ;). Согласен на массив.
Делаю так:
var
color:array[1..10] of TColor=($CC3300, $FFFF00, $660033, $FF00FF, $6600CC, $009999, $0099FF, $006633, $CCCC33, $FFCC33);
......
begin
......
Pen.Color:=color[p];
......
end;
Просит : Array type required
PS: Я воще-то ламер. Знакомый попросил написать программу, а я как могу стараюсь это сделать. Решаю проблемы по мере их поступления. Поэтому многие простые вопросы я знаю хуже, чем некоторые сложные. О массивах слышал, но ещё не сталкивался.
Link (2002-10-08 15:06:00) [8]
> KSergey
Абсолютно согласен. Вот только как выбрать разумную цифру так, чтобы было в самый раз? В принципе вариант с множеством проходит, но тут то и возникает вопрос: а сколько нужно будет графиков? Естественно не слишком много. Но хотелось бы не чувствовать себя в чётко установленных рамках. Обидно будет, если установить слишком большую цифру для ежедневного пользования, и слишком маленькую, для какой-то исключительной ситуации.
А если с массивом, то какой тип устанавливать для массива color, чтобы потом
Pen.Color:=color[p];
работало?
han_malign (2002-10-08 15:01:00) [9]Я так понимаю что нужно смотреть динамику процесса (что то вроде медианного анализа), но для этого есть стандартные методы:
1. Развертка в 3D по шкале времени.
2. Спектрограмма(Оси: время, ордината, абсцисса отображается интенсивностью цвета( чем больше значение тем ярче(или наоборот))) (в общем-то тот-же 3D, но сверху).
KSergey (2002-10-08 14:53:00) [10]> Link (08.10.02 14:28)
> К сожалению, нужно, чтобы не было ограничено число прокруток.
А вот этого вам не добиться никогда!
а) из психо-физических соображений о воозможностях человека, указанных han_malign (08.10.02 14:38)
б) видеокарта PC (да и любой цфровой железяки) имеет ограниченныйнабор цветов, который она может отобразить. Принципиально ограниченый. Не важно каким числом, но ограниченый.
А вообще может растолкуете поподробнее что надо? Просо несколько графиков простоить в одной сетке? А вы вообще понимаете, что разобрать неограниченной кол-во графиков все равно нельзя?! Равно как и нарисовать? Т.е. может просто ограничить себя разумной цифрой?
REA (2002-10-08 14:42:00) [11]Ну да. Это обратная функция есть, а RGBToColor нету.
han_malign (2002-10-08 14:38:00) [12]Каждый охотник желает знать ...
Извиняюсь конечно но у человеческого зрения очень ограниченный спектр восприятия, и много совершенно разных ярких цветов ты не найдешь (ну штук сто может подберешь более-менее разных(если у реципиента профессиональное художественное зрение)), ну а уж до бесконечности: "если смешать все цвета радуги - то получится серый цвет"(Дракоша)
З.Ы. После 100-й (в лучшем случае) прокрутки ты все равно сможешь нормально различать не более 10-20 верхних линий (опять же в лучшем случае), ниже будет разноцветный хаос. А вообще размещать на одном поле более 3-4 диаграмм не ркомендуется (если конечно ты не бифуркации строишь)
Skier (2002-10-08 14:34:00) [13]>Link
Где-то так :
const
Red_Range = 255;
Green_Range = 255;
Blue_Range = 255;
begin
//................
Randomize;
Color := RGB(Random(Red_Range),
Random(Green_Range),
Random(Blue_Range));
//................
end;
Link (2002-10-08 14:30:00) [14]
> Хонь-юнь
Цикл не меняет цвет графика, а строит совершенно другой, так что получается несколько на одной координатной сетке.
Link (2002-10-08 14:28:00) [15]
> still
Конечно это выход, но они получаются одного цвета, но разных оттенков, а мне бы хотелось ярких цветов и совершенно разных
> REA
Может я не доконца понял твою идею, но у меня ругается, что нету RGBToColor и, видимо, поэтому не понимает RandomR, RandomG, RandomB.
> shane54
К сожалению, нужно, чтобы не было ограничено число прокруток.
Хонь-юнь (2002-10-08 14:27:00) [16]...Цвета можно менять не перечерчиванием линий графика, а заменой палитры...
KSergey (2002-10-08 14:24:00) [17]Вообще, совет shane54 (08.10.02 14:04)видится наиболее рациональным с точки зрения получения прогнозируемого результата. А то случайными числами такого можно наворотить ;) - никто потом не разберет.
Если же не боитесь экспериментов, то чтобы хоть как-то ограничить кол-во цветов и получить более-менее отличимые один от другого, воспользуйтесь, например, методикой, представленной на http://www.artlebedev.ru/free/colors/
shane54 (2002-10-08 14:04:00) [18]Ну или можно сделать совсем просто (если нужно немного цветов).
Создаем множество, в котором перечесляем цвета. Дальше цикл от первого цвета до последнего.
REA (2002-10-08 14:00:00) [19]Color := RGBToColor(RandomR, RandomG, RandomB); например
константы генерировать из соображений контрастности с фоном
still (2002-10-08 13:59:00) [20]type TColor = -(COLOR_ENDCOLORS + 1)..$02FFFFFF;
исходя из этого
просто делаешь инкремент цвета например, так
Color := Color+$000F0F0F - тогда каждая последующая линия будет светлее предыдущей
либо так
Color := Color+$0000FF20 -ну путем экспериментов можно добиться красивого результата