Как найти ребра и вершины нарисованного от руки многоугольника

Я хотел бы создать программу распознавания формы, которая будет отслеживать мышь и записывать ее местоположение каждые 1/2 секунды. Как я могу использовать эти точки, чтобы найти грубый многоугольник? Другими словами, если вы просто нарисуете фигуру, напоминающую треугольник или квадрат, она, скорее всего, будет размером 50-100 угольников. Как я могу упростить ее, чтобы получить форму, которую я пытался нарисовать? Я знаю, что вы могли бы создать генетический алгоритм, но точно не знаю, как он будет работать, и мне хотелось бы знать любые альтернативы.

edit: выпуклые оболочки не подойдут, нужна вогнутость для сохранения.


person invisible bob    schedule 04.06.2011    source источник


Ответы (2)


Для каждой точки на 100-угольнике найдите площадь крошечного треугольника, образованного этой точкой и точками по обе стороны. Удалите точку, создавшую наименьший треугольник. Повторяйте до тех пор, пока наименьший треугольник не станет больше некоторого порога.

person Fantius    schedule 04.06.2011
comment
Или повторяйте до тех пор, пока наименьший треугольник не станет больше некоторого процента площади основной фигуры. - person Fantius; 04.06.2011
comment
Что было бы более эффективным, размер или угол измерения? - person invisible bob; 06.06.2011
comment
например, для Pi в [P1, P2, P3 ... PN] удалите точку, если m∠p(i-1)p(i)p(i+1) › порог ? - person invisible bob; 06.06.2011
comment
Я не знаю. Я думаю, вы должны попробовать их и посмотреть. Я предполагаю, что размер был бы более эффективным, потому что, когда мышь движется медленно и сгенерированные точки расположены близко друг к другу, могут произойти большие изменения углов, даже если это не реальный угол в предполагаемой форме. - person Fantius; 06.06.2011
comment
но когда он движется быстрее, треугольники становятся больше, чем когда он движется медленно ... У меня почти есть углы, я попробую оба. Может быть, лучше всего подойдет гибрид? - person invisible bob; 08.06.2011
comment
Когда вы говорите больше, я должен предположить, что вы имеете в виду дольше. Но они также должны быть очень тонкими. Так что площадь все равно должна быть небольшой. - person Fantius; 08.06.2011
comment
Вы должны быть в состоянии создать хорошие автоматические тесты для ваших попыток алгоритма. Я бы сделал это вместо ручного субъективного тестирования. Например, вы можете создать массив точек, который представляет идеальный треугольник при различных скоростях мыши. Вы должны быть в состоянии справиться с идеальным случаем хорошо (или идеально), чтобы рассчитывать на более сложные случаи. - person Fantius; 08.06.2011

Я попробую.

  1. давайте назовем позицию, когда происходит событие щелчка мышью, точка START
  2. каждый интервал занимает другую позицию с именем CURR
  3. позволяет вызвать предыдущий CURR, PREV
  4. рассчитать наклон (дельта y/дельта x) между CURR и PREV,
  5. рассчитать наклон линии между CURR и START
  6. определить некоторый порог для разницы между двумя наклонами
  7. if the slope crosses the threshold,
    1. store the line between START AND CURR as a SIDE
    2. определить CURR как новый START
  8. повторять до тех пор, пока CURR не окажется в определенном радиусе от исходного START или не пересечет одну из предыдущих сторон

Вы могли бы быть в состоянии определить форму, просто считая стороны.

person David Chan    schedule 04.06.2011
comment
Мне нравится это решение, но я могу принять только один ответ, а другой немного более интуитивен, поэтому сначала я начну с него. - person invisible bob; 08.06.2011
comment
+1 ИМХО, использование наклонов намного лучше, чем вычисление треугольных областей, как более широкое решение для отбрасывания коллинеарных точек, особенно при работе с координатами пикселей. - person mavrosxristoforos; 13.03.2016