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

Вниз

Пишу программу рисования графика по точкам, и никак не получается   Найти похожие ветки 

 
Александр_ИСТ   (2003-08-04 13:55) [0]

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

Исходные данные: множество y-координат точек (с x-координатами все просто), высота графика в px, можно заставить пользователя еще вводить количество промежутков.

Требуется: нарисовать график таким образом, чтобы он был как можно красивее помещался на рисунке (примерно посередине, и чтобы верхняя его точка была как можно ближе к верхнему краю графика, а нижняя - к нижнему), и шаг, а также значения, по которым ведется отчет, были как можно красивее (1,2,5,10 и т п).

Может какие алгоритмы подобные уже есть?

Пожалуйста, помогите!


 
Vlad Oshin ©   (2003-08-04 14:14) [1]


> Исходные данные: множество y-координат точек (с x-координатами
> все просто), высота графика в px, можно заставить пользователя
> еще вводить количество промежутков.


не понятно


 
Александр_ИСТ   (2003-08-04 14:24) [2]

>не понятно

График, похожий на: http://chart.yahoo.com/c/1y/_/_dji.gif

Они каким-то образом выбрали из минимального и максимального значения (примерно 7300 и 9200 соответственно) вот так:
min = 7000
max = 10000
шаг = 1000

И красиво все смотрится... Вот как можно так выбрать?


 
Vlad Oshin ©   (2003-08-04 14:39) [3]

обычный график,

отсечем область снизу(q) = min-(max-min)*0.1 (10% до min чтоб осталось)

накинем область сверху(w) = max+(max-min)*0.1 (10% до max чтоб осталось)

шаг - (w-q)/сколько шагов надо

пропорционально растянуть график.



 
Александр_ИСТ   (2003-08-04 15:20) [4]

Это слишком просто, я тоже так думал...

q = 7300-1900*0,1 = 7300-190 = 7110
w = 9200+1900*0,1 = 9200+190 = 9390
шаг = 9390 - 7110 / 3 = 760

Ну и что это за значения? У них - красивее... 10000, 7000 и 1000 соответственно. Как вот такие получить, вот в чем вопрос. :-(



 
Александр_ИСТ   (2003-08-04 15:25) [5]

У меня был вариант, который работает на этих числах, но на других не работает :-( :

1. Считаем шаг таким образом:

h = (max-min)/k , где max - максимальный, min - минимальный элемент данной последовательности, k - кол-во интервалов.
таким образом получаем предварительный шаг.
Например - максимум 9200, минимум 7300, нужно разделить на 3 интервала, и
h = (9200-7300)/3 = 633,3(3)

2. Далее, такая мысль, делаем h в виде
h = h_осн * 10 в степени step
Пример:
h = 6,333 * 10 в степени 2 ;

3. h округляем до ближайшей из цифр: 2, 5 или 10 - и получаем тот шаг, который нам нужен
h = 10 * 10 в степени 2 = 1000;

4. Высчитываем максимальное значение на графике:
maxgraph = (floor(max/h)+1)*h , где floor - выделение целой части

maxgraph = (floor(9200/1000)+1)*1000 = 10000

5. Строим график из этих предположений:
maxgraph = 10000
h = 1000
10000 -------------------------------------
9000 -------------------------------------
8000 -------------------------------------
7000 -------------------------------------

И все помещается красиво. В общем все, как у них.


Но, если возьмем цифры, например - 81 и 15, интервалов 4

1. h = (81-15)/4 = 16,5

2. h = 1,65 * 10 в степени 1 ;

3. h = 2 * 10 в степени 1 = 20;

4. maxgraph = (floor(81/20)+1)*20 = 100

5. Строим график из этих предположений:
maxgraph = 100
h = 20

100 ------------------------------------
80 ------------------------------------
60 ------------------------------------
40 ------------------------------------
20 ------------------------------------

И тут нас ждет большое разочарование, поскольку 15 не входит в наш график, оно ниже, что недопустимо.

Были еще подобные алгоритмы, но все они заканчивались вот такими несоответствиями :-( Или же график вообще был только в первом интервале, а в остальных - пусто.

Вот я и подумал, ведь задача то часто встречающаяся. Может есть какой-нибудь стандартный способ, который хорошо к этой задаче подходит, потому как я уже 3 дня сижу, а ничего дельного в голову не приходит. :-(


 
Vlad Oshin ©   (2003-08-04 15:35) [6]

при вычислении шага надо накинуть к мах и мин пропорционально их разницы несколько процентов


 
Vlad Oshin ©   (2003-08-04 15:38) [7]

еще одна безумная идея...
забить значения в exсel и пусть сам строит



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
3-68179
AkaSaint
2003-07-28 18:28
2003.08.21
Реализация Delta-пакета от сервера приложений к клиенту


14-68532
prihod
2003-08-05 11:04
2003.08.21
Install Shield


1-68397
дим
2003-08-07 17:28
2003.08.21
Как можно зациклить


3-68208
Юля
2003-07-28 11:50
2003.08.21
Не учитывать в отчете отрицательные суммы


3-68189
Iry
2003-07-28 17:14
2003.08.21
FastReport TfrChartView