Что вам нужно сделать, это определить словарь индексации для каждой грани мозаики, так чтобы индекс правого края мог сказать вам, каков индекс соответствующего левого края (например, простой словарь: «выпуклый» и «вогнутый», с «выпуклым» на лице, подразумевающим «вогнутый» на соответствующем противоположном лице), а затем классифицирует каждый фрагмент в соответствии с индексным словарем. Чем тоньше словарный запас, тем более различим подбор лиц и тем быстрее будет работать ваш алгоритм, как бы вы его не реализовали. (Например, у вас может быть «плоский край, прямой край-наклон слева, прямой-наклон наклон вправо, вогнутый, выпуклый, ручка, отверстие-ручка, ...). Мы предполагаем, что схема индексации абстрагирует фактическая форма края и наличие предиката «точно совпадает (piece1, edge1, piece2, edge2)», который имеет значение true, только если края точно совпадают. Далее мы предполагаем, что существует не более одного точного соответствия элемента с определенным краем.
Цель состоит в том, чтобы вырастить набор регионов, например, набор связанных частей, до тех пор, пока больше не будет возможности вырастить регионы. Сначала мы помечаем все фрагменты с уникальными именами регионов, по 1 на фрагмент, и по всем ребрам как несопоставленные. Затем мы перечисляем ребра куска в любом порядке. Для каждого перечисляемого элемента P с ребром E используйте схему индексации, чтобы выбрать потенциально совпадающие пары элемент / ребро. Проверьте предикат точно подходит; не более одного куска Q с ребром F точно совпадает. Объедините области для P и Q вместе, чтобы сделать большую область. Повторение. Я думаю, что это решает загадку.