Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 09:24
Оценка:
Добрый день!

Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.

Заранее спасибо!
Re: Построение графиков функции с огромным количеством точек
От: Mr.Delphist  
Дата: 17.03.14 09:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


Фильтровать и агрегировать предварительно? Ведь даже FullHD даст лишь половину этого количества при 100% заполнении экрана точками...
Re[2]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 09:52
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, Аноним, Вы писали:


А>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


MD>Фильтровать и агрегировать предварительно? Ведь даже FullHD даст лишь половину этого количества при 100% заполнении экрана точками...


А на каком этапе фильтровать ? При вычислении точек функции или при построении уже на plot?
При построении особого прироста производительности не просматривается.
Re: Построение графиков функции с огромным количеством точек
От: smeeld  
Дата: 17.03.14 09:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А> графики функций, где количество точек больше 5 000 000.


А какие интервалы по осям?
Re: Построение графиков функции с огромным количеством точек
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.03.14 09:57
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


На экране все равно больше 8192 пикселей по горизонтали на сегодня не получится. Соответственно, обрабатываем 600 точек, которые отвечают одному пикселю и строим вертикальный отрезок.
Re[2]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 10:01
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>> графики функций, где количество точек больше 5 000 000.


S>А какие интервалы по осям?


По оси абсцисс от 0 до samplesCount, где samplesCount (количество отчетов может быть от 16 до 5 000 000 и больше).
Собственно строятся следующие функции (функции сигналов от спутника):
 public static double GetRealPartSignal(
            int level, 
            double carrierFrequency, 
            double carrierPhase, 
            double samplingFrequency, 
            int code, 
            double noiseValue,
            int t)
        {
            return level * code * Math.Cos(((2 * Math.PI * carrierFrequency * t) / samplingFrequency) + carrierPhase) + noiseValue;
        }

        public static double GetImaginaryPartSignal(
            int level, 
            double carrierFrequency, 
            double carrierPhase,
            double samplingFrequency, 
            int code, 
            double noiseValue, 
            int t)
        {
            return level * code * Math.Sin(((2 * Math.PI * carrierFrequency * t) / samplingFrequency) + carrierPhase) + noiseValue;
        }


По оси ординат:
При построении действительной и мнимой части сигнала приблизительно максимальное значение до 20.
При построении спектра сигнала (БПФ) приблизительно максимальное значение до 50 000 (где-то в этом порядке).
Re[3]: Построение графиков функции с огромным количеством точек
От: smeeld  
Дата: 17.03.14 10:15
Оценка:
Здравствуйте, Аноним, Вы писали:

В определённое время должен отображаться весь диапазон значений или
они порциями поступают с течением времени?
Re[4]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 10:35
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>В определённое время должен отображаться весь диапазон значений или

S>они порциями поступают с течением времени?

Весь диапазон значений.
Re[3]: Построение графиков функции с огромным количеством точек
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.03.14 10:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, smeeld, Вы писали:


S>>Здравствуйте, Аноним, Вы писали:


А>>> графики функций, где количество точек больше 5 000 000.


S>>А какие интервалы по осям?


А>По оси абсцисс от 0 до samplesCount, где samplesCount (количество отчетов может быть от 16 до 5 000 000 и больше).

А>Собственно строятся следующие функции (функции сигналов от спутника):
А>
А> public static double GetRealPartSignal(
А>            int level, 
А>            double carrierFrequency, 
А>            double carrierPhase, 
А>            double samplingFrequency, 
А>            int code, 
А>            double noiseValue,
А>            int t)
А>        {
А>            return level * code * Math.Cos(((2 * Math.PI * carrierFrequency * t) / samplingFrequency) + carrierPhase) + noiseValue;
А>        }

А>        public static double GetImaginaryPartSignal(
А>            int level, 
А>            double carrierFrequency, 
А>            double carrierPhase,
А>            double samplingFrequency, 
А>            int code, 
А>            double noiseValue, 
А>            int t)
А>        {
А>            return level * code * Math.Sin(((2 * Math.PI * carrierFrequency * t) / samplingFrequency) + carrierPhase) + noiseValue;
А>        }
А>


