На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

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

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Вопрос о построении графиков
    Доброе время суток.
    пытаюсь сотворить подобие тренда:
    ExpandedWrap disabled
      std::queue<DataForExchange> glDataExch;
       
      std::mutex mut;
      std::condition_variable data_cond;
       
      bool endWork = false;
       
      double offsetTX = 0.0, offsetMX = 0.0;
       
      ...
       
      void CIPO1::_getData()
      {
          FILE* fp;
          fopen_s(&fp,"D:/Programs/C++/ProjectGraph/bin/Data/IMET_L1.var01","r");
          if (fp == NULL)
          {
              ErrMsg("Error");
              return;
          }
       
          TCHAR* tcTok = 0;
          TCHAR del[] = " \t\r\n";
       
          TCHAR buff[1024] = "";
          DataForExchange tmp;
              
          short c = 0;
       
          while (_fgetts(buff,1024,fp) != NULL)
          {  
              c = 0;
              
              tmp.t = _ttof(_tcstok(buff,del));
              
              while (tcTok = _tcstok(0,del))
              {
                  if (c == 0)
                      tmp.x = _ttof(tcTok);
                  if (c == 1)
                      tmp.y = _ttof(tcTok);
                  if (c == 2)
                      tmp.z = _ttof(tcTok);
                  if (c == 3)
                      tmp.xv = _ttof(tcTok);
                  if (c == 4)
                      tmp.yv = _ttof(tcTok);
                  if (c == 5)
                      tmp.zv = _ttof(tcTok);
                  ++c;
              }
       
              double skv = tmp.x*tmp.x + tmp.y*tmp.y + tmp.z*tmp.z;
              tmp.mS = sqrt(skv);
              double vkv = tmp.xv*tmp.xv + tmp.yv*tmp.yv + tmp.zv*tmp.zv;
              tmp.mV = sqrt(vkv);
              
              std::lock_guard<std::mutex> lg(mut);
              glDataExch.push(tmp);
              
              data_cond.notify_one();
       
          }
       
          std::lock_guard<std::mutex> lg(mut);
          
          endWork = true;
          data_cond.notify_one();
       
      }


    Отрисовка:

    ExpandedWrap disabled
      void drawScena()
      {
          std::queue<DataForExchange> items;
          DataForExchange tmp;
          std::unique_lock<std::mutex> lg(mut);
          while (true)
          {  
              data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;});
              
              items = std::move(glDataExch);
                              
              for (unsigned int i = 0; i < items.size(); ++i)
              {
                  tmp = items.front();
                  glColor3f(1.0,1.0,1.0);
                  glBegin(GL_LINES);
                      glVertex2d(offsetTX,offsetMX);  
                      if (tmp.t = 0.0)
                          glVertex2d(tmp.t,tmp.mS/1000.0);
                      else
                          glVertex2d(tmp.t/1000.0,tmp.mS/1000.0);
                  glEnd();
       
                  offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0;
       
                  
                  items.pop();
              }
       
              if (endWork)
                  break;
          }
          
      }

    Ну, и сама функция отрисовка сцены:
    ExpandedWrap disabled
      int _tmain(int argc, _TCHAR* argv[])
      {
          ShowWindow(GetConsoleWindow(),SW_HIDE);
       
          CIPO1 exmpl;
          std::thread t1(&CIPO1::_getData,&exmpl);
       
          glutInit(&argc,argv);
          glutInitWindowPosition(20,20);
          glutInitWindowSize(winWidth,winheight);
          glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
          void _init();
          _init();
          
          glutCreateWindow("ipo1_Graph");
       
          void _DisplayFnc();
          glutDisplayFunc(_DisplayFnc);
          void _ReshapeFnc(int,int);
          glutReshapeFunc(_ReshapeFnc);
       
          glutMainLoop();
       
          t1.join();
          return 0;
      }
       
      void _init()
      {
          glClearColor(0.0,0.0,0.0,0.0);
          glMatrixMode(GL_PROJECTION);
          gluOrtho2D(0.0,(GLdouble)winWidth,-(GLdouble)(winheight/2),(GLdouble)(winheight/2));
      }
      void _ReshapeFnc(int width,int height)
      {
          glClearColor(0.0,0.0,0.0,0.0);
          glMatrixMode(GL_PROJECTION);
          gluOrtho2D(0.0,(GLdouble)width,-(GLdouble)(height/2),(GLdouble)(height/2));
          glClear(GL_COLOR_BUFFER_BIT);
      }
       
      void _DisplayFnc()
      {
          glClear(GL_COLOR_BUFFER_BIT);
       
          drawScena();
       
          glFlush();
          
      }

    График не выводиться. Что я делаю не так? :unsure: Подскажите, пожалуйста :rolleyes:
      Проблема, быть может, не в этом, но ниже наверняка один знак равенства пропущен:
      "if (tmp.t == 0.0)" надо?!
        Доброе время суток.

        Да, именно это было и причиной :blush: Спасибо. Я уже хотел :wall:

        Добавлено
        Вот только я заметил непонятное для меня.
        ExpandedWrap disabled
          void _DisplayFnc()
          {
              glClear(GL_COLOR_BUFFER_BIT);
           
              drawScena();
           
              //glFlush();
           
          }

        Я убрал glFlush() из _DisplayFnc() для того, чтобы видеть процесс. И включил его в drawScena()
        ExpandedWrap disabled
              void drawScena()
              {
                  std::queue<DataForExchange> items;
                  DataForExchange tmp;
                  std::unique_lock<std::mutex> lg(mut);
                  while (true)
                  {  
                      data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;});
              
                      items = std::move(glDataExch);
              
                      for (unsigned int i = 0; i < items.size(); ++i)
                      {
                          tmp = items.front();
                          glColor3f(1.0,1.0,1.0);
                          glBegin(GL_LINES);
                              glVertex2d(offsetTX,offsetMX);  
                              if (tmp.t == 0.0)
                                  glVertex2d(tmp.t,tmp.mS/1000.0);
                              else
                                  glVertex2d(tmp.t/1000.0,tmp.mS/1000.0);
                          glEnd();
              
                          offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0;
              
                          glFlush();
           
                          items.pop();
                      }
              
                      if (endWork)
                          break;
                  }
              
              }

        Вроде прога работает, только через какое-то время график сдвинулся влево, а когда данные кончились вернулся назад. Я увеличил размеры окна проги (winWidth,winheight) и увидел, что этот сдвиг вызывает вертикальная прямая, которая каким-то ... и, не понятно с какого перепугу, рисуется параллельно правому борту окна. :unsure: Подскажите, пожалуйста, что это за напасть?
        Может по этому и glutReshapeFunc(_ReshapeFnc) как-то не так работает?
          В вашем конкретно этом случае условие if/else вообще не нужно, ибо случай else полностью обрабатывает вариант if'а при tmp.t равном нулю.
          Так что можете убрать и посмотреть, что выйдет. ;)
            Доброе время суток
            Цитата Славян @
            Так что можете убрать и посмотреть, что выйдет

            Да, действительно вы правы.

            Добавлено
            Вот, только я не понимаю, откуда берется та прямая :unsure:
            Может потому, что я добавил задержку
            ExpandedWrap disabled
              void drawScena()
                  {
                      std::queue<DataForExchange> items;
                      DataForExchange tmp;
                      std::unique_lock<std::mutex> lg(mut);
                      while (true)
                      {  
                          data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;});
               
                          items = std::move(glDataExch);
               
                          for (unsigned int i = 0; i < items.size(); ++i)
                          {
                              tmp = items.front();
                              glColor3f(1.0,1.0,1.0);
                              glBegin(GL_LINES);
                                  glVertex2d(offsetTX,offsetMX);  
                                  glVertex2d(tmp.t/1000.0,tmp.mS/1000.0);
                              glEnd();
               
                              offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0;
                              
                              //Вариант 2
                              std::this_thread::sleep_for(200);  
               
                              glFlush();
               
                              items.pop();
                              
                              //Вариант 1
                              std::this_thread::sleep_for(200);  
                          }
               
                          if (endWork)
                              break;
                      }
               
                  }

            Причем, когда применяю "Вариант 1" линия рисуется одним цветом, а при "Вариант 2" - другим :unsure:
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script Execution time: 0,1078 ]   [ 17 queries used ]   [ Generated: 17.10.19, 13:58 GMT ]