Получить график в реальном времени, синусоиду, состоящую из 100 точек и частотой от 0,01 гц до 0,5 г

Тема в разделе "Pascal and Delphi", создана пользователем ChiliC, 25 мар 2015.

  1. ChiliC

    ChiliC New Member

    Регистрация:
    25 мар 2015
    Сообщения:
    2
    Симпатии:
    0
    Задача состоит в создании фильтра Analog to Digital.
    Имеем такую схему:
    [​IMG]
    и вот такую функцию:
    y(n*T)=a*x(n*T)+a*x((n-1)*T)-b*y((n-1)*T)
    a=T/T+2*R*C
    b=T-2*R*C/T+2*R*C
    T=1 секунде
    Амплитудная характеристика:
    [​IMG]
    Нужно получить график в реальном времени, синусоиду, состоящую из 100 точек и частотой от 0,01 Гц до 0,5 Гц получаемую с приборов.
    Наброски программы:

    Код (Text):

    r:='M2T5E';
    send(adress,r,status);
    delay(1000);
    enter(r,255,1,adress,status);
    s:=copy(r,3,12);
    val(s,x[i],code);
    initialize(21,0);
    i:=3; j:=1;
    intergraph(i,j,'C:\TP6\BGI');
    line(x1,y1,x2,y2);
    putpixel(x1,y1,red);
    cleardevice;
     
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    рисовать вот так вот линиями очень сложно. Устарело это лет на 20. Эти ваши line и putpixel рисуют в консоли BGI графикой, но так уже давно никто не делает и BGI поддерживается далеко не везде...

    Есть готовые, удобные библиотеки. Все что от вас надо - сгенерировать массив точек (или 2 массива - отдельно координаты x, отдельно y). Ну и передать эти массивы рисовальщику графика. Вы сэкономите кучу времени, программа будет в тысячи раз надежнее (т.к. код таких библиотек используется миллионами людей ежедневно и баги фиксятся) и удобнее (юзер получит возможность масштабировать график, например). С небольшими доработками можно приделать к графику легенду и изменить тип диаграммы, например.

    Если вы используете библиотеку Qt - то для отображения графиков, например, можно использовать QCustomPlot или QtCharts (последний раньше был платным, сейчас - не знаю, вроде как ходили слухи что стал бесплатным). Кроме того, есть Qwt, например.

    Т.е. после того, как ты каким-то образом настроишь отображение линий (толщина графика, цвет, цвет точек, оси координат и т.п.):
    Код (C++):
    m_curve->attach(m_plot);
      m_approx->attach(m_plot);
     
      m_curve->setVisible(true);
      m_approx->setVisible(true);
     
      m_curve->setPen(QPen(Qt::red, 2));
     
      m_approx->setBaseline(0);
      m_approx->setBrush(QColor(0, 0, 255, 50));
    И заполнишь массивы точек (тебе это надо делать в любом случае - даже при использовании древнего BGI) - тут пример, но ты сам введешь свою функцию, при желании:
    Код (Text):
    for (int i = 0; i < m_points_num; ++i) {
       x.push_back(a + i * h);
       y.push_back(integfun(a + i * h));
    }
    Тебе останется только установить эти данные для линии графика и обновить график:
    Код (Text):
    m_curve->setSamples(x, y);
     
    m_plot->replot();
    Пример кода я взял из статьи про Qwt. Весь код ты можешь скопировать без изменения - изменишь только функцию генерации точек и все будет работать.
     
    #2 rrrFer, 25 мар 2015
    Последнее редактирование модератором: 25 мар 2015
  3. ChiliC

    ChiliC New Member

    Регистрация:
    25 мар 2015
    Сообщения:
    2
    Симпатии:
    0
    спасибо большое за ответ, но задача стоит именно в BGI. Не так уж оно и сложно получается.
    Теперь осталось подключить прибор и в реальном времени измерять частоту и строить график.
    [​IMG]
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Но значит у вас будет немного другой цикл. Вам надо помещать получаемые данные в массив и с заданным интервалом времени перестраивать график. Если данных может быть много (они же поступают постоянно) - то вместо массива лучше использовать связный список (это позволит быстро удалять старые данные, если скажем, надо рисовать график только за последние 30 секунд).
     
Загрузка...

Поделиться этой страницей