Форум программистов, компьютерный форум CyberForum.ru

Центральное столкновение шаров - C++

Восстановить пароль Регистрация
 
devcpp2
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 3
11.11.2012, 11:07     Центральное столкновение шаров #1
Здравствуйте!
Написал программу для центрального столкновения двух шаров...но программа выполняется некорректно....подскажите, что не так
вот код:
const int dt = 1;

void BallDraw (double x, double y, double r, COLORREF color);

void Move (int Border_x, int Border_y);

void PhysicsBall (double* x, double* y, double* vx, double* vy,
int Border_x, int Border_y);

void Collision (double* x, double* vx, double r,
double r1, double* vx1, double m1, double m2, double* x1, int Border_x);

int main()
{
txCreateWindow(1000, 700);

int Border_x = txGetExtentX();
int Border_y = txGetExtentY();

Move (Border_x, Border_y);

return 0;
}

void BallDraw (double x, double y, double r, COLORREF color)
{
txSetFillColor(color);
txCircle(x, y, r);
}

void PhysicsBall (double* x, double* y, double* vx, double* vy,
int Border_x, int Border_y)
{
if(*x < 0 ) {*vx = -*vx; *x = 0; }
if(*y < 0 ) {*vy = -*vy; *y = 0; }
if(*x > Border_x ) {*vx = -*vx; *x = Border_x;}
if(*y > Border_y ) {*vy = -*vy; *y = Border_y;}
}

void Collision (double* x, double* vx, double r,
double r1, double* vx1, double m1, double m2, double* x1, int Border_x)
{
double dx = *x1 - *x;
double R = r+r1;
double z = dx;

if(dx < 0)
dx = - dx;

if(dx <= R)
{
*vx = *vx*(m1 - m2)/(m1 + m2) + *vx1*(2*m2)/(m1 + m2);
*vx1 = *vx*(2*m1)/(m1 + m2) + *vx1*(m2 - m1)/(m2 + m1);
if(*x1 <= 2*r)
*vx1 *= -1;

//if (m1 < m2) {*vx1 = -*vx1; *vx = - *vx;}
//if (m1 > m2) {*vx1 = -*vx1; *vx = *vx;}
}

/*if (z <= R && m1 == m2)
{
double dvx = *vx;
double dvx1 = *vx1;
*vx1 = -dvx; *vx = -dvx1;
} */
}

void Move (int Border_x, int Border_y)
{

double x = 30, y = 310;
double vx = 10, vy = 15;
double r = 20;
double m = 1;

double x1 = 550, y1 = 300;
double vx1 = 5, vy1 = 7;
double r1 = 30;
double m1 = 4;

while (true)
{
txBegin();

if (!GetAsyncKeyState(VK_SPACE))
{
txSetFillColor(TX_BLACK);
txClear();
}

BallDraw ( x, y, r, TX_GREEN);
BallDraw (x1, y1, r1, TX_BLUE);

x += vx*dt;
x1 += vx1*dt;

PhysicsBall ( &x, &y, &vx, &vy, Border_x, Border_y);
PhysicsBall (&x1, &y1, &vx1, &vy1, Border_x, Border_y);

cout << vx << ' ' << vx1 << '\n';

Collision ( &x, &vx, r, r1, &vx1, m, m1, &x1, Border_x);

cout << vx << ' ' << vx1 << '\n';

txSleep(10);

txEnd();
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 11:07     Центральное столкновение шаров
Посмотрите здесь:

Графика С++, столкновение шаров C++
столкновение C++
C++ Столкновение объектов в играх
Вывод сочетания шаров C++
C++ Столкновение шаров
Столкновение функций C++
Столкновение спрайта и закрашеного квадратика C++
Реализовать столкновение шарика со стенкой C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
11.11.2012, 11:59     Центральное столкновение шаров #2
Учтите возможность повторного возникновения ситуации,
например, отражение от правого края:
C++
1
if(*x > Border_x ) {*vx = -fabs(*vx); *x = Border_x;}
Точно также и при столкновении: устанавливайте строго нужные знаки скоростей.
devcpp2
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 3
11.11.2012, 16:14  [ТС]     Центральное столкновение шаров #3
Извините, а вы не знаете как сделать, чтобы шары отталкивались не только по оси X, но и по оси Y?
Yandex
Объявления
11.11.2012, 16:14     Центральное столкновение шаров
Ответ Создать тему
Опции темы

Текущее время: 08:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru