Как убрать точки (пробелы) при повороте изображения (матрицы)?
Брал формулу отсюда: https://ru.wikipedia.org/wiki/Матрица_поворота Пытаюсь повернуть картинку, но получаю белые точки, со знаками игрался, но это не помогает. Тут: https://ru.stackoverflow.com/questions/1063702/Пересчет-координат-при-повороте-изображения прочитал про отсчёт координат, я не учёл, что отсчёт с верхнего-левого угла. Возможно дело в округлении, но манипуляции с ним не дали результата. Что нужно изменить?
int* Plane1 = new int[256 * 100 * 3];
int Angle = 20;
int main()
{
readBMPTo1dArray("Helicopter.bmp", Plane1, 256, 100);
int red = 0;
int green = 0;
int blue = 0;
while (true)
{
HWND hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED, L"STATIC", NULL, WS_VISIBLE | WS_POPUP, 0, 0, 1000, 1000, NULL, NULL, NULL, NULL);
SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
HDC hdc = GetDC(hwnd);
UpdateWindow(hwnd);
Angle = Angle + 1;
if (Angle >= 360)
{
Angle = 0;
}
UpdateWindow(hwnd);
for (int y = 0; y < 100; y++)
{
for (int x = 0; x < 256; x++)
{
red = (Plane1[y * 256 * 3 + x * 3 + 0] + 256) % 256;
green = (Plane1[y * 256 * 3 + x * 3 + 1] + 256) % 256;
blue = (Plane1[y * 256 * 3 + x * 3 + 2] + 256) % 256;
COLORREF color = RGB(red, green, blue);
int x1 = x * cos(Angle * M_PI / 180) - y * sin(Angle * M_PI / 180);
int y1 = x * sin(Angle * M_PI / 180) + y * cos(Angle * M_PI / 180);
SetPixel(hdc, x1 + 500, y1 + 500, color);
}
}
Sleep(1000);
UpdateWindow(hwnd);
}
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Используйте обратное преобразование, т.е. для каждой точки результата (r) ищите соответствующую точку исходного изображения (s).
Псевдокод при вращении вокруг центров :
for xr, yr:
xs = cxs + (xr - cxr)*cos + (yr - cyr)*sin
ys = cyr - (xr - cxr)*sin + (yr - cyr)*cos
Result[xr, yr] = Source[xs, ys]


