Найти симметрию различных пар на матрице - PullRequest
0 голосов
/ 04 мая 2018

У меня квадратно-плоская решетка, представленная в виде графика NxN. Есть ли способ в Юнге получить симметричную пару определенной вершины (с учетом оси симметрии). Пример: 8-> 0, 5-> 3. Моя цель - получить разные пары узлов. Поскольку пары (4,1), (4,7), (4,3) и (4,5) по существу одинаковы. (1,3) будет таким же, как (3,7) и т. Д. Возможно, некоторый алгоритм может быть выполнен на матрице и затем переведен в график.

3x3 example

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

До сих пор мне удавалось написать алгоритм, вращающий матрицу 3 раза и отслеживающий узлы с фиксированными индексами. То же самое можно написать для любого типа графика, используя визуальные координаты узла вместо индексов.

fun rotateMatrix(matrix: List<IntArray>): List<IntArray> {/*---*/}
val reflections = mutableListOf<Pair<Number, Number>>()
(0..2).fold(mat) { a, b ->
        val new = rotateMatrix(a)
        mat.forEachIndexed { x, e ->
            e.forEachIndexed { y, e2 ->
                reflections.add(mat[x][y] to new[x][y])
            }
        }
        new
    }

Результатом является отношение, описывающее, что (0,2,8,6) являются «одинаковыми»; (1,5,3,7) и т. Д. Единственное, что осталось сделать, - это использовать выходные данные, чтобы определить, каким парам узлов соответствуют какие отражающие братья и сестры.

0 голосов
/ 05 мая 2018

Общие графики не очень хорошо подходят для такого рода вещей, потому что они не имеют встроенного понятия строк, столбцов, симметрии относительно оси и т. Д .; все дело в топологии, а не в геометрии.

Если вы действительно хотите что-то подобное, вы должны либо создать подтип Graph, в котором есть нужные операции, и создать соответствующую реализацию, либо просто создать соответствующую матрицу (и сопоставление местоположений матрицы с узлами графа). и вместо этого выполните операции с этой матрицей.

...