Он использует радианы, потому что Math.cos()
ожидает, что его аргумент будет в радианах.
Но на самом деле, использование sin и cos для поворота сетки с шагом 90 градусов слишком сложное и довольно хрупкое, потому что тригонометрия В функциях c используется математика с плавающей запятой, которая не гарантирует точных результатов, что может вызвать проблемы, поскольку (int)
всегда округляется, поэтому 0.99999999999999
станет 0
или -0.0000000000001
станет -1
.
К счастью, есть более простой способ вращать вещи с шагом 90 градусов. Чтобы выяснить, как, нарисуйте на листе бумаги обычную координатную сетку (ось X направлена вправо, а ось Y направлена вверх), а затем возьмите этот лист и поверните его на 90 градусов по часовой стрелке. Теперь ось X будет указывать вниз, а ось Y будет направлена вправо. То есть вращение заставляло оси менять положение, а одна ось проходила в обратном направлении. Иными словами, мы можем повернуть на 90 градусов по часовой стрелке, поменяв значения x и y и поменяв знак 1:
int newx = oldy;
int newy = -oldx;
Теперь ваш случай немного сложнее, потому что вы не вращаетесь вокруг источника система координат, но средняя точка плитки. Компенсируя это, формула для поворота на 90 градусов по часовой стрелке принимает вид:
int newx = oldy;
int newy = 3 - oldx;
, а для поворота на 90 градусов против часовой стрелки:
int newx = 3 - oldy;
int newy = oldx;
Поэтому самое простое решение - забыть обо всем этом грех и так далее и просто напиши
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
int newx;
int newy;
if (clockwise) {
newx = oldy;
newy = 3 - oldx;
} else {
newx = 3 - oldy;
newy = oldx;
}
rotatedTile[newx][newy] = tile[x][y];
}
}