Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

Изменение цвета линий в цикле   Найти похожие ветки 

 
Link   (2002-10-08 13:49) [0]

Никто не встречался с проблемой: как менять цвета линий в цикле.
С каждой прокруткой цикла строится один график. Нужно, чтобы в итоге все графики оказались разных цветов. Массивом не получится, т.к. число прокруток не ограничено.
Желательно, чтобы в итоге можно было узнать программно какому графику соответствует какой цвет.

Заранее спасибо!


 
REA   (2002-10-08 13:51) [1]

Случайный цвет и запомнить его.


 
Link   (2002-10-08 13:54) [2]

А как вызвать этот случайный цвет?


 
still ©   (2002-10-08 13:59) [3]

type TColor = -(COLOR_ENDCOLORS + 1)..$02FFFFFF;

исходя из этого
просто делаешь инкремент цвета например, так
Color := Color+$000F0F0F - тогда каждая последующая линия будет светлее предыдущей
либо так
Color := Color+$0000FF20 -ну путем экспериментов можно добиться красивого результата


 
REA   (2002-10-08 14:00) [4]

Color := RGBToColor(RandomR, RandomG, RandomB); например
константы генерировать из соображений контрастности с фоном


 
shane54 ©   (2002-10-08 14:04) [5]

Ну или можно сделать совсем просто (если нужно немного цветов).
Создаем множество, в котором перечесляем цвета. Дальше цикл от первого цвета до последнего.


 
KSergey ©   (2002-10-08 14:24) [6]

Вообще, совет shane54 (08.10.02 14:04) видится наиболее рациональным с точки зрения получения прогнозируемого результата. А то случайными числами такого можно наворотить ;) - никто потом не разберет.
Если же не боитесь экспериментов, то чтобы хоть как-то ограничить кол-во цветов и получить более-менее отличимые один от другого, воспользуйтесь, например, методикой, представленной на http://www.artlebedev.ru/free/colors/


 
Хонь-юнь   (2002-10-08 14:27) [7]

...Цвета можно менять не перечерчиванием линий графика, а заменой палитры...


 
Link   (2002-10-08 14:28) [8]


> still

Конечно это выход, но они получаются одного цвета, но разных оттенков, а мне бы хотелось ярких цветов и совершенно разных

> REA

Может я не доконца понял твою идею, но у меня ругается, что нету RGBToColor и, видимо, поэтому не понимает RandomR, RandomG, RandomB.


> shane54

К сожалению, нужно, чтобы не было ограничено число прокруток.


 
Link   (2002-10-08 14:30) [9]


> Хонь-юнь

Цикл не меняет цвет графика, а строит совершенно другой, так что получается несколько на одной координатной сетке.


 
Skier ©   (2002-10-08 14:34) [10]

>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;


 
han_malign ©   (2002-10-08 14:38) [11]

Каждый охотник желает знать ...
Извиняюсь конечно но у человеческого зрения очень ограниченный спектр восприятия, и много совершенно разных ярких цветов ты не найдешь (ну штук сто может подберешь более-менее разных(если у реципиента профессиональное художественное зрение)), ну а уж до бесконечности: "если смешать все цвета радуги - то получится серый цвет"(Дракоша)
З.Ы. После 100-й (в лучшем случае) прокрутки ты все равно сможешь нормально различать не более 10-20 верхних линий (опять же в лучшем случае), ниже будет разноцветный хаос. А вообще размещать на одном поле более 3-4 диаграмм не ркомендуется (если конечно ты не бифуркации строишь)


 
REA   (2002-10-08 14:42) [12]

Ну да. Это обратная функция есть, а RGBToColor нету.


 
KSergey ©   (2002-10-08 14:53) [13]

> Link (08.10.02 14:28)
> К сожалению, нужно, чтобы не было ограничено число прокруток.

А вот этого вам не добиться никогда!

а) из психо-физических соображений о воозможностях человека, указанных han_malign (08.10.02 14:38)

б) видеокарта PC (да и любой цфровой железяки) имеет ограниченный набор цветов, который она может отобразить. Принципиально ограниченый. Не важно каким числом, но ограниченый.

А вообще может растолкуете поподробнее что надо? Просо несколько графиков простоить в одной сетке? А вы вообще понимаете, что разобрать неограниченной кол-во графиков все равно нельзя?! Равно как и нарисовать? Т.е. может просто ограничить себя разумной цифрой?


 
han_malign ©   (2002-10-08 15:01) [14]

Я так понимаю что нужно смотреть динамику процесса (что то вроде медианного анализа), но для этого есть стандартные методы:
1. Развертка в 3D по шкале времени.
2. Спектрограмма(Оси: время, ордината, абсцисса отображается интенсивностью цвета( чем больше значение тем ярче(или наоборот))) (в общем-то тот-же 3D, но сверху).


 
Link   (2002-10-08 15:06) [15]


> KSergey

Абсолютно согласен. Вот только как выбрать разумную цифру так, чтобы было в самый раз? В принципе вариант с множеством проходит, но тут то и возникает вопрос: а сколько нужно будет графиков? Естественно не слишком много. Но хотелось бы не чувствовать себя в чётко установленных рамках. Обидно будет, если установить слишком большую цифру для ежедневного пользования, и слишком маленькую, для какой-то исключительной ситуации.

А если с массивом, то какой тип устанавливать для массива color, чтобы потом
Pen.Color:=color[p];
работало?




 
Link   (2002-10-08 15:46) [16]

ОК. Уговорили ;). Согласен на массив.
Делаю так:

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: Я воще-то ламер. Знакомый попросил написать программу, а я как могу стараюсь это сделать. Решаю проблемы по мере их поступления. Поэтому многие простые вопросы я знаю хуже, чем некоторые сложные. О массивах слышал, но ещё не сталкивался.


 
DieHard ©   (2002-10-08 17:11) [17]

color - не совсем удачное названия для переменной
скорее всего оно с чем-нибудь конфликтует


 
Link   (2002-10-12 13:30) [18]

Заменил color на colr, пишет:
Cannot initialize local variables

Но теперь другой вопрос. Я воспользовался советом Skier.
Всё замечательно. Даже цвета получаются вполне хорошие. Но при разворачивании окна сам график (не координатная сетка) получается двух разных цветов.

Случайно не знаете с чем это может быть связано?

Или, может быть, что-нибудь с массивом подскажите?
Заранее благодарю.


 
Link   (2002-10-12 14:18) [19]

???

Очень нужно!!!!!!!!!!!!
Хоть какие-то соображения выскажите!!
Пожалуйста!!!


 
Ru ©   (2002-10-18 13:57) [20]

такое сообщение может быть при попытке инициализации массива в процеуре, присваивать значения константе необходимо за пределами процедуры - делать их глобальными (если я правильно понял первую часть последнего вопроса)


 
k   (2002-10-18 15:24) [21]

как мне кажется

с каждым графиком должен быть проассоциирован цвет.
т.е. есть у тебя график - структура или класс - у него должно быть свойство - цвет (я бы добавил еще и стиль, заметил han_malign ярких цветов маловато, а если еще и стили комбинировать - смотри сам)

дальше создай список цветов или сгенери его
то есть получи массив
MyColors :array[1..MaxColors] of TColor = (clBlack, clGreen, $00ff00, и т.д)

как назначить цвет для нового графика,

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

при таком раскладе легко можно создавать/удалять графики не парясь над конфликтом цветов.

таков алгоритм в общих чертах..


 
han_malign ©   (2002-10-18 15:53) [22]

> 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



Страницы: 1 вся ветка

Текущий архив: 2002.10.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
1-92529
zam2000
2002-10-16 10:05
2002.10.28
Как сохранить буфер обмена, чтобы потом его восстановить?


1-92466
Геннадий
2002-10-16 22:23
2002.10.28
Не получается у меня с потоками...


1-92495
KonuhovSergey
2002-10-18 14:07
2002.10.28
Помогите с експортом в Excel


1-92582
smok_er
2002-10-17 02:22
2002.10.28
Сообщение windows о смене IP адреса


6-92633
Виктор Сердюков
2002-08-28 12:16
2002.10.28
SendMessage в COM обьектах !