CGAL: Могу ли я использовать альфа-форму, чтобы упростить путь? - PullRequest
0 голосов
/ 31 октября 2018

Я бы хотел получить внешнюю часть траектории робота (границы этой траектории).

Я читал в нескольких постах, что лучший способ получить границу облака точек - это использовать альфа-формы.

Поэтому я использую реализацию CGAL в форме альфа.

enter image description here

Изображение выше:

  • Синяя точка: траектория робота
  • Красный крест: вершины оптимальной альфа-формы
  • Голубые края: края оптимального альфа-типа.

Оптимальная альфа соответствует документации CGAL альфа, для которой:

  • Все точки данных находятся либо на границе, либо внутри регуляризованной версии альфа-формы.
  • Количество твердых компонентов альфа-формы равно или меньше 1.

Если я увеличу альфа, я получу выпуклый корпус (как и ожидалось). Но я не могу найти альфа, которая даст мне следующую границу (черная на рисунке ниже):

enter image description here

Итак, мой вопрос:

Можно ли найти черную фигуру на рисунке выше благодаря альфа-фигурам с синей точкой в ​​качестве ввода?

Для тех, кто хочет увидеть, как использовать привязку CGAL python для генерации альфа-форм, вот мой код:

def computeAlphaShape(val):
    alpha_shape = Alpha_shape_2(points, 10000.0)
    it = alpha_shape.find_optimal_alpha(1)
    optimal_alpha = it.next()
    alpha_shape.set_alpha(val)
    print("Optimal alpha : " + str(optimal_alpha) + " current alpha : " + str(val))
    if val == 0:
        salpha.set_val(optimal_alpha)
        return

    print("Solid components : " + str(alpha_shape.number_of_solid_components()))

    drawResult(alpha_shape)


salpha.on_changed(computeAlphaShape)


def drawResult(alpha_shape):
    ax.clear()
    ax.plot(X, Y, 'ob')
    edges = alpha_shape.alpha_shape_edges()
    while edges.hasNext():
        eresX = []
        eresY = []

        edge = edges.next()
        segment = alpha_shape.segment(edge)
        eresX.append(segment.source().x())
        eresY.append(segment.source().y())
        eresX.append(segment.target().x())
        eresY.append(segment.target().y())
        classe = alpha_shape.classify(edge)
        color = 'g-'
        if classe == EXTERIOR:
            color = 'b-'
        elif classe == INTERIOR:
            color = 'r-'
        elif classe == SINGULAR:
            color = 'y-'
        elif classe == REGULAR:
            color = 'c-'
        ax.plot(eresX, eresY, color)
    vertices = alpha_shape.alpha_shape_vertices()
    v_res_x =[]
    v_res_y = []
    while vertices.hasNext():
        vertex = vertices.next()
        v_res_x.append(vertex.point().x())
        v_res_y.append(vertex.point().y())

    ax.plot(v_res_x, v_res_y, '+r')

1 Ответ

0 голосов
/ 31 октября 2018

Для такой задачи я бы использовал пакет упрощения , если уже есть сегменты, а пакет реконструкции 2D , если у вас есть только очки.

Альфа-форма будет работать хорошо только в том случае, если плотность точек будет равномерной, если выбрать все ребра, которые не являются НАРУЖНЫМИ. Альфа должна быть квадратом расстояния между двумя точками на траектории (чуть больше, чтобы убедиться, что край выбран). Я даже не уверен, что будет, если у вас есть детали с небольшим локальным размером элемента. В таком случае должны быть выбраны только СИНГУЛЯРНЫЕ и РЕГУЛЯРНЫЕ ребра.

...