Попытки 1 и 2:
Примечание: Удалены первые попытки сократить размер вопроса. См. Вики сообщества для предыдущих попыток.
Попытка 3:
В соответствии с примером fuzzy-waffle я реализовал следующее, что, по-видимому, работает неправильно. Есть идеи, что я могу делать не так?
ImageMatrix ImageMatrix::GetRotatedCopy(VDouble angle)
{
// Copy the specifications of the original.
ImageMatrix &source = *this;
ImageMatrix &target = CreateEmptyCopy();
double centerX = ((double)(source.GetColumnCount()-1)) / 2;
double centerY = ((double)(source.GetRowCount()-1)) / 2;
// Remember: row = y, column = x
for (VUInt32 y = 0; y < source.GetRowCount(); y++)
{
for (VUInt32 x = 0; x < source.GetColumnCount(); x++)
{
double dx = ((double)x) - centerX;
double dy = ((double)y) - centerY;
double newX = cos(angle) * dx - sin(angle) * dy + centerX;
double newY = cos(angle) * dy + sin(angle) * dx + centerY;
int ix = (int)round(newX);
int iy = (int)round(newY);
target[x][y][0] = source[ix][iy][0];
}
}
return target;
}
С этой матрицей-прототипом ...
1 2 1
0 0 0
-1 -2 -1
... prototype.GetRotatedCopy (0) (это правильно) ...
1 2 1
0 0 0
-1 -2 -1
... prototype.GetRotatedCopy (90) (неверно) ...
-2 0 0
-2 0 2
0 0 2
... prototype.GetRotatedCopy (180) (неверно - но вроде логично?) ...
0 -1 -2
1 0 -1
2 1 0
... prototype.GetRotatedCopy (270) (неверно - почему это так же, как вращение 0?) ...
1 2 1
0 0 0
-1 -2 -1
Решение:
Как указал Марк Рэнсом, я должен использовать радианы, а не градусы; Я изменил свой код следующим образом:
ImageMatrix ImageMatrix::GetRotatedCopy(VDouble degrees)
{
// Copy the specifications of the original.
ImageMatrix &source = *this;
ImageMatrix &target = CreateEmptyCopy();
// Convert degree measurement to radians.
double angle = degrees / 57.3;
// ... rest of code as in attempt #3 ...
Спасибо за вашу помощь, ребята!
1 2 1
0 0 0
-1 -2 -1
1 2 1
0 0 0
-1 -2 -1
-1 0 1
-2 0 2
-1 0 1
-1 -2 -1
0 0 0
1 2 1
1 0 -1
2 0 -2
1 0 -1