Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.
Фильтровать и агрегировать предварительно? Ведь даже FullHD даст лишь половину этого количества при 100% заполнении экрана точками...
Re[2]: Построение графиков функции с огромным количеством точек
От:
Аноним
Дата:
17.03.14 09:52
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, Аноним, Вы писали:
А>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 5 000 000.
MD>Фильтровать и агрегировать предварительно? Ведь даже FullHD даст лишь половину этого количества при 100% заполнении экрана точками...
А на каком этапе фильтровать ? При вычислении точек функции или при построении уже на plot?
При построении особого прироста производительности не просматривается.
Re: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 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]: Построение графиков функции с огромным количеством точек
В определённое время должен отображаться весь диапазон значений или
они порциями поступают с течением времени?
Re[4]: Построение графиков функции с огромным количеством точек
От:
Аноним
Дата:
17.03.14 10:35
Оценка:
Здравствуйте, smeeld, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
S>В определённое время должен отображаться весь диапазон значений или S>они порциями поступают с течением времени?
Весь диапазон значений.
Re[3]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, smeeld, Вы писали:
S>>Здравствуйте, Аноним, Вы писали:
А>>> графики функций, где количество точек больше 5 000 000.
S>>А какие интервалы по осям?
А>По оси абсцисс от 0 до samplesCount, где samplesCount (количество отчетов может быть от 16 до 5 000 000 и больше). А>Собственно строятся следующие функции (функции сигналов от спутника): А>
Непонятно, зачем вы задуряетесь с миллионами точек.
Вот у вас, допустим, есть окно просмотра шириной w в пару тысяч пикселов. Вы хотите рассмотреть в этом окне кусочек вашей функции в диапазоне от t1 до t2. Каждому пикселу по горизонтали соответствует некоторый набор значений t — в зависимости от масштаба просмотра. В свою очередь, этому набору значений t соответствует набор значений f(t). Все эти значения придётся упихать в один пиксел, т.е. придётся нарисовать вертикальный отрезок некоторого размера. Если carrierFrequency/samplingFrequency * (t2-t1) >> w, то отрезок будет строго от noiseValue-level*code до noiseValue+level*code. Если наоборот, то высота "отрезка" будет в один пиксел. В промежуточных случаях надо точно вычислять максимальное и минимальное значение для f(t) внутри одного пиксела; благо свойства косинуса и синуса хорошо известны.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>Весь диапазон значений.
Тогда только строить функцию отображения множества значений из
диапазонов в множество значений оконных экранных координат.
Например, значение 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]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>То есть необходим метод перевода координат функции в экранные координаты ?
Ну, я так бы и сделал.
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, Вы писали:
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[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]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>А на каком этапе фильтровать ? При вычислении точек функции или при построении уже на plot? А>При построении особого прироста производительности не просматривается.
Возможно, Вам нужен какой-то аналог Sparse Matrix — действительно, зачем вычислять то, что никогда не будет использовано?
Если данные в любом случае будут куда-то дампиться (файл, база и т.п.), то имеет смысл посмотреть в сторону избыточных хранилищ с агрегацией (скажем, несколько векторов значений целевой функции с разной разрешающей способностью — 5 миллионов, 500 тысяч, 50 тысяч, 5 тысяч). Исходя из текущего масштаба представления, выбирать нужный предрасчитанный уровень агрегации.
Если пуститсья во все тяжкие, то можно сюда фрактальные структуры пытаться запихнуть — например, как при визуализации береговой линии в разных масштабах.
Re[5]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>А как же точность построения? Получается, что для 6 000 000 точек мы должны определить min, max 60 000 раз это разве не повлияет на производительность? Или я чего-то не понимаю.
Самый больший расход — посчитать 5 000 000 раз функцию f. И если нас действительно интересует точность, то без этого никуда. А вычисление min/max займет значительную часть времени только для тривиальных фунцкий.
Re[3]: Построение графиков функции с огромным количеством точек
Здравствуйте, Аноним, Вы писали:
А>>>Подскажите пожалуйста, инструменты, библиотеки, чтобы быстро строить и отображать графики функций, где количество точек больше 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.
Как то так?