• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Dark19
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

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();
}
 
L

lazybiz

но i в нем тогда не растет по одному, а сразу же от 1 до 1000
Не может быть такого. Судя по коду i растет от 1 до 999 включительно увеличиваясь на единицу.

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

Dark19

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

lazybiz

Нет, ты не понял, то что ты написал в функции timer - полный бред. glutTimerFunc должна быть вызвана единожды при инициализации, а ты ее зачем то в саму функцию таймера запихал.

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

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

lazybiz

Не знаю в чем дело, но у меня глючит GLUT, написанная мной программа работает не так как надо. Помочь пока не могу.
 
D

Dark19

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!