Написал код в VS, выходит две ошибки:
32 balls = new Ball[n];
73 double m1 = M_PI * balls[i].r * balls[i].r;
Перепробовал все возможные варианты, ничего не помогло (или я не умею читать...).
P.S. Если не составит труда, попрошу исправить.
Код:
#include <iostream>
#include <cmath>
using namespace std;
class Ball {
public:
double x, y; // координаты центра шарика
double r; // радиус шарика
double vx, vy; // скорость шарика
Ball(double ix, double iy, double ir, double ivx, double ivy) {
x = ix;
y = iy;
r = ir;
vx = ivx;
vy = ivy;
}
};
class Game {
public:
Ball* balls; // массив объектов Ball
int nBalls; // количество шаров в игре
double width, height; // размеры игрового поля
Game(int n, double w, double h) {
nBalls = n;
width = w;
height = h;
balls = new Ball[n];
}
~Game() {
delete[] balls;
}
void update(double dt) {
// обновляем положение каждого шарика
for (int i = 0; i < nBalls; i++) {
balls[i].x += balls[i].vx * dt;
balls[i].y += balls[i].vy * dt;
// проверяем, не вышел ли шарик за границы поля
if (balls[i].x - balls[i].r < 0 || balls[i].x + balls[i].r > width) {
balls[i].vx *= -1;
}
if (balls[i].y - balls[i].r < 0 || balls[i].y + balls[i].r > height) {
balls[i].vy *= -1;
}
}
// проверяем столкновения шариков
for (int i = 0; i < nBalls; i++) {
for (int j = i + 1; j < nBalls; j++) {
double dx = balls[i].x - balls[j].x;
double dy = balls[i].y - balls[j].y;
double dist = sqrt(dx * dx + dy * dy); // расстояние между шариками
// если шарики пересеклись
if (dist < balls[i].r + balls[j].r) {
double nx = dx / dist; // нормаль к точке столкновения
double ny = dy / dist;
// проекции скоростей на нормаль и касательную к точке столкновения
double v1n = balls[i].vx * nx + balls[i].vy * ny;
double v1t = -balls[i].vx * ny + balls[i].vy * nx;
double v2n = balls[j].vx * nx + balls[j].vy * ny;
double v2t = -balls[j].vx * ny + balls[j].vy * nx;
// вычисляем новые скорости
double m1 = M_PI * balls[i].r * balls[i].r;
double m2 = M_PI * balls[j].r * balls[j].r;
double v1nf = ((m1 - m2) * v1n + 2 * m2 * v2n) / (m1 + m2);
double v2nf = ((m2 - m1) * v2n + 2 * m1 * v1n) / (m1 + m2);
// возвращаем скорости в декартовы координаты
double v1nfx = v1nf * nx;
double v1nfy = v1nf * ny;
double v1tx = v1t * (-ny);
double v1ty = v1t * nx;
double v2nfx = v2nf * nx;
double v2nfy = v2nf * ny;
double v2tx = v2t * (-ny);
double v2ty = v2t * nx;
// обновляем скорости шариков
balls[i].vx = v1nfx + v1tx;
balls[i].vy = v1nfy + v1ty;
balls[j].vx = v2nfx + v2tx;
balls[j].vy = v2nfy + v2ty;
}
}
}
}
};
int main() {
// создаем игру
Game game(3, 100, 100);
game.balls[0] = Ball(20, 20, 5, 30, 40);
game.balls[1] = Ball(40, 40, 4, -20, 50);
game.balls[2] = Ball(60, 60, 3, -20, -30);
// симулируем движение шаров
double t = 0;
double dt = 0.01;
while (t < 10) {
game.update(dt);
t += dt;
}
// выводим координаты шариков
for (int i = 0; i < game.nBalls; i++) {
cout << "Ball " << i << ": (" << game.balls[i].x << ", " << game.balls[i].y << ")" << endl;
}
return 0;
}