Я бы хотел получить внешнюю часть траектории робота (границы этой траектории).
Я читал в нескольких постах, что лучший способ получить границу облака точек - это использовать альфа-формы.
Поэтому я использую реализацию CGAL в форме альфа.
Изображение выше:
- Синяя точка: траектория робота
- Красный крест: вершины оптимальной альфа-формы
- Голубые края: края оптимального альфа-типа.
Оптимальная альфа соответствует документации CGAL альфа, для которой:
- Все точки данных находятся либо на границе, либо внутри регуляризованной версии альфа-формы.
- Количество твердых компонентов альфа-формы равно или меньше 1.
Если я увеличу альфа, я получу выпуклый корпус (как и ожидалось).
Но я не могу найти альфа, которая даст мне следующую границу (черная на рисунке ниже):
Итак, мой вопрос:
Можно ли найти черную фигуру на рисунке выше благодаря альфа-фигурам с синей точкой в качестве ввода?
Для тех, кто хочет увидеть, как использовать привязку 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')