Как повернуть массив на 90 градусов java
Перейти к содержимому

Как повернуть массив на 90 градусов java

  • автор:

Поворот матрицы на 90 градусов

Рассмотрим алгоритм поворота матрицы на 90 градусов по часовой стрелке и против часовой стрелки. Этот алгоритм похож на транспонирование матрицы с тем отличием, что здесь для каждой точки одна из координат отображается зеркально.

// транспонирование матрицы — строки и колонки меняются местами swapped[j][i] = matrix[i][j]; // по часовой стрелке ↻ — строки отображаются зеркально rotated[j][i] = matrix[m-i-1][j]; // против часовой стрелки ↺ — колонки отображаются зеркально rotated[j][i] = matrix[i][n-j-1]; 

Напишем метод на Java для поворота матрицы < m×n >на 90 градусов. Дополнительный параметр задаёт направление поворота: по часовой стрелке или против часовой стрелки. Для примера возьмём прямоугольную матрицу < 4×3 >.

/** * @param m количество строк исходной матрицы * @param n количество колонок исходной матрицы * @param clock направление поворота: по часовой * стрелке ↻ или против часовой стрелки ↺ * @param matrix исходная матрица * @return повёрнутая матрица */ public static int[][] rotateMatrix(int m, int n, boolean clock, int[][] matrix)  // новая матрица, количества строк и колонок меняются местами int[][] rotated = new int[n][m]; // обходим строки исходной матрицы for (int i = 0; i  m; i++) // обходим колонки исходной матрицы for (int j = 0; j  n; j++) if (clock) // поворот по часовой стрелке ↻ rotated[j][i] = matrix[m-i-1][j]; else // поворот против часовой стрелки ↺ rotated[j][i] = matrix[i][n-j-1]; return rotated; > 
// запускаем программу и выводим результат public static void main(String[] args)  // исходные данные int m = 4, n = 3; int[][] matrix = <11, 12, 13>, 14, 15, 16>, 17, 18, 19>, 20, 21, 22>>; // поворачиваем матрицу и выводим результат outputMatrix("Исходная матрица:", matrix); outputMatrix("По часовой стрелке ↻:", rotateMatrix(m, n, true, matrix)); outputMatrix("Против часовой стрелки ↺:", rotateMatrix(m, n, false, matrix)); > 
// вспомогательный метод, выводит матрицу в консоль построчно public static void outputMatrix(String title, int[][] matrix)  System.out.println(title); for (int[] row : matrix)  for (int el : row) System.out.print(" " + el); System.out.println(); > > 
Исходная матрица: 11 12 13 14 15 16 17 18 19 20 21 22 По часовой стрелке ↻: 20 17 14 11 21 18 15 12 22 19 16 13 Против часовой стрелки ↺: 13 16 19 22 12 15 18 21 11 14 17 20 

© Головин Г.Г., Код с комментариями, 2021

как повернуть матрицу на 90 градусов

как повернуть это изображение на 90 градусов

что я имею:

 static void PutPixel(int x, int y, int codeColor) < ConsoleColor color = (ConsoleColor)codeColor; Console.SetCursorPosition(x, y); Console.ForegroundColor = color; Console.Write("█"); >static void DrawImageColor(int x, int y, int[,] image) < // по строчкам for (int i = 0; i < image.GetLength(0); i++) < // по столбцам for (int j = 0; j < image.GetLength(1); j++) < PutPixel(x + j, y + i, image[i, j]); // Console.Write(image[i, j]); >> > static void Main(string[] args) < int[,] mas2 = < , , , , , , , , , >; DrawImageColor(10, 10, mas2); Console.ReadLine(); > 

Отслеживать
48.8k 5 5 золотых знаков 23 23 серебряных знака 57 57 бронзовых знаков
задан 13 дек 2022 в 15:58
9 2 2 бронзовых знака

Переписать значения в новую матрицу, для каждой исходной позиции рассчитав новые координаты. Например, 0,0 перейдёт в 0, size-1 и так далее

13 дек 2022 в 16:09

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Самый простой способ — это переписать элементы в новый массив. И работать будет для матриц любого размера, не только квадратных.