Непонятно, зачем вы задуряетесь с миллионами точек.
Вот у вас, допустим, есть окно просмотра шириной w в пару тысяч пикселов. Вы хотите рассмотреть в этом окне кусочек вашей функции в диапазоне от t1 до t2. Каждому пикселу по горизонтали соответствует некоторый набор значений t — в зависимости от масштаба просмотра. В свою очередь, этому набору значений t соответствует набор значений f(t). Все эти значения придётся упихать в один пиксел, т.е. придётся нарисовать вертикальный отрезок некоторого размера. Если carrierFrequency/samplingFrequency * (t2-t1) >> w, то отрезок будет строго от noiseValue-level*code до noiseValue+level*code. Если наоборот, то высота "отрезка" будет в один пиксел. В промежуточных случаях надо точно вычислять максимальное и минимальное значение для f(t) внутри одного пиксела; благо свойства косинуса и синуса хорошо известны.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Построение графиков функции с огромным количеством точек
От: smeeld  
Дата: 17.03.14 10:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Весь диапазон значений.


Тогда только строить функцию отображения множества значений из
диапазонов в множество значений оконных экранных координат.
Например, значение 500 000 из диапазона входных данных будет соответствовать значению 1 в opengl,
или значению 1000 в оконных координатах.
Re[4]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 10:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Непонятно, зачем вы задуряетесь с миллионами точек.

S>Вот у вас, допустим, есть окно просмотра шириной w в пару тысяч пикселов. Вы хотите рассмотреть в этом окне кусочек вашей функции в диапазоне от t1 до t2. Каждому пикселу по горизонтали соответствует некоторый набор значений t — в зависимости от масштаба просмотра. В свою очередь, этому набору значений t соответствует набор значений f(t). Все эти значения придётся упихать в один пиксел, т.е. придётся нарисовать вертикальный отрезок некоторого размера. Если carrierFrequency/samplingFrequency * (t2-t1) >> w, то отрезок будет строго от noiseValue-level*code до noiseValue+level*code. Если наоборот, то высота "отрезка" будет в один пиксел. В промежуточных случаях надо точно вычислять максимальное и минимальное значение для f(t) внутри одного пиксела; благо свойства косинуса и синуса хорошо известны.

Частично понял, что вы сказали, но мы не хотим рассматривать кусочек функции, а хотим увидеть сначала всю, а потом если нужно какой-либо кусочек по скролу мыши.
Re[6]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 11:03
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Весь диапазон значений.


S>Тогда только строить функцию отображения множества значений из

S>диапазонов в множество значений оконных экранных координат.
S>Например, значение 500 000 из диапазона входных данных будет соответствовать значению 1 в opengl,
S>или значению 1000 в оконных координатах.

То есть необходим метод перевода координат функции в экранные координаты ?
Re[7]: Построение графиков функции с огромным количеством точек
От: smeeld  
Дата: 17.03.14 11:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>То есть необходим метод перевода координат функции в экранные координаты ?


Ну, я так бы и сделал.
Re[2]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 11:22
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


M>На экране все равно больше 8192 пикселей по горизонтали на сегодня не получится. Соответственно, обрабатываем 600 точек, которые отвечают одному пикселю и строим вертикальный отрезок.


То есть, допустим есть у нас массив A значений y для f(t) размера n (, где n >= 6 000 000),
Первая итерация, строим отрезок с координатами A[0], A[99]
Вторая итерация, строим отрезок с координатами A[99], A[199] и так далее, пока не достигнем A[5 999 999].

Так или по другому ?
Re[3]: Построение графиков функции с огромным количеством точек
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.03.14 11:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Mystic, Вы писали:


M>>Здравствуйте, Аноним, Вы писали:


А>>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


M>>На экране все равно больше 8192 пикселей по горизонтали на сегодня не получится. Соответственно, обрабатываем 600 точек, которые отвечают одному пикселю и строим вертикальный отрезок.


А>То есть, допустим есть у нас массив A значений y для f(t) размера n (, где n >= 6 000 000),

А>Первая итерация, строим отрезок с координатами A[0], A[99]
А>Вторая итерация, строим отрезок с координатами A[99], A[199] и так далее, пока не достигнем A[5 999 999].

А>Так или по другому ?


Это более грубо, но возможно. Я имел в виду построить отрезки

