Поворот изображения

Это код, который я написал, чтобы повернуть изображение на 90 градусов по часовой стрелке. Это прекрасно работает, когда высота изображения соответствует его ширине. Но когда это не так, изображение имеет черный край в конце, где должна быть остальная часть изображения. Любая помощь ценится

public void rotate(){
    int y = this.image.length;
    int x = this.image[0].length;
    int[][] rotate = new int[x][y];
    UI.println(y);
    UI.println(x);
    for(int row = 0; row<x/2; row++){
        for(int col = 0; col < ((y+1)/2); col++){
            int temp = this.image[row][col];
            rotate[row][col] = this.image[y-1-col][row];
            rotate[y-1-col][row] = this.image[y-1-row][y-1-col];
            rotate[y-1-row][y-1-col] = this.image[col][y-1-row];
            rotate[col][y-1-row] = temp;
        }
    }
    int[][] image = new int[x][y]; 
    this.image = rotate;

1 ответ

  1. Матрица преобразования для вращения

    | c   -s  0 |
    | s   c   0 |
    | 0   0   1 |
    

    c = cos тета и s = sin тета
    Transofromation матрица для перевода

    | 1   0   xr |
    | 0   1   yr |
    | 0   0   1  |
    

    Вам нужно перевести перевести центр объекта в origin
    затем поверните
    затем перевести обратно

    |1  0  xr|   |c  -s  0|   |1  0  -xr|   |x|
    |0  1  yr| x |s  c   0| x |0  1  -yr| x |y|
    |0  0  1 |   |0  0   1|   |0  0    1|   |1|
    

    После ее решения вы получите

    |x*c-y*s-xr*c+yr*s+xr|
    |x*s+y*c-xr*s-yr*c+yr|
    |          1         |
    

    Поэтому новая точка (x2, y2) такова, что

    x2 = x*c-y*s-xr*c+yr*s+xr
    y2 = x*s+y*c-xr*s-yr*c+yr
    

    поставить c = 0 ( потому что cos90 = 0 )
    и s = 1 ( потому что sin90 = 1)

    x2 = -y+yr+xr
    y2 = x-xr+yr