В задаче градусы переводятся в радианы. Есть ли в этом смысл кроме получения нужного диапазона рандома?
/**
* Устанавливаем новое направление движения.
* Тут же вычисляем и новый вектор.
* Такой подход удобно использовать при отскоках от стен.
*/
void setDirection(double direction) {
this.direction = direction;
double angle = Math.toRadians(direction);
dx = Math.cos(angle) * speed;
dy = -Math.sin(angle) * speed;
}