private static int[,] Rotate90(int[,] matrix) < int rows = matrix.GetLength(0); int cols = matrix.GetLength(1); int[,] result = new int[cols, rows]; for (int row = 0; row < rows; row++) < for (int col = 0; col < cols; col++) < result[col, rows - row - 1] = matrix[row, col]; >> return result; > 
mas2 = Rotate90(mas2); // 90 градусов по часовой стрелке 

Отслеживать
ответ дан 13 дек 2022 в 18:32
48.8k 5 5 золотых знаков 23 23 серебряных знака 57 57 бронзовых знаков

Меняем местами пиксели по кругу и все дела, пример для квадратной матрицы

public void Rotate(int[][] matrix) < var n = matrix.Length; for (int i = 0; i < n / 2; i++) < var side = n - 2 * i - 1; var row = i; for (int j = 0; j < side; j++) < var col = i + j; var v1 = matrix[row][col]; matrix[row][col] = matrix[n - 1 - col][row]; matrix[n - 1 - col][row] = matrix[n - 1 - row][n - 1 - col]; matrix[n - 1 - row][n - 1 - col] = matrix[col][n - 1 - row]; matrix[col][n - 1 - row] = v1; >> > 

Отслеживать
ответ дан 13 дек 2022 в 16:45
32.8k 2 2 золотых знака 30 30 серебряных знаков 75 75 бронзовых знаков
на строке matrix[row, col] = matrix[n — 1 — col, row]; пишет индекс находился вне границ массива
13 дек 2022 в 17:29
Значит вы что то не так делаете. Этот код проверен многократно. Покажите ваш код.
13 дек 2022 в 18:07

@yeah вы пытаетесь применить код от зубчатого массива, написанного выше к двумерному. Будьте внимательней. [][] != [,]

13 дек 2022 в 18:20

@yeah предположу проблему тут var n = matrix.Length; , с двумерным массивом должно быть что то типа var n = matrix.GetLength(0);

MrMurder / MatrixRotation

Save MrMurder/4f2ff3353e246ec267303f8cc7f8f470 to your computer and use it in GitHub Desktop.

Повернуть матрицу на 90 (180, 270) градусов против часовой стрелки

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

public class MatrixRotation
static void createMatrix(int[][] a)
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a.length; j++)
System.out.print(a[i][j] + » «);
>
System.out.println();
>
System.out.println();
>
static void rotateM270(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[i][j] = a[j][a.length — i — 1];
>
>
System.out.println(«Rotating by 270 degree»);
createMatrix(b);
>
static void rotateM90(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[j][i] = a[a.length — i — 1][j];
>
>
System.out.println(«This matrix is rotated by 90 degree:»);
createMatrix(b);
>
static void rotateM180(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[j][i] = a[a.length — j — 1][a.length — i — 1];
>
>
System.out.println(«This matrix is rotated by 180 degree:»);
createMatrix(b);
>
public static void main(String[] args)
int[][] a = , , >;
System.out.println(«Original matrix:»);
createMatrix(a);
rotateM270(a);
rotateM90(a);
rotateM180(a);
>
>

Как повернуть массив на 90 градусов java

Приведенный ниже метод rotateMatrix() повернет массив на 90 градусов в заданном направлении :

import java.util.Arrays; public class App  public static void main(String[] args)  int[][] arr = <1,2,3>, 4,5,6>, 7,8,9>>; int[][] rotateLeft = rotateMatrix(arr, RotateType.LEFT); System.out.println(Arrays.deepToString(rotateLeft)); // => [[3, 6, 9], [2, 5, 8], [1, 4, 7]] int[][] rotateRight = rotateMatrix(arr, RotateType.RIGHT); System.out.println(Arrays.deepToString(rotateRight)); // => [[7, 4, 1], [8, 5, 2], [9, 6, 3]] > enum RotateType  // для задания типа поворота - влево или вправо LEFT, RIGHT > public static int[][] rotateMatrix(int[][] matrix, RotateType type)  var rows = matrix[0].length; var columns = matrix.length; var result = new int[rows][columns]; for (var i = 0; i  rows; i++)  for (var j = 0; j  columns; j++)  result[i][j] = (type == RotateType.LEFT) ? matrix[j][rows - 1 - i] : matrix[columns - 1 - j][i]; > > return result; > > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *