Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
1-92423
Valek
2002-10-16 10:14
2002.10.28
excel numberformat


1-92602
Yuri Btr
2002-10-17 10:38
2002.10.28
Избитый вопрос по CheckBox, RadioButton ещё раз


1-92510
kserg@ukr.net
2002-10-18 16:19
2002.10.28
File access


14-92648
Николай Быков
2002-10-06 16:31
2002.10.28
Хлеба и зрелищ!


1-92540
Separator
2002-10-16 08:41
2002.10.28
Zeos Database Objects





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский