Caja de detección de colisión y rebote

Estoy haciendo pong, y me resulta muy difícil escribir un algoritmo que haga rebotar la pelota en las cuatro paredes correctamente (me ocuparé de anotar más adelante, porque solo una parte de los lados oeste + este serán goles). Así que en este momento quiero que la pelota rebote alrededor de la caja.

Detectar si la pelota ha golpeado una pared es fácil, pero tengo problemas para calcular el nuevo ángulo.

Esto es lo que se me ocurrió hasta ahora:

        if(dstY == 0) {
            // North wall
            if(angle < 90) {
                newAngle = angle + 90;
            } else {
                newAngle = angle - 90;
            }
        } else if(dstX == maxWidth) {
            // East wall
            if(angle < 90) {
                newAngle = angle + 270;
            } else {
                newAngle = angle + 90;
            }
        } else if(dstY == maxHeight) {
            // South wall
            newAngle = angle + 90;
        } else if(dstX == 1) {
            // West wall
            if(angle < 270) {
                newAngle = angle - 90;
            } else {
                newAngle = angle - 270;
            }
        }

Eso solo funciona para aproximadamente la mitad de las colisiones, y se ve realmente feo. Estoy seguro de que esto debería ser realmente simple y que se ha hecho muchas veces antes.

En mi código, dstX / dstY son las coordenadas de destino X / Y. X = 0 e y = 0 en la parte superior izquierda.

Respuestas a la pregunta(4)

Su respuesta a la pregunta