Быстрое обнаружение определенных форм в облаках точек

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

Допустим, у меня есть 1000 точек в трехмерном пространстве, и я хочу обнаружить все экземпляры 3 точек, которые образуют L-образную форму, где каждый сегмент L имеет определенную длину. Облако точек может не иметь точных совпадений, но может быть очень близким (например, в облаке точек длина сегмента «L» может быть немного длиннее / короче идеальной)

Моя первоначальная идея была примерно такой :

  1. записать расстояние между всеми точками в форме, которую мы пытаемся обнаружить
  2. создать пустую «потенциальную форму»
  3. для каждой точки в нашей потенциальной форме, исследовать все точки, которые находятся на / рядом с расстояниями найдено в части 1)
  4. Если мы находим точку, добавляем ее к нашей потенциальной форме и повторяем часть 3), пока не получим все точки. Затем проверьте углы между точками, чтобы убедиться, что форма действительно правильная. Если это не так, мы переходим к следующему пункту и начинаем заново

Проблема в том, что этот подход имеет ужасное время работы наихудшего случая. В идеале я хотел бы иметь какую-то структуру данных для ускорения моих запросов на «Найти все точки, которые находятся между distanceMin и distanceMax от данной точки». Может ли кто-нибудь указать мне на некоторые полезные структуры данных, которые могут помочь.

Я думал поместить все точки в октодерево, чтобы ускорить время доступа.

Есть ли другой совет, как улучшить время работы? Эвристика для ускорения работы?

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

6
задан Bill Zimmerman 2 March 2011 в 18:38
поделиться