Запись координат в массив в реал тайм

Тема в разделе "C/C++/C#", создана пользователем Dark19, 21 июн 2011.

Статус темы:
Закрыта.
  1. Dark19

    Dark19 Гость

    Возникла проблема записи координат от мышки в массив. Мне нужно чтобы координаты сохранялись в массиве и тут же отрисовывались после каждого события от мышки. Я решил сделать запись координат с помощью цикла for (
    Код (C++):
    for (int i=1;i<1000;i++)
    {
    glVertex2f(x1,z);
    glVertex2f(x2,z1);
    glEnd();
    mas3[i-1]=x;
    mas4[i-1]=y;
    mas1[i-1]=x2;
    mas2[i-1]=z1;



    glVertex2f(mas1[i-1],mas2[i-1]);
    glVertex2f(mas3[i-1],mas4[i-1]);
    glEnd();

    cout<<i<<endl;

    }
    ), но i в нем тогда не растет по одному, а сразу же от 1 до 1000, пока я еще и не начал рисовать. Мне нужно сделать так чтобы i росло по 1 с каждой нарисованной линией и координаты сохранялись в массив по очереди и потом отрисовывались. Подскажите как можно сделать?

    Код (C++):
    #include <windows.h>
    #include <iostream>
    #include <glut.h>
    using namespace std;
    int const n=1000;
    int i=1,m=0,j=0,k=0,p=1;
    int x=0,b=0;
    int x1,x2;
    int y=0,c=0;
    int z,z1;
    int mas1[n],mas2[n],mas3[n],mas4[n];
    bool down=false, l=false;
    unsigned char kei;



    void keyboard ( unsigned char key, int x, int y)
    {
    switch (key)
    {

    case 'q':

    exit(0);

    break;
    }
    }


    void reshape(int w, int h)
    {
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluOrtho2D(0, w, h, 0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }


    void mouse(int button, int state, int ax, int ay)
    {
    if (state == GLUT_DOWN)
    {
    down=true;
    l=true;
    }
    else
    {
    down=false;
    l=false;
    }
    x=ax;
    y=ay;
    }
    void motion(int ax, int ay)
    {
    x1=x;
    z=y;

    if (l)
    {

    x2=ax;
    z1=ay;
    }

    if (!l)
    {
    x1=ax;
    z=ay;
    }




    }

    void Draw()
    {

    glClearColor(0.0,0.0,0.0,0.0);                    //Цвет, в который очищается окно
    glClear (GL_COLOR_BUFFER_BIT);                      //Очищение

    glColor3f(1.0,0.0,0.0);


    glBegin(GL_LINES);
    for (int i=1;i<1000;i++)
    {
    glVertex2f(x1,z);
    glVertex2f(x2,z1);
    glEnd();
    mas3[i-1]=x;
    mas4[i-1]=y;
    mas1[i-1]=x2;
    mas2[i-1]=z1;



    glVertex2f(mas1[i-1],mas2[i-1]);
    glVertex2f(mas3[i-1],mas4[i-1]);
    glEnd();

    cout<<i<<endl;

    }  

    glutSwapBuffers();

    }


    void timer(int=0)
    {
    Draw();
    glutTimerFunc (1,timer,0);


    }
    void Initialize()
    {
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    glOrtho (0, 1280, 1024, 0, -1, 1);


    }
    int main(int iArgc,char** cppArgv)
    {



    glutInit (&iArgc, cppArgv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowPosition (0, 0);
    glutCreateWindow ("GRAF");
    Initialize();
    glutFullScreen();
    glutReshapeFunc (reshape);

    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    //glutPassiveMotionFunc(motion);
    glutDisplayFunc (Draw);




    timer();

    glutMainLoop ();




    cin.get();
    cin.get();
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Не может быть такого. Судя по коду i растет от 1 до 999 включительно увеличиваясь на единицу.

    Да, и вот эта запись мне еще мозг разъедает:
    Код (C++):
    void timer(int=0)
    {
    Draw();
    glutTimerFunc (1,timer,0);
    }
    Объясни, в чем её смысл и как она работает?
     
  3. Dark19

    Dark19 Гость

    она работает как glutRedisplayFunc(), она обновляет экран что бы была отрисовка по координатам от мышки, так как координаты меняются то она просто обновляет экран и линия уже рисуется по новым координатам.
    А і растет от 1 и до 999 сразу же как только запустишь, но если в glutMotionFunc записывать координаты в массив в цикле, то i растет от 1 до 30 или 31 или 32 ... в зависимости от длины линии наверное, и я так понимаю что glutMotionFunc просто записывает в массив каждую координату (ну типа линию по точкам), а как сделать что бы он считал линию как целую я незнаю.
    Есть такая идея: убрать glutMotionFunc и работать с glutMouseFunc, брать координаты х и у и записывать в массив, но только будет рисоваться как ламаная линия, я так думаю.
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Нет, ты не понял, то что ты написал в функции timer - полный бред. glutTimerFunc должна быть вызвана единожды при инициализации, а ты ее зачем то в саму функцию таймера запихал.

    По поводу самого алгоритма - все не так. Слишком много лишнего.
    glutMotionFunc(motion); и motion() - не нужны.
    В функции mouse зачем state проверяешь?
    Для чего нужны четыре массива?
    Все не так.

    А тебе обязательно надо координаты в массив записывать? Может просто рисовать линии и все?
     
  5. Dark19

    Dark19 Гость

    Нет не обязательно, надо что бы рисовалось от мышки просто и не пропадало, а оставалось, ну типа как в граф редакторе.
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Не знаю в чем дело, но у меня глючит GLUT, написанная мной программа работает не так как надо. Помочь пока не могу.
     
  7. Dark19

    Dark19 Гость

    ладно я уже разобрался с этим, только меню осталось. Можешь помочь с меню в с++, или дай ссылку на пример меню что бы мышкой можно было пункты выбирать или как то может от нажатия клавиш, только что бы не нажимать клавишу и enter, а сразу входило. И если можешь дать пример на меню в OpenGL.
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
  9. Dark19

    Dark19 Гость

    спасибо)
     
Загрузка...
Статус темы:
Закрыта.

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