|
Отображение большого колличества точек на маленьком экране |
|
|
|
 |
Ответов
|
Nov 26 2010, 20:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Petrovich @ Nov 26 2010, 23:23)  Господа, есть задача, помогите пожалуйста решить. Есть выборка сигнала длинной 10000 семплов. Всю эту выборку нужно отобразить на экране длинной в 300 точек. Как это сделать так, что бы из исходной выборки не были выкинуты характерные максимумы и минимумы? При этом алгоритм должен быть не ресурсоемким... Вроде все логично, делал так: разбивал на блоки по 10000/300 семплов, в каждом искал min,max рисовал вертикальную линию от min до max, при этом х-координата линии равна номеру блока. В моем случае было быстрее, чем на каждый семпл ставить точку с координатой (trunc (x/(10000/300)),y) (здесь х-номер отсчета, у - значение)
Сообщение отредактировал alexPec - Nov 26 2010, 20:44
|
|
|
|
|
Jan 28 2011, 20:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Petrovich @ Jan 28 2011, 22:18)  С отображением большого количества точек получилось все хорошо, Но сейчас задача немного изменилась. Как правильно отобразить например 350 или любое не кратное значение на экране размером 300. Как тут быть? Это вроде называется ресамплинг, но четкого описания алгоритма не нашел. Кто нибудь знает как это делается корректно? А зачем Вам ресамплинг? У Вас точек на реальную горизонтальную координату по любому >1. Так эти 50 лишних точек равномерно распределить по 300. Получим такую картину: 5 точек ставим как они есть, 6-ю, 7-ю - колдонуть как нибудь (ну или тот же мин-макс или среднее или еще чего, то есть сделать из 2-х одну), затем снова 5 точек как есть, снова 2 точки в 1 слепленные. Получится 50 точек более-менее равномерно размазаны по графику. Конечно линейность представления результата пострадает, но если это не принципиально - гораздо менее затратно по ресурсам чем ресамплинг. Кстати если при слеплении мин-макс использовать, все мин и макс остаются на графике
Сообщение отредактировал alexPec - Jan 28 2011, 20:32
|
|
|
|
|
Jan 28 2011, 20:43
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 2-06-05
Из: Днепропетровск
Пользователь №: 5 658

|
Цитата(alexPec @ Jan 28 2011, 23:31)  А зачем Вам ресамплинг? У Вас точек на реальную горизонтальную координату по любому >1. Так эти 50 лишних точек равномерно распределить по 300. Получим такую картину: 5 точек ставим как они есть, 6-ю, 7-ю - колдонуть как нибудь (ну или тот же мин-макс или среднее или еще чего, то есть сделать из 2-х одну), затем снова 5 точек как есть, снова 2 точки в 1 слепленные. Получится 50 точек более-менее равномерно размазаны по графику. Конечно линейность представления результата пострадает, но если это не принципиально - гораздо менее затратно по ресурсам чем ресамплинг. Кстати если при слеплении мин-макс использовать, все мин и макс остаются на графике Это понятно, но мне нужен общий принцип, мне не только 350 точек нужно отобразить, а например 3323, 561, 305... в общем любое кратное и не кратное 300мстам точкам экрана
|
|
|
|
|
Jan 28 2011, 22:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Petrovich @ Jan 28 2011, 23:43)  Это понятно, но мне нужен общий принцип, мне не только 350 точек нужно отобразить, а например 3323, 561, 305... в общем любое кратное и не кратное 300мстам точкам экрана Извините, принцип думал из примера понятен. Поясню как думаю. Делим нацело ко-во точек которое нужно отобразить (а) на количество пикселей экрана где это отображается ( B ) - пусть получается m. Далее смотрим остаток от целочисленного деления ( a mod b ). Если ноль - группируем исходные точки в блоки по m и к каждому блоку применяем алгоритм (мин-макс, усреднение и т.д.). Группировка такая получается (по кол-ву точек в блоке): m, m, m,.....,m ; т.е. в вашем случае 300 раз (300 блоков) по m элементов. Если не ноль - то находим как часто "размазываемые" точки должны появляться в блоках, т.е. делим ( a mod B ) на b - результат float . Пусть получается С, 0<C<1. Далее группируем исходные точки в блоки, но уже не по m, а следующим образом. 1 Группируем блок из m точек, 2 Производим операцию d=(d+c); 3 Если d>1, то: {d=d-1 и следующий блок будет из m+1 точек}, иначе {следующий блок из m точек} 4 к шагу 2 Например: 561 точка. 561/300=1, (561 mod 300)=261, C=261/300=0,87 Группируем блоки: 1 эл-т ;d=0+0,87=0,87 1 эл-т; d=0,87+0,87=1,74; d=1,74-1=0,74; 2 эл-та; d=0,74+0,87 = 1,61; d=1,61-1=0,61; 2 эл-та; d=0,61+0,87 = 1,48; d=1,48-1=0,48; .... И так у вас должно получиться 300 блоков (300 строчек) с разным ко-вом элементов в блоке. Ну в последнем блоке может получиться (возможно) m-1 или m+2 элемента - надо думать а неохота уже Кол-во эл-тов в блоках будет отличаться на 1. Далее обрабатываем каждый блок таким же алгоритмом (мин-макс, среднее и т.д.) и отображаем 300 точек.
Сообщение отредактировал alexPec - Jan 28 2011, 22:11
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|