Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 2

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

09.12.2015, 16:02. Показов 2381. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2015, 16:02
Ответы с готовыми решениями:

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

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

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

1
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
09.12.2015, 18:55
Цитата Сообщение от Onelove1 Посмотреть сообщение
Прошу,помогите,уже ничего в голову не лезет(
чет у тебя все сложно и не ясно, названия переменных ...
что бы обнаружить столкновение надо одна строчка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2015, 18:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru