Переверните массив данных Cellular Automata в музыку (например, WolframTones) - PullRequest
2 голосов
/ 27 марта 2012

Хорошо, поэтому, используя некоторые базовые принципы Cellular Automata, мне удалось запустить программу, которая генерирует набор данных, рассчитанный по правилам.Каждая ячейка является логической.

В настоящее время я храню его как булевские [] [] данные, где первый индекс - строка, а второй - ячейка.

Теперь я дошел до того, что хотел бы преобразовать эту музыку в партитуру (сохраненную в виде массива).На странице показана диаграмма того, как она будет преобразована из данных CA -

Source

для оценки данных

Target

У меня проблемы с пониманием того, как это будет сделано прогрессивно с использованием моей схемы хранения.Если кто-то может помочь, это было бы здорово, я могу предоставить больше информации, если это необходимо.

1 Ответ

1 голос
/ 27 марта 2012

Отображение выглядит прямо вперед:

target[x, y] = source[OFFSET - y, x]

, где OFFSET - это индекс последней строки для копирования (33, если я считал правильно).

Ваша реализация может просто использовать два вложенных цикла для копирования массива.


EDIT:

Вот как может выглядеть ваш конвертер:

public class Converter
{
    public static boolean[][] convert(boolean[][] source, int offset, int width)
    {
        final boolean[][] target = new boolean[width][source.length];

        for(int targetRow=0 ; targetRow<width ; targetRow++)
        {
            for(int targetCol=0 ; targetCol<source.length ; targetCol++)
            {
                target[targetRow][targetCol] = source[targetCol][offset + width-1 - targetRow];
            }
        }

        return target;
    }
}

Это вывод тестового кода ниже (исходный массив и преобразованный массив) с использованием смещения 2 (первые две строки опущены) и ширины 7 (семь столбцов преобразуются):

     █     
    ███    
   ██  █   
  ██ ████  
 ██  █   █ 
██ ████ ███

   █ █
  ██  
 █ █ █
██ ███
 ██  █
  ██ █
   ██ 

Тест-код предназначен для преобразования строкового определения исходного массива и вывода содержимого массива:

public class ConverterTest
{
    private final static int OFFSET = 2;
    private final static int WIDTH = 7;

    private static final String[] sourceString = {
        "     █     ",
        "    ███    ",
        "   ██  █   ",
        "  ██ ████  ",
        " ██  █   █ ",
        "██ ████ ███",
    };


    public static void main(String[] args)
    {
        final boolean[][] source = getSourceArray();
        printArray(source);
        final boolean[][] target = Converter.convert(source, OFFSET, WIDTH);
        printArray(target);
    }


    private static boolean[][] getSourceArray()
    {
        final boolean[][] sourceArray = new boolean[sourceString.length][sourceString[0].length()];

        for(int row=0 ; row<sourceString.length ; row++)
        {
            for(int col=0 ; col<sourceString[0].length() ; col++)
            {
                sourceArray[row][col] = (sourceString[row].charAt(col) != ' ');
            }
        }

        return sourceArray;
    }


    private static void printArray(boolean[][] arr)
    {
        for(int row=0 ; row<arr.length ; row++)
        {
            for(int col=0 ; col<arr[0].length ; col++)
            {
                System.out.print(arr[row][col] ? '█' : ' ');
            }
            System.out.println();
        }
        System.out.println();
    }
}
...