(x0, min(A[0..99]) — (x0, max(A[0..99])
(x0, A[99]) — (x1, A[100])
(x1, min(A[100..199]) — (x1, max(A[100..199])
(x1, A[199]) — (x2, A[200])
(x2, min(A[200..299]) — (x2, max(A[200..299])
(x2, A[299]) — (x3, A[300])
...
Re[4]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 11:44
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Mystic, Вы писали:


M>>>Здравствуйте, Аноним, Вы писали:


А>>>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


M>>>На экране все равно больше 8192 пикселей по горизонтали на сегодня не получится. Соответственно, обрабатываем 600 точек, которые отвечают одному пикселю и строим вертикальный отрезок.


А>>То есть, допустим есть у нас массив A значений y для f(t) размера n (, где n >= 6 000 000),

А>>Первая итерация, строим отрезок с координатами A[0], A[99]
А>>Вторая итерация, строим отрезок с координатами A[99], A[199] и так далее, пока не достигнем A[5 999 999].

А>>Так или по другому ?


M>Это более грубо, но возможно. Я имел в виду построить отрезки


M>(x0, min(A[0..99]) — (x0, max(A[0..99])

M>(x0, A[99]) — (x1, A[100])
M>(x1, min(A[100..199]) — (x1, max(A[100..199])
M>(x1, A[199]) — (x2, A[200])
M>(x2, min(A[200..299]) — (x2, max(A[200..299])
M>(x2, A[299]) — (x3, A[300])
M>...

А как же точность построения? Получается, что для 6 000 000 точек мы должны определить min, max 60 000 раз это разве не повлияет на производительность? Или я чего-то не понимаю.
Re[3]: Построение графиков функции с огромным количеством точек
От: Mr.Delphist  
Дата: 17.03.14 11:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А на каком этапе фильтровать ? При вычислении точек функции или при построении уже на plot?

А>При построении особого прироста производительности не просматривается.

Возможно, Вам нужен какой-то аналог Sparse Matrix — действительно, зачем вычислять то, что никогда не будет использовано?

Если данные в любом случае будут куда-то дампиться (файл, база и т.п.), то имеет смысл посмотреть в сторону избыточных хранилищ с агрегацией (скажем, несколько векторов значений целевой функции с разной разрешающей способностью — 5 миллионов, 500 тысяч, 50 тысяч, 5 тысяч). Исходя из текущего масштаба представления, выбирать нужный предрасчитанный уровень агрегации.

Если пуститсья во все тяжкие, то можно сюда фрактальные структуры пытаться запихнуть — например, как при визуализации береговой линии в разных масштабах.
Re[5]: Построение графиков функции с огромным количеством точек
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.03.14 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как же точность построения? Получается, что для 6 000 000 точек мы должны определить min, max 60 000 раз это разве не повлияет на производительность? Или я чего-то не понимаю.


Самый больший расход — посчитать 5 000 000 раз функцию f. И если нас действительно интересует точность, то без этого никуда. А вычисление min/max займет значительную часть времени только для тривиальных фунцкий.
Re[3]: Построение графиков функции с огромным количеством точек
От: peterbes Россия  
Дата: 17.03.14 12:05
Оценка: 15 (1) +1
Здравствуйте, Аноним, Вы писали:

А>>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.


Эффективно разреживать массив при зуминге можно с помощью алгоритма Рамера-Дугласа-Пекера для точек попадающих в выбранный диапазон, исходный график можно усреднить самым примитивным фильтром подобранным под тип данных, если это гладкие данные, то пойдет обычное усреднение по группе точек, если это какие-то случайные данные или какое-то броуновское движение, то нужно искать фильтр для таких данных
Re[6]: Построение графиков функции с огромным количеством точек
От: Аноним  
Дата: 17.03.14 12:09
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>А как же точность построения? Получается, что для 6 000 000 точек мы должны определить min, max 60 000 раз это разве не повлияет на производительность? Или я чего-то не понимаю.


M>Самый больший расход — посчитать 5 000 000 раз функцию f. И если нас действительно интересует точность, то без этого никуда. А вычисление min/max займет значительную часть времени только для тривиальных функций.


То есть наверно есть толк как то этот процесс оптимизировать, то есть выбрать наиболее оптимальную длину отрезка L (xi, min(A[yi..L]) — (xi, max(A[yi..L])?
Если у нас есть плот, ну или графический контрол куда мы будем выводить график функции, у нас есть его ширина и высота width и height.
Есть массив x значений функции от 0 до n , y значений функции от 0 до n
double[] x = new double[n];
double[] y = new double[n];

Максимальное количество точек по оси абсцисс = height (высоте графического контрола).
Максимальное количество точек по оси ординат = width (ширине графического контрола).

Тогда получается, что L (оптимальная длина отрезка) = width / 2.
Как то так?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.