масштабирование двумерного массива с заполнением (масштабирование матриц)
Предположим у меня есть массив int[3,3] или даже bool[3,3], где элементы выглядят так:
|0 1 0|
|0 0 0|
|0 0 0|
Мне нужно на его основе получить второй массив допустим размером 9х9
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
Который по сути является более "Детализованной" версией своего предшественника.
Естественно в исходном массиве расположение единицы может быть где угодно, и она может быть даже не одна. Я только начал изучение данного направления, и не удивлюсь если что-то подобное можно реализовать с помощью какой-нибудь библиотеки допустим так: myMatrix.scale(x,y)
Я нашел некий класс Matrix в System.Drawing.Drawing2D но похоже он служит для других целей
В массиве может быть только 0 и 1. Коэффициент увеличения только целочисленный от двух до трех раз, не больше, результируюшая матрица должна иметь идентичные с исходной соотношения сторон.
Ответы (2 шт):
я сделал ответ на основе не двухмерного массива, а на основе вложенного массива. Но в во вложенный массив можно ложить двухмерный массив если что.
public int[][] EnlargeArray(int[][] arr, int times)
{
var lst = new List<int>();
foreach(var row in arr)
{
var tmp = enlargeRow(row, times);
// дублирование полученной строки times раз
for(int i = 0; i < times; i++)
{
lst.Add(tmp);
}
}
return lst.ToArray();
}
public int[] enlargeRow(int[] arr, times) {
var lst = List<int>();
// генерация одной строки
for (int i = 0; i <= arr.Length; i++)
{
// дублирование times раз
for (int t = 0; t < times; t++)
{
lst.Add(arr[i]);
}
}
return lst.ToArray();
}
Код писал из головы поэтому могут быть мелкие логические и синтаксические ошибки.
Простое деление индексов на коэффициент может решить задачу.
static void Main(string[] args)
{
int[,] matrix = new[,]
{
{ 0, 1, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
};
PrintMatrix(matrix);
int[,] scaledMatrix = Scale(matrix, 3);
Console.WriteLine();
PrintMatrix(scaledMatrix);
Console.ReadKey();
}
static int[,] Scale(int[,] matrix, int scale)
{
int[,] result = new int[matrix.GetLength(0) * scale, matrix.GetLength(1) * scale];
for (int i = 0; i < result.GetLength(0); i++)
{
for (int j = 0; j < result.GetLength(1); j++)
{
result[i, j] = matrix[i / scale, j / scale];
}
}
return result;
}
static void PrintMatrix(int[,] matrix)
{
for (int i = 0; i < matrix.GetLength(0); i++)
{
Console.Write("|");
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j]);
if (j < matrix.GetLength(1) - 1)
Console.Write(" ");
}
Console.WriteLine("|");
}
}
Вывод в консоль
|0 1 0|
|0 0 0|
|0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|