2 / 2 / 2
Регистрация: 01.06.2014
Сообщений: 92
1

Как сделать чтобы авто не наезжали друг на друга и не столкнулись

23.02.2016, 22:54. Показов 748. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Насколько я понимаю необходимо найти разность между n количеством авто,и если она меньше например 10, то остановить наращивание (x,y) для этого объекта вектора, а как это сделать? не получается совсем..

Класс авто
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
#include"time.h"
#include <ctime> 
class Car {
private:
    int x, y;// точка на карте
    int spawn_place; // место появления (снизу,слева,сверху,справа)
    int direction; // направление движения (налево,прямо,направо)
    int spawn_correct; // для корректировки. 
public:
    Car();
    Car(int xx, int yy);
    void runX();
    void runY();
    
    void derunY();
    void derunX();
 
    int getY();
    int getX();
    
    
    void chng();
    int getSpawn_place();
    int getDirection();
    int paint(Graphics& g); //////////отрисовка
    //void init();
};
Класс модель, в модели вектор из авто
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include"time.h"
#include"car.h"
#include <vector> 
using namespace std;
 
class Model {
private:
    vector <Car> vCars;
    int amountCar;
public:
 
    Model();
    Model(int aCar);
    void logictest(Graphics& g);
    void play(Graphics& g);
    
 
 
};
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
#include"stdafx.h"
#include"Model.h"
#include <algorithm>
#include <iostream>
 
 
Model::Model(int aCar){
    vCars.resize(aCar);
}
Model::Model(){
    vCars.resize(2);
}
 
void Model::logictest(Graphics& g){
 
    for (int i = 0; i < vCars.size(); i++){
        if (vCars[i].getSpawn_place() == 0 && vCars[i].getDirection() == 0)
        {                                   // место появления (снизу)// направление движения (налево)
            if (vCars[i].getY() >= 280)
            {
                vCars[i].derunY();
            }
            else
            {
                vCars[i].derunX();
            }
 
        }
        //if (vCars[i].getSpawn_place() == 0 && vCars[i].getDirection() == 1)
        //{                                                             // место появления (снизу)
        //  if (vCars[i].getY() >= 0)                                    // направление движения (прямо)
        //  {
        //      vCars[i].derunY();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 0 && vCars[i].getDirection() == 2 )
        //  // место появления (снизу)// направление движения (направо)
        //{
        //  if (vCars[i].getY() >= 420)
        //  {
        //      vCars[i].derunY();
        //  }
        //  else
        //  {
        //      vCars[i].runX();
        //  }
 
 
        //}
 
        //if (vCars[i].getSpawn_place() == 1 && vCars[i].getDirection() == 0)
        //{                                 // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //  if (vCars[i].getX() <= 420)
        //  {
        //      vCars[i].runX();
        //  }
        //  else
        //  {
        //      vCars[i].derunY();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 1 && vCars[i].getDirection() == 1)
        //{                                                             // место появления (слева)
        //  if (vCars[i].getX() <= 700)                                  // направление движения (прямо)
        //  {
        //      vCars[i].runX();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 1 && vCars[i].getDirection() == 2)
        //  // место появления ()// направление движения (направо)
        //{
        //  if (vCars[i].getX() <= 280)
        //  {
        //      vCars[i].runX();
        //  }
        //  else
        //  {
        //      vCars[i].runY();
        //  }
 
 
        //}
        //if (vCars[i].getSpawn_place() == 2 && vCars[i].getDirection() == 0)
        //{                                 // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //  if (vCars[i].getY() <= 420)
        //  {
        //      vCars[i].runY();
        //  }
        //  else
        //  {
        //      vCars[i].runX();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 2 && vCars[i].getDirection() == 1)
        //{                                     // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //  if (vCars[i].getY() <= 700)
        //  {
        //      vCars[i].runY();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 2 && vCars[i].getDirection() == 2)
        //  // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //{
        //  if (vCars[i].getY() <= 280)
        //  {
        //      vCars[i].runY();
        //  }
        //  else
        //  {
        //      vCars[i].derunX();
        //  }
 
 
        //}
        //if (vCars[i].getSpawn_place() == 3 && vCars[i].getDirection() == 0)
        //{                                 // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //  if (vCars[i].getX() >= 280)
        //  {
        //      vCars[i].derunX();
        //  }
        //  else
        //  {
        //      vCars[i].runY();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 3 && vCars[i].getDirection() == 1)
        //{                     // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)                           
        //  if (vCars[i].getX() >= 0)
        //  {
        //      vCars[i].derunX();
        //  }
 
        //}
        //if (vCars[i].getSpawn_place() == 3 && vCars[i].getDirection() == 2)
        //  // место появления (снизу,слева,сверху,справа)// направление движения (налево,прямо,направо)
        //{
        //  if (vCars[i].getX() >= 420)
        //  {
        //      vCars[i].derunX();
        //  }
        //  else
        //  {
        //      vCars[i].derunY();
        //  }
 
 
        //}
        
        vCars[i].paint(g);
        //вызов paint из класса Car ************************
    }
}
void Model::play(Graphics& g){
 
    
    }
 
}
Добавлено через 1 час 7 минут
найти разность по координатам конечно же***
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 22:54
Ответы с готовыми решениями:

Как сделать, чтобы объекты не наезжали друг на друга?
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &lt;windows.h&gt; #include &lt;glut.h&gt; float px =...

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
&lt;?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла...

Как сделать чтобы блоки не видели друг друга?
Написал скрипт, который вставляет блоки разных размеров, цветов и с различными выравниваниями и...

Как сделать чтобы 3 круга не находили друг на друга
if button=mbright then with Image1.Canvas do begin pen.Mode:=pmMask; ...

