2012-06-24 6 views
3

Скажем, каждый пиксель на этом рисунке (рис. 1) является элементом массива. Как бы повернуть его на 90 градусов против часовой стрелки (рис. 2) и инвертировать его вертикально (рис. 3)?Как вращать массив против часовой стрелки и инвертировать его по вертикали?

фигура 1: fig 1

фигура 2: fig 2

фигура 3: enter image description here

Мои текущие коды:

private static Color[][] invert(Color[][] chunk){ //same as rotate 
    Color[] temp; 
    for(int i=0;i<chunk.length/2;i++){ //reverse the data 
     temp=chunk[i]; 
     chunk[i]=chunk[chunk.length-i-1]; 
     chunk[chunk.length-i-1]=temp; 
    } 
    return chunk; 
} 

private static Color[][] rotate(Color[][] chunk){ 
    int cx = chunk.length; 
    int cz = chunk[0].length; 
    Color[][] rotated = new Color[cz][cx]; 
    for(int x=0;x<cx;++x){ 
     for(int z=0;z<cz;++z){ 
      rotated[z][x]=chunk[cz-z-1][x]; 
     } 
    } 
    return rotated; 
} 

переворачивания выполняет ту же функцию, что и поворота хоть. Любая помощь?

ответ

3

похоже, что вы пытаетесь транспонировать массив (fig3 = transpose(fig1)).

использовать двойной цикл и сохранить в записи [i][j] значение [j][i].

см LINK для получения дополнительной информации на матрицу транспонированной ...

так в целом, вы можете использовать, чтобы получить transpose fig3, а потом invert получить fig2.

+0

На основании вашего ответа я получил: темп = кусок [я] [J]; Кусок [I] [J] = Кусок [J] [I]; chunk [j] [i] = temp; Но это не делает ничего другого, часть остается прежней. Помогите? – jocopa3

+0

создайте новый массив 'result' и сохраните запись' input [i] [j] 'входного массива в записи' result [j] [i] '. не работают на входном массиве! – Baz

2

Баз прав, транспонирование выполнит свою работу. Похоже, ваш метод транспонирования использовал только исходный массив? Если вы зациклились на протяжении всей длины, вы отмените всю работу, которую вы сделали в первой половине. Этого метод транспонирования работает для меня:

public static Color[] [] transpose (Color[] [] a){ 
    int[] [] t = new Color [a [0].length] [a.length]; 
    for (int i = 0 ; i < a.length ; i++){ 
     for (int j = 0 ; j < a [0].length ; j++){ 
      t [j] [i] = a [i] [j]; 
     } 
    } 
    return t; 
}