Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 06.07.2017
Сообщений: 7
1

Нарисовать траекторию движения

25.04.2018, 18:16. Показов 2737. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, никак не получается, есть нарисованный квадрат с точкой в центре, при нажатии клавиши квадрат одновременно крутится вокруг своего центра и движется вниз, это легко, но сама эта центральная точка должна оставлять за собой след, то есть рисовать прямую, соединяющую середину квадрата в данный момент и середину квадрата, в тот момент, когда он начинал движение, у меня эта прямая вертится как попало из-за поворота и перемещения осей, а должна оставаться неизменной, никак не могу подобрать формулу, чтобы все это дело зафиксировалось
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2018, 18:16
Ответы с готовыми решениями:

Нарисовать траекторию движения тела
3. Тело с массой М брошено под углом L к горизонту с начальной скоростью V. а) отрисовать...

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

Нарисовать на экране траекторию движения частицы
Частица (от заданной начальной точки) совершает хаотичное движение, двигаясь в случайном...

Массив: Нарисовать траекторию движения объекта по массиву...
Всем привет, имеется такая задача: Сгенерировать двумерный массив размером MxN. Заполнить его...

7
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
25.04.2018, 19:21 2
Yaroslav1998, перед поворотом и перемещением сделайте пуш матрицы а после них - поп, затем рисуйте по координатам ломанную
0
0 / 0 / 0
Регистрация: 06.07.2017
Сообщений: 7
25.04.2018, 20:13  [ТС] 3
Пробовал, так вообще перестает что либо двигаться

вот основной код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class Square : public GeomObgect
{
public:
    Point A;
    Point B;
    Point C;
    Point D;
 
    virtual void Draw() const{
        glBegin(GL_LINE_STRIP);//рисуем квадрат
        glColor3f(0.0, 1.0, 0.0);
        glVertex2f(A.x, A.y);
        glVertex2f(B.x, B.y);
        glVertex2f(C.x, C.y);
        glVertex2f(D.x, D.y);
        glVertex2f(A.x, A.y);
        glEnd();
        
        glBegin(GL_TRIANGLE_STRIP);//закрашиваем
        glColor3f(0.0, 1.0, 0.0);
        glVertex2f(A.x, A.y);
        glVertex2f(B.x, B.y);
        glVertex2f(C.x, C.y);
        glVertex2f(D.x, D.y);
        glVertex2f(A.x, A.y);
        glEnd();
 
        glBegin(GL_POINTS);//точка в центре
        glColor3f(1.0, 0.0, 0.0);
        glVertex2f((A.x +C.x)/2, (A.y+C.y)/2);
        glEnd();
 
 
    
 
    }
   //конструкторы
    Square(){
        A;
        B;
        C;
        D;
    }
    Square(Point aA, Point aB, Point aC, Point aD){
        A = aA;
        B = aB;
        C = aC;
        D = aD;
    }
 
 
};
void myInit(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glColor3f(0.233, 0.55, 0.88);
    glPointSize(4);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-200, 201, 0, 400);
 
}
 
Point A(-20, 360);
Point B(-20, 400);
Point C(21, 400);
Point D(21, 360);
GeomObgect* P3 = new Square(A, B, C, D);
 
Point O;
//рисуем след
void Draw1(){
 
    glBegin(GL_LINES);
    glVertex2f((A.x + C.x) / 2, (A.y + C.y) / 2+j);
    glVertex2f((A.x + C.x) / 2, (A.y + C.y) / 2);
    glEnd();
    
}
 
void Keyboard(unsigned char key, int x, int y){
 
    switch (key){
 
    case'q':{
        glClear(GL_COLOR_BUFFER_BIT);
 
        //вращаем
        glTranslated((A.x + C.x) / 2, (A.y + C.y) / 2, 0);
        glRotated(45, 0, 0, 1);
        i = i + 45;
        glTranslated(-(A.x + C.x) / 2, -(A.y + C.y)/ 2, 0);
        
        //передвигаем
        glRotated(-i, 0, 0, 1);
        glTranslated(0, -3, 0);
        j=j+3;
        glRotated(i, 0, 0, 1);
 
 
        glFlush();
        break;
    }
 
    }
}
 
 
 
void myDisplay(){
    glClear(GL_COLOR_BUFFER_BIT);
    glutIdleFunc(myDisplay);
    
    glutKeyboardFunc(Keyboard);
    P3->Draw();
    Draw1(); 
    
    
  
 
    glFlush();
}
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
25.04.2018, 21:36 4
Yaroslav1998,
в конец init вставляем вот это
C++
1
2
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
рисуем квадрат вот так
C++
1
2
3
4
5
6
7
8
    glPushMatrix();
 
    glRotatef(...);
    glTranslatef(...);
 
    // тут рисование
 
    glPopMatrix();
после этого рисуем ломанную вот так
C++
1
2
3
4
5
    glPushMatrix();
 
    // тут рисование от точки к точке - что бы вы могли это сделать нужно где-то сохранять точки - например в векторе постоянно пополняемом точками при движении
 
    glPopMatrix();
Добавлено через 3 минуты
...кстати закрашивание можно делать через
C++
1
2
3
        glPolygonMode(GL_FRONT, GL_FILL);
        glPolygonMode(GL_BACK, GL_FILL);
        glBegin(GL_POLYGON);
...и еще: надписи вида A; в конструкторе заставляют задуматься все ли у вас нормально с языком...
1
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,745
26.04.2018, 11:20 5
Есть какая-то текущая матрица, надо изменить ее чтобы объект сдвинулся и/или повернулся (на заданный угол/расстояние). Это делается просто домножением на матрицу перемещения слева, т.е

current_matrix = step_matrix * current_matrix

C++
1
2
3
4
5
6
7
8
9
10
11
12
// сохраняем текущую матрицу
GLDouble savM[16];
glGetDoublev(GL_MODELVIEW_MATRIX, savM);
 
// строим матрицу для шага перемещения/поворота "с нуля"
glMatrixMode(GL_MODELVIEW_MATRIX);
glLoadIdentity();
glTranslated(0, -3, 0);
glRotated(45, 0, 0, 1);
 
// домножаем на текущую
glMultMatrixd(savM);
Добавлено через 3 часа 29 минут
Ой, насвистел я, там же надо еще смещение отнять а потом добавить. Ну ничего, завтра дорисую (а может оно никому и не надо)
1
0 / 0 / 0
Регистрация: 06.07.2017
Сообщений: 7
27.04.2018, 18:57  [ТС] 6
надо)
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
28.04.2018, 00:32 7
Цитата Сообщение от Yaroslav1998 Посмотреть сообщение
надо)
Сделали мы как-то Аквариум.

Теперь будет хвостатый Аквариум со вращающимися рыбками

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#include <iostream>
 
#include <GL/freeglut.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <list>
#include <vector>
#include <memory>
#include <iostream>
#include <sys/time.h>
#include <deque>
 
int w = 1000;
int h = 600;
int speed = 10;
int limit = 8;
int counter = 0;
int life = 10000;
 
#define DELTA_MOVE 0.5*10
#define MAX_PATH_SIZE 100
 
#ifdef __linux__
    unsigned int timeGetTime()
    {
        struct timeval now;
        gettimeofday(&now, NULL);
        return now.tv_usec/1000;
    }
#elif _WIN32
    #pragma comment (lib, "Winmm.lib")
#endif
 
class Fish {
public:
    std::deque<std::pair<int,int>> path;
    bool predator;
    float x;
    float y;
    float age;
    float type;
    float r;
    float dX;
    float dY;
    float color;
    float rotation;
    Fish (const Fish& t) {
        predator = t.predator;
        x = t.x;
        y = t.y;
        age = 0;
        type = t.type;
        r = t.r;
        dX = DELTA_MOVE;
        dY = DELTA_MOVE;
        color = 1;
        rotation = 0;
    }
    Fish(bool a, float b, float c, float d) {
        predator = a;
        x = b;
        y = c;
        age = 0;
        type = d;
        r = (predator ? 3: 1) * 100.0;
        rand();
        dX = (((float)rand()/RAND_MAX) > 0.5f? 1 : -1)*DELTA_MOVE;
        dY = (((float)rand()/RAND_MAX) > 0.5f? 1 : -1)*DELTA_MOVE;
        color = 1;
        rotation = 0;
    }
 
