Как изменить угол, когда мяч сталкивается с прямоугольником?

1

Если круг попадает на прямоугольник и ему нужно отскочить, мне нужно рассчитать его новое направление.

Это то, что у меня есть

    function tick() {
        var dx = Math.cos(ball.direction * (Math.PI / 180))*ball_md.speed;
        var dy = Math.sin(ball.direction * (Math.PI / 180))*ball_md.speed;
        ball.x += dx;
        ball.y -= dy;
        drawGame(); // refresh board

        //console.log(ball);

        paddles.some(function(paddle) {
            var circle={x:ball.x+ball_md.radius, y:ball.y+ball_md.radius, r:ball_md.radius};
            var rect={x:paddle.x, y:paddle.y, w:game_md.paddle.width, h:game_md.paddle.height};
            var hit = RectCircleColliding(circle, rect);

            if (hit) {
                if (Math.floor(ball.y) + ball_md.radius*2 <= paddle.y || Math.ceil(ball.y) >= paddle.y + game_md.paddle.height) { // hit on top or below paddle
                    ball.direction = 360 - ball.direction; 
                } else { // hit left or right side
                    ball.direction = 180 - ball.direction;  
                }
                return true;
            }
        });

        if (ball.y < 0 || ball.y+ball_md.radius*2 >= game_md.height) { // hit top or bottom wall
            ball.direction = 360 - ball.direction; 
        }
        if (ball.x < 0 || ball.x+ball_md.radius*2 >= game_md.width) { // hit left or right wall
            ball.direction = 180 - ball.direction;   
        }
    }

но он, похоже, не всегда работает. Кто-нибудь знает, почему?

Случаи, когда он терпит неудачу. В этом случае зигзаги очень быстро на поверхности лопастей.

Изображение 174551

ДЕМО: https://jsfiddle.net/3ok2farw/2/

  • 0
    Я бы регистрировал каждый отскок и смотрел, есть ли шаблон, когда он не работает.
  • 0
    but it doesn't seem to always work. Что он делает в настоящее время, и что он должен делать вместо этого?
Показать ещё 6 комментариев
Теги:
math
collision-detection
angle
trigonometry

1 ответ

1
Лучший ответ

Вы должны рассматривать угловое столкновение отдельно. Когда он попадает в угол, скорость шара не изменяется перпендикулярно ни горизонтальной, ни вертикальной оси, а вдоль линии, соединяющей центр шара и угла. Я добавляю чертеж, чтобы сделать его более понятным. Если столкновение совершенно эластично (без потерь энергии), то v_normal компонент заменяется на отрицательный, -v_normal. Если столкновение абсолютно пластичное (максимальная потеря энергии), скорость выхода просто v_tangential. Надеюсь это поможет!

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню