From e9c78c33940ec63b643452fc07f1eb75872b1657 Mon Sep 17 00:00:00 2001 From: Johannes Winkler Date: Mon, 11 Mar 2024 12:41:22 +0100 Subject: [PATCH] Rotation update --- mainwindow.ui | 45 ++++++++++++++++++++---------------- rotations/rotationdialog.cpp | 45 +++++++++++++++++++++++++++--------- rotations/rotationdialog.ui | 3 +++ 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/mainwindow.ui b/mainwindow.ui index c38da4a..d44159d 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 1026 - 897 + 911 @@ -17,7 +17,7 @@ OpenSprite - + :/icons/opensprite96x96.png:/icons/opensprite96x96.png @@ -675,7 +675,7 @@ 0 0 609 - 772 + 786 @@ -817,7 +817,7 @@ - + :/icons/cut.svg:/icons/cut.svg @@ -829,7 +829,7 @@ - + :/icons/copy.svg:/icons/copy.svg @@ -841,7 +841,7 @@ - + :/icons/paste.svg:/icons/paste.svg @@ -856,7 +856,7 @@ false - + :/icons/paste.svg:/icons/paste.svg @@ -873,7 +873,7 @@ - + :/icons/move-up.svg:/icons/move-up.svg @@ -885,7 +885,7 @@ - + :/icons/move-down.svg:/icons/move-down.svg @@ -897,7 +897,7 @@ - + :/icons/move-left.svg:/icons/move-left.svg @@ -909,7 +909,7 @@ - + :/icons/move-right.svg:/icons/move-right.svg @@ -921,7 +921,7 @@ - + :/icons/flip_top-bottom.svg:/icons/flip_top-bottom.svg @@ -930,7 +930,7 @@ - + :/icons/flip_left-right.svg:/icons/flip_left-right.svg @@ -939,7 +939,7 @@ - + :/icons/save.svg:/icons/save.svg @@ -951,7 +951,7 @@ - + :/icons/save.svg:/icons/save.svg @@ -981,7 +981,7 @@ - + :/icons/save_exp.svg:/icons/save_exp.svg @@ -993,7 +993,7 @@ - + :/icons/save_exp.svg:/icons/save_exp.svg @@ -1005,7 +1005,7 @@ - + :/icons/reflect_left_to_right.svg:/icons/reflect_left_to_right.svg @@ -1014,7 +1014,7 @@ - + :/icons/reflect_top_to_bottom.svg:/icons/reflect_top_to_bottom.svg @@ -1064,6 +1064,9 @@ Rotate + + Ctrl+Shift+R + @@ -1078,6 +1081,8 @@
palette.h
- + + + diff --git a/rotations/rotationdialog.cpp b/rotations/rotationdialog.cpp index 47fea81..25f68e7 100644 --- a/rotations/rotationdialog.cpp +++ b/rotations/rotationdialog.cpp @@ -2,6 +2,7 @@ #include "ui_rotationdialog.h" #include "sprite.h" +#include "QtCore/QtMath" RotationDialog::RotationDialog(options *opt, QWidget *parent) : QWidget(parent), @@ -52,18 +53,40 @@ QJsonObject RotationDialog::rotate_by(QJsonObject sprite, int angle) { Q_UNUSED(angle); - //TODO actual rotation algorithm + int rotated[24][21]; - /* - //remove this - QJsonArray sprite_data1 = sprite.value("sprite_data").toArray(); - QJsonArray sprite_data2 = sprite_data1.at(0).toArray(); - sprite_data2.removeAt(angle); - sprite_data2.insert(angle,1); - sprite_data1.removeAt(0); - sprite_data1.insert(0,sprite_data2); - sprite.insert("sprite_data", sprite_data1); - */ + //actual rotation algorithm + int i, j; + double radians = angle * (3.14159265358979323846 / 180.0); + double cosVal = qCos(radians); + double sinVal = qSin(radians); + + for (i = 0; i < 24; ++i) { + for (j = 0; j < 21; ++j) { + int x = (int)(cosVal * (i - 24 / 2) - sinVal * (j - 21 / 2) + 24 / 2); + int y = (int)(sinVal * (i - 24 / 2) + cosVal * (j - 21 / 2) + 21 / 2); + + if (x >= 0 && x < 24 && y >= 0 && y < 21) { + rotated[i][j] = sprite.value("sprite_data").toArray().at(y).toArray().at(x).toInt(); + } else { + rotated[i][j] = 0; + } + } + } + + QJsonArray sprite_data = sprite.value("sprite_data").toArray(); + for (int y = 0; y < 21; y++) + { + QJsonArray row = sprite_data.at(y).toArray(); + for (int x = 0; x < 24; x++) + { + row.removeAt(x); + row.insert(x,rotated[x][y]); + } + sprite_data.removeAt(y); + sprite_data.insert(y, row); + } + sprite.insert("sprite_data", sprite_data); return sprite; } diff --git a/rotations/rotationdialog.ui b/rotations/rotationdialog.ui index 5956e6d..9f14b25 100644 --- a/rotations/rotationdialog.ui +++ b/rotations/rotationdialog.ui @@ -62,6 +62,9 @@ + + 45 + 360