    void Draw() {
        glPushMatrix();
        auto r2 = r/2.0f;
        glTranslatef(x+r2,y+r2,0);
        if(type==0)
            glColor3f(1,1,1);
        else if(type==1)
            glColor3f(0,1,1);
        else
            glColor3f(1,0,0);
        glRotatef(rotation*360, 0,0,1);
        glBegin(GL_QUADS);
            glTexCoord2f(0,1); glVertex2f(-r2,-r2);
            glTexCoord2f(1,1); glVertex2f(r2,-r2);
            glTexCoord2f(1,0); glVertex2f(r2,r2);
            glTexCoord2f(0,0); glVertex2f(-r2,r2);
        glEnd();
        glPopMatrix();
        glColor3f(std::max(color,-color),0.5f,std::max(color,-color));
        glBegin(GL_LINES);
            for(auto& p : path)
                glVertex2f(p.first,p.second);
        glEnd();
    }
    void Trace()
    {
        age++;
 
        if(y>=h-r && dY > 0) dY *= -1;
        if(y<=-h && dY < 0) dY*=-1;
 
        if(x>=w-r && dX > 0) dX*=-1;
        if(x<=-w && dX < 0) dX*=-1;
 
        path.push_back(std::pair<int,int>(x+r/2.0f,y+r/2.0f));
        while (path.size() > MAX_PATH_SIZE)
            path.pop_front();
        x+=dX;
        y+=dY;
 
        color = color + 0.05f;
        if (color > 1.0)
            color = -color;
 
        rotation = rotation + 0.0005f;
        if (rotation > 1.0f)
            rotation = 0.0f;
    }
};
 
typedef std::shared_ptr<Fish> FishPtr;
typedef std::list<Fish> FishList;
FishList fishes;
 
void SKeyboard(int key, int x, int y)
{
    int delta = 5;
    switch(key)
    {
        case GLUT_KEY_LEFT:
            speed+=delta;
            break;
        case GLUT_KEY_RIGHT:
            speed-=delta;
            break;
    }
 
    if (speed < 0)
        speed = 0;
}
int fps = 0;
unsigned int lastTime = 0;
void Draw()
{
    fps++;
    unsigned int time = ::timeGetTime();
    if (time - lastTime > 1000)
    {
        std::cout << "fps: " << fps << std::endl;
        lastTime = time;
        fps = 0;
    }
    glClear(GL_COLOR_BUFFER_BIT);
    for(FishList::iterator iter = fishes.begin(); iter != fishes.end(); ++iter)
    {
        Fish& fish = (*iter);
        glPushMatrix();
        fish.Draw();
        glPopMatrix();
    }
    glutSwapBuffers();
    //glFlush();
}
 
void Collision(const Fish& a, const Fish& b) {
    if(a.predator==true && b.predator==false) {
        //ab.del(b);
    }
    if(b.predator==true && a.predator==false) {
        //ab.del(a);
    }
    if(a.predator==false && b.predator==false) {
        //ab.add(new Fish(false,(0),(0),0));
        if(counter<=limit) {
            if ((int)fishes.size()<limit)
                fishes.push_back(Fish(false,a.x - b.x,a.y - b.y,0));
        }
    }
    if(a.predator==true && b.predator==true) {
        //ab.add(new Fish(true,(0),(0),2));
        if(counter<limit) {
            //Fish ttt(false,a.x - b.x,a.y - b.y,0);
            if ((int)fishes.size()<limit)
                fishes.push_back(Fish(false,rand()%1-400,rand()%1-200,0));
        }
    }
}
 
void Timer(int = 0)
{
        for(FishList::iterator iter = fishes.begin(); iter != fishes.end(); ++iter)
        {
            Fish& first = (*iter);
            for(FishList::iterator iterSecond = iter; iterSecond != fishes.end(); ++iterSecond)
            {
                if (iter == iterSecond)
                    continue;
                Fish& second = (*iterSecond);
                float dx = abs(first.x+first.r/2.f - second.x-second.r/2.f);
                float dy = abs(first.y+first.r/2.f - second.y-second.r/2.f);
                float r = first.r/2.f + second.r/2.f;
                if(dx <= r && dy <= r)
                {
                    float tdx = (first.x+first.r/2.f - second.x-second.r/2.f);
                    float tdy = (first.y+first.r/2.f - second.y-second.r/2.f);
                    float length = sqrt(tdx*tdx+tdy*tdy);
                    if (length < 0.1f)
                    {
                        tdx = 1;
                        tdy = 0;
                    }
                    else
                    {
                        tdx /= length;
                        tdy /= length;
                    }
                    tdx *=  DELTA_MOVE;
                    tdy *=  DELTA_MOVE;
                    first.dX = tdx;
                    first.dY = tdy;
                    second.dX = -tdx;
                    second.dY = -tdy;
                    Collision(first,second);
                }
            }
        }
        std::vector<FishList::iterator> remove;
        for(FishList::iterator iter = fishes.begin(); iter != fishes.end(); ++iter)
        {
            Fish& first = (*iter);
            first.Trace();
            if(first.age >= life) remove.push_back(iter);
        }
 
        for(std::vector<FishList::iterator>::iterator iter = remove.begin(); iter != remove.end(); ++iter)
        {
            fishes.erase(*iter);
        }
 
        srand(time(NULL));
        glutTimerFunc(speed, Timer, 0);
        glutPostRedisplay();
}
 
int main(int argc, char **argv)
{
    fishes.push_back(Fish(true,-200,100,2));
    fishes.push_back(Fish(false,-50,0,0));
    fishes.push_back(Fish(false,150,350,1));
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB );
    glutInitWindowSize(w,h);
    glMatrixMode(GL_PROJECTION);
    glutInitWindowPosition(100,200);
    glutCreateWindow("Aquarium v4.2");
 
    glClearColor(0.0,0.0,0.0,1.0);
    glLoadIdentity();
    gluOrtho2D(-w,w,-h,h);
 
    glutDisplayFunc(Draw);
    glutTimerFunc(speed, Timer, 0);
    glutSpecialFunc(SKeyboard);
 
    glutMainLoop();
 
    return 0;
}


Успехов!
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,745
28.04.2018, 10:19 8
Цитата Сообщение от Yaroslav1998 Посмотреть сообщение
надо)
Лады. Тогда вернемся к Вашему вопросу "как нарисовать траекторию". Можно всяко, я предлагаю так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// глобальные переменные
int stepCount = 0;
float posX]2], posY[3];
 
//-------------- рисование следа ---
// должно быть вызвано после рисования квадрата
 
void DrawTail( void )
{
    if (stepCount < 2) return;
 
    glMatrixMode(GL_MODELVIEW_MATRIX);
    glPushMatrix();
    glLoadIdentity(); 
 
    float cx = (A.x + C.x) / 2;
    float cy = (A.y + C.y) / 2;
 
    glBegin(GL_LINES);
    glVertex2f(posX[0] + cx, posY[0] + cy);
    glVertex2f(posX[1] + cx, posY[1] + cy);
    glEnd();
  
    glPopMatrix();
}
 
//-------- обновление данных пути ----
// должно быть вызвано перед glBegin рисования квадрата
 
++stepCount;
posX[0] = posX[1];
posY[0] = posY[1];
GLDouble savM[16];
glGetDoublev(GL_MODELVIEW_MATRIX, savM);
posX[1] = savM[12]; 
posY[1] = savM[13];
Смысл: на каждом шаге запоминаем смещение матрицы в мировой CK. А когда надо вывести отрезок - устанавливаем единичную матрицу и выводим (мировые координаты готовы)
1
28.04.2018, 10:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2018, 10:19
Помогаю со студенческими работами здесь

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

Нарисовать на экране траекторию движения частицы в течение 5 секунд
Помогите пожалуйста Частица (от заданной начальной точки) совершает хаотичное движение, двигаясь в...

Как нарисовать след (траекторию движения центра тяжести) при параллельном переносе фигуры
Здравствуйте! Делаю лабораторную, не могу разобраться, как нарисовать след (траекторию движения...

Изобразить траекторию движения
В случайных точках местности расположены несколько столбов, некоторые из них соединены заборами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru