CGAL добавляет данные в дескриптор лица

Я использую CGAL в Python, и я хотел бы иметь возможность добавлять данные в дескриптор лица в триангуляции. Похоже, Python позволяет мне хранить эту информацию, но она не сохраняется, например:

from CGAL.CGAL_Kernel import Point_2
from CGAL.CGAL_Triangulation_2 import Delaunay_triangulation_2

#triangulate a square
points = [Point_2(0,0), Point_2(0,1), Point_2(1,0), Point_2(1,1)]
D = Delaunay_triangulation_2()
D.insert(points)

#attempt to store information in face handle
for f in D.finite_faces():
    f.data = 'my data'

#this information does not persist
for f in D.finite_faces():
    print(f.data)

Выполнение приведенных выше результатов приводит к

AttributeError: 'Delaunay_triangulation_2_Face_handle' object has no attribute 'data'

Можно ли хранить информацию в триангуляции, и если да, то как?


person mv3    schedule 08.01.2018    source источник
comment
Код C++ может справиться с этим, но с другими параметрами шаблона, что требует перекомпиляции, а это означает, что интерфейс python вряд ли даст вам доступ к этому. Возможно, вы захотите сохранить какую-то карту (хотя я не думаю, что у вас есть хеширование или сортировка лиц, поэтому это может быть нетривиально).   -  person Marc Glisse    schedule 08.01.2018
comment
Все грани, вершины и ребра реализуют __hash__, сейчас я работаю над чем-то вроде этого в качестве обходного пути.   -  person mv3    schedule 08.01.2018


Ответы (1)


Я ничего не знаю ни об одной из этих библиотек, но могу предположить, что finite_faces() каждый раз создает новый набор объектов. Вы должны хранить их в списке, а затем последовательно перебирать этот список, а не снова вызывать метод.

faces = D.finite_faces():
for f in faces:
    f.data = 'my data'

for f in faces:
    print(f.data)
person Daniel Roseman    schedule 08.01.2018
comment
D.finite_faces() возвращает итератор. Делать что-то похожее на то, что вы предлагаете, работает faces = [f for f in D.finite_faces()], но это не лучший вариант для меня, так как впоследствии мне нужно сделать что-то вроде for e in D.finite_edges(): if face(e).data == 0: do something - person mv3; 08.01.2018