2013-04-18 2 views
3

Я предлагаю вам сложный вопрос, с которым мне бы очень хотелось помочь. Позвольте мне перейти прямо к точке:Полигон «Фиксация» Алгоритм

Мне нужен алгоритм или логика, в которой я рисую фигуру с помощью мыши (например, квадрата), и она становится идеальным квадратом со всеми четырьмя сторонами прямых линий и совершенно правильный. Человеческий рисунок вряд ли идеален, но я хочу, чтобы после того, как он прошел через «фильтр» этого алгоритма, он становится таким.

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

Я хочу это для игры, просто чтобы вы знали, в чем цель всего этого.

Пожалуйста, помогите мне понять, либо алгоритм или логика позади этого, или, по крайней мере, сказать мне, что это название такого рода действия (:

PS я добавил простое изображение, так что становится еще более ясным, что я намереваюсь =)

+0

Ключевые слова: pattern matching, feature extract. (И если вы хотите идти прямо к делу, просто сделайте это.) –

+0

Попросите пользователя щелкнуть по каждой вершине. Подсчитайте количество щелчков мыши и сделайте вершины с первого щелчка и пола (.5 + middle'th). Затем нарисуйте правильный многоугольник. – rajah9

+0

нажатие на каждую вершину аннулирует его цель, что позволяет пользователю нарисовать желаемую форму. Если бы я сказал ему щелкнуть по 4 вершинам, я бы наложил на пользователя квадрат, хотя он мог бы нарисовать треугольник. И я действительно надеялся на систему, похожую, если не равную, на мастера Trine = p – Xkynar

ответ

2

Если бы мне пришлось реализовать эту задачу, я бы сохранить узнаваемые модели, и будет пытаться сделать матч для них.

Возьмите значения minX, maxX, minY, maxY из созданных пользователем точек, что поможет вам масштабировать шаблон. Выберите масштабирование так, чтобы соотношение сторон для шаблона было средним из соотношений сторон X и Y.

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

  • Там нет точек за пределами порога
  • Там, по крайней мере один пользователь нарисованные точки близко друг ключевых точек в шаблоне

Если образец согласованного , у вас будут ключевые моменты для вашего шаблона (вычисление центра вашего рисунка и размер/соотношение сторон). Затем вы можете заменить полученные пользователем рисунки вашим изображением - это может сильно отличаться от шаблона, используемого для сопоставления (представить круг).

+1

Это может быть самая простая логика для реализации ^^ – Xkynar

+0

Не так сложно. Вы также можете попытаться сопоставить вращающиеся или перевернутые версии вашего шаблона, если вы реализуете трансформацию своих ключевых точек. – gaborsch

0

Существует много способов сделать это. Один из способов сделать это - создать нейронную сеть, которая распознает эти фигуры. Я бы генерировал вариации кругов, квадратов, линий и треугольников со случайными возмущениями для тиражирования «рисованных» версий. Затем вы хотели бы представить это как двумерный массив (где места, на которые были нарисованы, будут 1 и места, которые не были нарисованы, будут содержать 0). Затем вы можете преобразовать этот двумерный массив во входной вектор n x n элементов. Результатом нейронной сети будет вектор с четырьмя элементами, каждый из которых представляет собой линию, круг, квадрат или треугольник. Затем вы тренировали бы эту нейронную сеть, используя ваши случайно искаженные изображения, пока не закончите с нейронной сетью, которая распознает вход с ошибкой, которая находится под некоторым порогом ошибки. Это на самом деле очень похоже на распознавание рукописных цифр.

Другие способы включают в себя:

+0

Я не совсем понял, что такое нейронная сеть и что вы подразумеваете под «обучением» ее в терминологии программирования, но я понял вашу логику, а не плохую идею (: кажется, сложно реализовать, хотя ... Я проверю ваши Ссылки сейчас ^^ – Xkynar

+0

@ user2295607 Да, это немного связано, но оно должно дать вам лучший результат. :) Бонус в том, что вы узнаете что-нибудь аккуратное! –

+0

, между прочим, можно ли использовать нейронные сети, если рисованный квадрат не имеет фиксированного размера? то есть, из того, что понимал я, «обучать» нейронную сеть, вам нужно привести ее примеры, но примеры могут отличаться по размеру, поскольку рисованный квадрат может иметь разные размеры, а также квадрат результата, который в моем сознании аннулирует использование нейронной сети:/исправить меня пожалуйста – Xkynar

0

Вам не только произвольную форму, у вас также есть путь фигуры. Поэтому попробуйте подсчет углов. Определите угол, который будет представлять угол. Для каждой точки проведите следующее последовательное число x точек. Измерьте угол между первой и второй половиной. Если угол превышает ваш порог, считайте его угловым. (Очевидно, выберите точку, которая даст вам лучший угол с наименьшим количеством ошибок, а не только первый, который превосходит порог.) Отметьте расположение углов и нарисуйте форму, чтобы она соответствовала.

Эллипсы & линии: если углов не обнаружено, проведите несколько сегментов. Измерьте ориентацию. Если они очень похожи, то строка. Если совсем другое, то эллипс. Если эллипс, найдите ограничительную рамку и заберите внутрь.

Смежные вопросы