7
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
24.02.2016, 01:42 2
Не совсем понятен вопрос. Если у класса машины есть свойства x, y, width (ширина), height (высота), угол поворота, то можно перемещать машину, проверять ее на коллизии с остальными машинами, и если столкновение обнаружено - возвращать ее на предыдущие координаты. Опишите вопрос более подробно.
1
2 / 2 / 2
Регистрация: 01.06.2014
Сообщений: 92
24.02.2016, 10:54  [ТС] 3
Цитата Сообщение от igor_petrov Посмотреть сообщение
Не совсем понятен вопрос. Если у класса машины есть свойства x, y, width (ширина), height (высота), угол поворота, то можно перемещать машину, проверять ее на коллизии с остальными машинами, и если столкновение обнаружено - возвращать ее на предыдущие координаты. Опишите вопрос более подробно.
Проблема в правильности расчета расстояния между авто, которые хранятся в векторе, без этого авто "липнут друг на друга"))

C++
1
2
3
4
5
6
7
8
bool Model::play(){
    for (int i = 0; i < vCars.size() - 1; i++)
        for (int j = i + 1; j < vCars.size() - 1; j++)
            if (abs(vCars[i].getX() - vCars[j].getX() >= 20) && (vCars[i].getY() - vCars[j].getY())
                || abs(vCars[i].getY() - vCars[j].getY() >= 20) && (vCars[i].getX() - vCars[j].getX())
                || abs(vCars[i].getX() - vCars[j].getX() >= 20) && (vCars[i].getY() - vCars[j].getY()))
                return true;
}
Добавлено через 53 минуты
У меня объявляется Model testmodel(20);

wm_paint вызывается функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void OnPaint(HDC hdc, RECT& rc)
{
    srand(time(NULL));
 
    Graphics g(hdc);
    Rect paintRect(0, 0, rc.right, rc.bottom);
    Bitmap backBuffer(rc.right, rc.bottom, &g);
    Graphics temp(&backBuffer);
    PaintBackground(temp, paintRect);
    
 
    
    testmodel.logictest(temp);
    
 
    g.DrawImage(&backBuffer, 0, 0, 0, 0, rc.right, rc.bottom, UnitPixel);
}
0
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
25.02.2016, 04:28 4
При известных координатах X/Y в декартовой системе координат, расстояние между двумя точками рассчитывается по теореме пифагора.

C++
1
2
3
4
float x1, y1, x2, y2; //сделаем вид, что они уже заданы
float dx = x2-x1;
float dy = y2-y1;
float distance = sqrt(dx*dx + dy*dy);
Далее проверяете расстояние условием.

C++
1
2
3
if(distance <= a.size + b.size) {
    //обнаружена коллизия, вернуть объект на предыдущие координаты
}
Данный пример подойдет для круглых объектов, для прямоугольных нужно лучше продумать условие.
Или я опять вас не понял.

Добавлено через 5 минут
Здесь вы проверяете на столкновения не со всеми машинами.
C++
1
2
for (int i = 0; i < vCars.size() - 1; i++)
for (int j = i + 1; j < vCars.size() - 1; j++)
Если i, например, будет равен 6 (отсчет с нуля),
то проверка для этого объекта будет пропущена для элементов от 0 до 6 включительно.

Лучше так:
C++
1
2
3
4
5
6
for(int i=0; i<size; i++)
for(int j=0; j<size; j++) {
    if(i != j) {
        //проверяем столкновения с каждой машинной, но только не с собой
    }
}
Добавлено через 1 минуту
И вы делаете три проверки, вместо двух - одна лишняя, присмотритесь.
1
3 / 3 / 1
Регистрация: 09.12.2015
Сообщений: 10
25.02.2016, 09:17 5
Лучше так:
Ага, теперь в два раза больше вычислений с тем же результатом
1
2 / 2 / 2
Регистрация: 01.06.2014
Сообщений: 92
25.02.2016, 19:08  [ТС] 6
Цитата Сообщение от igor_petrov Посмотреть сообщение
Далее проверяете расстояние условием.


C++
1
2
3
if(distance <= a.size + b.size) {
* * //обнаружена коллизия, вернуть объект на предыдущие координаты
}
Как сравнить с двумя понятно, а как сравнить по всему вектору? ведь тогда все авто будут стоять на месте, если расстояние между двумя будет меньше допустимого, при котором будет столкновение.
Необходимо находить расстояние авто "перед ним", как это сделать не знаю...
0
1 / 1 / 0
Регистрация: 18.02.2016
Сообщений: 12
25.02.2016, 23:19 7
Цитата Сообщение от Olya_z Посмотреть сообщение
а как сравнить по всему вектору?
Циклом, перемещаешь машину на 1 клетку и проверяешь, есть коллизия с каждой машиной в векторе, если нет, то сохраняешь, если есть то откат на исходную.
0
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
26.02.2016, 01:22 8
Имяслишкомдлинн, действительно, мой косяк.
0
26.02.2016, 01:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2016, 01:22
Помогаю со студенческими работами здесь

Как сделать чтобы radiobutton'ы были независимы друг от друга?
как сделать чтобы radiobutton'ы были независимы друг от друга?не используя Groupbox

Как сделать так, чтобы 2 сервера друг друга видели
всем привет, уважаемые форумчане! ситуация такова: ранее 2 сервера стояли в одном офисе. где-то...

Как сделать, чтобы картинка и текст в Label не накладывались друг на друга
Добрый день! У меня есть label, включил для него иконку. Нужно, чтобы иконка показывалась слева...

Как сделать, чтобы пользователи на сервере могли редактировать файлы друг друга?
Здравствуйте. В нашей организации имеется сеть из windows машин и файлового сервера на ubuntu...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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