Визначте, чи утворює набір плиток на сітці укладену форму


10

Враховуючи набір плиток на сітці, я хочу визначити:

  • Якщо плитки роблять укладену фігуру
  • Якщо плитки роблять додану фігуру, коли ви рахуєте сторони дошки як край фігури
  • Якщо будь-яке з попередніх двох тверджень істинне, які додаткові плитки потрапляють всередину доданої фігури, форму початкової плитки.

Гравець почне натискати на одну плитку, потім перетягнути палець на інші плитки, щоб створити ланцюжок з одноколірних плиток. Я перевірю, як піду, щоб побачити, чи дійсна наступна плитка. Вих. Якщо гравець починає на червоною черепицею, їх тільки на наступний дійсний хід до сусіднього червоною черепицею (діагоналей зробити підрахунок). Коли користувач піднімає палець, мені потрібно мати можливість перевірити 3 пункти вище.

Тож моя первісна думка полягала в тому, що, оскільки я перевіряв справність ланцюга щоразу, коли йшов, коли гравець піднімав палець, я міг перевірити, чи є перша та остання плитки сусідніми. (Я вже знаю, що вони одного кольору.) Якби вони були поруч, я мав уявлення, що я зробив вкладену фігуру, і я збирався приїхати сюди, щоб спробувати і побачити, чи не пропускаю я щось велике, і дістати якесь логічне / математичне підтвердження того, що моя думка була правильною (або приклад, що підтверджує її неправильність.)

Але саме тоді я подумав про предмет № 2: мені також доведеться враховувати ланцюги, які використовують край дошки як сторону доданої фігури. У такому випадку перший і останній пункт ланцюга не був би суміжним, але я все одно мав би вкладену фігуру. Тому зараз я повернувся до квадратного, трохи.

Що я можу зробити з цим ланцюжком координат сітки, щоб зрозуміти, чи роблять вони додану фігуру чи ні? І одного разу я дійсно знаю , що є додається фігура, що це кращий спосіб , щоб отримати додатковий список всіх плиток , які потрапляють в її межах?

введіть тут опис зображення

введіть тут опис зображення

Вище я намалював фотографії того, на що я очікую 4 можливі результати цього тесту.

  1. Ланцюг не робить поставлену фігуру.

  2. Ланцюг робить фігуру вкладеної.

  3. Якщо ви рахуєте сторони дошки як край (або більше одного краю) фігури, ланцюг робить вкладену фігуру.

  4. Ланцюг робить додану фігуру, але є додаткові точки даних (дійсно вибрані користувачем як частина ланцюга), які не є частиною створеної фігури.

Випадок 4 є найскладнішим, тому що вам доведеться витягнути "зайві" ланцюжки ланцюга, щоб знайти вкладену фігуру та шматки, які потрапляють всередину неї (але не навколо "незамкненої" області).

Отже ... У когось є ідея про хороший спосіб вирішити це, чи просто відправна точка для мене? Я начебто ходжу по колах у цей момент і можу використати інший набір очей.


1
А як щодо пересічних шляхів, як цифра-8, або пентаграма ? Ви б припустили ненульове або непарне правило заповнення ?
Анко

Справа 4 також може бути об'єднана зі Справою 3: Закрито за допомогою бортів, з додатковою інформацією
ChargingPun

Якщо у вас є вертикальна лінія, що йде вниз по центру вашої дошки від верхнього краю до низу, яка сторона дошки "закрита"?
Стівен Стадницький

Думаю, ми повинні припустити, що зараз розміщено найменший простір. Якщо OP не вказано інше.
Том 'Блакитний' Піддок

Відповіді:


3

1. Виявлення петлі плиток

Проблема здається подібною до виявлення циклу (циклу) у графіку, дивіться тут чи тут .

  • Набір вузлів Vцього графіка G=(V, E)- це плитки,
  • край e = (v1, v2)існує між двома різними вузлами, якщо плитки є прямими або діагональними сусідами

2. Обробка обкладинки екрана

Межі екрану складаються з тих уявних плиток, які утворювали б обшивку в один плитку навколо екрана видимих ​​плиток.

Відповідно до вашої специфікації частина межі екрану складе неявну частину замкнутого циклу. Просто для виявлення замкнутого циклу було б достатньо поширити графік Gна графік G', шануючи з'єднання за допомогою цього правила:

  • інший край існує між будь-якими двома різними вузлами, якщо дві плитки розташовані безпосередньо біля межі екрана

Таким чином, плитки в (0,0) і (1,0) були б частиною замкнутого циклу разом з "прикордонними плитками" (-1,0), (-1, -1), (0, -1) , (1, -1).

3. Внутрішня частина петельної ділянки

Я б перейшов у подібний напрямок до того, що запропонував користувач Артур Вульф Вайт :

Обмежуючи набір плиток, ми повинні вивчити обмежувальний ящик петлевих плиток.

Потім за допомогою заливної заливки виберіть усі плитки в обмежувальній коробці, які є зовнішньою чи внутрішньою для замкнутого контуру. Це може бути лише один із цих двох випадків. Який ми маємо з’ясувати згодом.

Розширення обмежувальної коробки по одній плитці в кожному напрямку було б також хорошою ідеєю, що дало б результат extbb, тому ми просто закінчуємо одним з'єднаним набором зовнішніх точок, на випадок, якщо ми розпочали заливку зовнішньою плиткою.

Як тільки ми маємо площу заповнення, ми також обчислимо її обмежувальне поле ffbb. У випадку, якщо ми розпочали з зовнішньої плитки, вона повинна бути ідентичною коробці з розширеною петлею.

ffbb == extbb

У випадку, якщо ми почали з внутрішньої плитки, вона повинна мати чітко менший обмежувальний ящик, тому що петлеві плитки повинні бути просочені між обома обмежувальними коробками.

ffbb < extbb

Початковою початковою плиткою для заливки може бути будь-яка плитка, всередині extbbякої є вільна плитка. Можливо, вибір одного випадкового способу є найкращим підходом.

Якби я раніше знав, що інтер'єр менший за зовнішній вигляд, я б розпочався навколо центру маси точок петлі, який знаходиться в інтер'єрі для багатьох областей (зустрічний приклад: зона у формі С), інакше на межі поля extbb. Але я поняття не маю, як це оцінити.

Заключні зауваження

Зазвичай я б сказав, що простий прогулянки, починаючи з якоїсь плитки та зберігаючи список відвіданих плиток, буде достатнім для виявлення циклу, але ця умова межі екрана може дати складніший графік, тому ви повинні бути в безпечній частині з алгоритмом графіків .

Нижче наводиться приклад, коли інтер’єр не підключений, з іншого боку, для виявлення циклу слід знайти дві петлі в цьому випадку, одну слід відкинути.

деякі випадки


1

Вирішити це можна за допомогою:

  1. Знаходження обмежувальної коробки такої форми.
  2. Збільшення розміру на 1 у кожному напрямку.
  3. Ітерація над рамою нового трохи збільшеного обмежувального вікна та нанесення заливної заливки.
  4. Якщо є плитки, які ви не позначили заливкою, які не є в цьому ланцюжку, вони додаються. Я гадаю, що за вашим визначенням, якщо є вкладені плитки, то форма є закритою фігурою.

Для того, щоб зробити один, перебрати всі плитки на ланцюгу і знайти їх minX, minY, maxXі maxYта що ваш обмежує прямокутник або AABB.

Два - дрібниці.

Ітерація над кадром проста, просто переконайтеся, що не залити мережею поза сіткою. Ви можете дізнатись, як залити Вікіпедію .

Для номера чотири можна почати лише перевіряючи плитки, прилеглі до ланцюга. Ви можете залити будь-яку плитку, яку ви не позначите, щоб знайти більше плиток.


0

Ваша інтуїція правильна, припускаючи, що ланцюжок закінчується, як тільки користувач намагається вибрати плитку, яку вони вже вибрали. У цьому випадку форма в цілому схожа на ласо, на вашому малюнку (4). Якщо вони можуть продовжувати розмахувати, то вони можуть намалювати багато петель, і все ускладнюється. Що ви хочете зробити, це відповісти на питання "в полігоні" .

Спочатку нам потрібно визначити проблему. Я припускаю, що ситуація виглядає так (2), тобто будь-який хвіст був зірваний, а кінець з'єднується назад до початку, так що кожна плитка має рівно одного "попередника" і точно одного "наступника" в ланцюжку (де попередником наступника плитки X завжди є плитка X). Далі, якщо ви будете слідувати за "спадкоємцями" досить довго, ви зрештою повернетесь туди, де ви почали. Ви можете використовувати пропозицію Гургадургена, щоб виявити, чи петля насправді перетинається на собі в будь-який момент. Якщо припустити, що ви закінчите вхід користувача, коли він це зробить, він виглядатиме як деяка серія вузлів у рядку, за якою слідує цикл. Ви можете зняти лінію з петлі отримання.

Тепер ми для кожного ряду робимо наступне:

  1. Почніть з лівого краю та відслідковуйте булеву назву для кожної плитки, яка говорить про те, чи ми ВІД або ВІД. Починати.
  2. Якщо поточна плитка є частиною ланцюга, подивіться і на наступника, і на попередника (який повинен бути сусіднім). Якщо будь-який знаходиться строго вище (тобто північ, північний схід або північний захід від поточної плитки), встановіть стан поточної плитки на протилежну від плитки ліворуч. В іншому випадку встановіть його так само, як плитку зліва. Перейти 4.
  3. Якщо поточна плитка не є частиною ланцюга, встановіть плитку на стан заголовка зліва. Перейти 4.
  4. Плитка одна праворуч - це поточна плитка. Перейти 2.

Тепер візьміть усі плитки, які є IN, додайте в плитку на межі (включаючи хвіст, якщо ви її зрізали раніше чи ні, ваш вибір), і називайте цей регіон.

Якщо ви хочете дозволити користувачеві використовувати рамки, пам’ятайте, що це не визначає та ВХОД / ВИХІД на дошці, а просто розділяє її на дві частини. Можна вибрати, наприклад, менший регіон, або вимагати, щоб користувач використовував дві сусідні сторони (тобто ліву і нижню, але не верхню / нижню або ліву / праву).

Оптимізацією є те, що вам потрібно робити лише рядки, у яких є будь-яка межа (якщо ви не можете використовувати сторони). Я припускаю, що ваша дошка досить мала, що повторення над кожною плиткою та проведення дуже простих обчислень не є проблемою, навіть у самій слабкій мобільній системі. (Зрештою, ви повинні їх надати, що є набагато складнішим завданням).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.