Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение цвета линий в цикле


Страницы:   1 2

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 -ну путем экспериментов можно добиться красивого результата


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо