Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Onelove1
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 2
#1

Столкновение двух окружностей - C++

09.12.2015, 16:02. Просмотров 308. Ответов 1
Метки нет (Все метки)

Итак,я сталкиваю два шарика(но вообще их больше,массив).
Какое-то время после старта программы все нормально,однако спустя некоторое время один из сталкивающихся шариков останавливается в результате столкновения и другие начинают пролетать сквозь него и столкновения с ним уже не обнаруживаются.
Вот две функции:
1.Обнаружение столковения ( Ball_to_Ball_Detection)
2.Реакция на столкновение ( Ball_to_Ball_Reaction)
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
void Ball_to_Ball_Detection(Object_Ball& Ball1,Object_Ball& Ball2)
{
    bool stolknovenie = false;
    int xmov1 = Ball1.xSpeed;
    int ymov1 = Ball1.xSpeed;
    int xmov2 = Ball2.xSpeed;
    int ymov2 = Ball2.ySpeed;
 
    int xl1 = Ball1.x;
    int yl1 = Ball1.y;
    int xl2 = Ball2.x;
    int yl2 = Ball2.y;
 
    int R = Ball1.Radius + Ball2.Radius;
    int a = -2*xmov1*xmov2+xmov1*xmov1+xmov2*xmov2;
    int b = -2*xl1*xmov2-2*xl2*xmov1+2*xl1*xmov1+2*xl2*xmov2;
    int c = -2*xl1*xl2+xl1*xl1+xl2*xl2;
    int d = -2*ymov1*ymov2+ymov1*ymov1+ymov2*ymov2;
    int e = -2*yl1*ymov2-2*yl2*ymov1+2*yl1*ymov1+2*yl2*ymov2;
    int f = -2*yl1*yl2+yl1*yl1+yl2*yl2;
    int g = a+d;
    int h = b+e;
    int k = c+f-R*R;
 
    float koren = sqrt(h*h-4*g*k);
    float t1 = (-h+koren)/(2*g);
    float t2 = (-h-koren)/(2*g);
 
    if (t1>0 && t1 <=1)
     {
         whatTime = t1;
         stolknovenie = true;
     }
    if (t2>0 && t2<=1)
     {
        if (whatTime == 0 || t2<t1) 
        {
            whatTime = t2;
            stolknovenie = true;
        }
    }
    if (stolknovenie) 
    {
        printf ("ÑòîëêГ*óëèñü!\n");
        Ball_to_Ball_Reaction(Ball1,Ball2,whatTime);
    }    
}
 
 
void Ball_to_Ball_Reaction(Object_Ball& Ball1,Object_Ball& Ball2,float time)
{
    int mass1 = Ball1.Mass;
    int mass2 = Ball2.Mass;
    
    int xVel1 = Ball1.xSpeed;
    int xVel2 = Ball2.xSpeed;
    int yVel1 = Ball1.ySpeed;
    int yVel2 = Ball2.ySpeed;
    int run = (Ball1.x-Ball2.x);
    int rise = (Ball1.y-Ball2.y);
    //???? ????? ???? ? ? ?????? ????????
    float Alfa = atan2f(rise, run);
    float cosAlfa = cos(Alfa);
    float sinAlfa = sin(Alfa);
    // ??????? ???????? ????? ????? ????????
    float xVel1prime = xVel1*cosAlfa+yVel1*sinAlfa;
    float xVel2prime = xVel2*cosAlfa+yVel2*sinAlfa;
    // ??????? ???????? ???????????????? ????? ????????
    float yVel1prime = yVel1*cosAlfa-xVel1*sinAlfa;
    float yVel2prime = yVel2*cosAlfa-xVel2*sinAlfa;
    // ????????? ?????? ??????????
    float P = (mass1*xVel1prime+mass2*xVel2prime);
    float V = (xVel1prime-xVel2prime);
    float v2f = (P+mass1*V)/(mass1+mass2);
    float v1f = v2f-xVel1prime+xVel2prime;
    xVel1prime = v1f;
    xVel2prime = v2f;
    // ?????????? ??????? ?? ??? ? ? ?.
    xVel1 = xVel1prime*cosAlfa-yVel1prime*sinAlfa;
    xVel2 = xVel2prime*cosAlfa-yVel2prime*sinAlfa;
    yVel1 = yVel1prime*cosAlfa+xVel1prime*sinAlfa;
    yVel2 = yVel2prime*cosAlfa+xVel2prime*sinAlfa;
    // ???????? ????????? ??????? ?????
    Ball1.xTemp = Ball1.x+Ball1.xSpeed*time;
    Ball1.yTemp = Ball1.y+Ball1.ySpeed*time;
    Ball2.xTemp = Ball2.x+Ball2.xSpeed*time;
    Ball2.yTemp = Ball2.y+Ball2.ySpeed*time;
    // ?????? ????? ???????? ?????
    Ball1.xSpeed = xVel1;
    Ball2.xSpeed = xVel2;
    Ball1.ySpeed = yVel1;
    Ball2.ySpeed = yVel2;
     
}
Прошу,помогите,уже ничего в голову не лезет(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2015, 16:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Столкновение двух окружностей (C++):

Пересечение двух окружностей - C++
На плоскости даны две окружности. Требуется проверить, пересекаются ли они. Входные данные Входной файл INPUT.TXT состоит из двух...

Пересечение двух окружностей - C++
Есть такая задачка. Вам даны две окружности в плоскости. Найдите все их различные точки пересечения. В силу большой требуемой...

Координаты пересечения двух окружностей - C++
На вход даются целочисленные координаты двух окружностей и целочисленные их радиусы, которые не меньше 1 и не больше, чем 1000. Они...

Задача на пересечение двух окружностей - C++
Всем привет! Прошу вашей помощи в решении задачи так как я уже дней пять над ней мучаюсь и все не выходит. Даны две окружности в...

Найти точку соприкосновения двух окружностей - C++
Как можно найти точку соприкосновения двух окружностей, если заданы их координаты центра и радиус? У меня движутся две окружности навстречу...

Вводится значение двух радиусов окружностей - C++
Помогите создать блок схему для задачи c пояснениями пожалуйста: Вводится значение двух радиусов окружностей R1,R2 и координаты точки...

1
_Valera_
488 / 370 / 94
Регистрация: 27.01.2015
Сообщений: 1,588
09.12.2015, 18:55 #2
Цитата Сообщение от Onelove1 Посмотреть сообщение
Прошу,помогите,уже ничего в голову не лезет(
чет у тебя все сложно и не ясно, названия переменных ...
что бы обнаружить столкновение надо одна строчка.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2015, 18:55
Привет! Вот еще темы с ответами:

Вычислить площадь пересечения двух окружностей - C++
Здравствуйте) Может кто-нибудь сталкивался с написнием программы для вычисления площади пересечения двух кругов? помогите, пожалуйста...

Определить количество точек пересечения двух окружностей - C++
Подскажите, пожалуйста, какой случай я не учёл? Программа проходит 5 тестов из 7: #include &lt;cmath&gt; #include &lt;cstdio&gt; int...

Симулятор боя(Реализовать программу, позволяющую моделировать боевое столкновение двух противников, располагающих пехотой, танками и артиллерией) - C++
Симулятор боя. Реализовать программу, позволяющую моделировать боевое столкновение двух противников, располагающих пехотой, танками и...

Даны координаты центров n окружностей и их радиусы. Определить число пересекающихся окружностей - C++
Допуск к экзамену в субботу а не решено еще 5 заданий по С++ 1.Даны координаты центров n окружностей и их радиусы. Определить число...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.