CGAL seam_mesh: как включить шов в halfedge_descriptor границы?

Я параметризую простую сетку (см. рисунок ниже) с помощью 8cpp-example.html" rel="nofollow noreferrer">seam_Polyhedron_3. cpp пример CGAL 4.14.

простой пример сетки

Я определил вершины для «разрезания», которые я записал в файл шва (они лежат вдоль одной полилинии, соединяющей нижнюю и верхнюю границу):



73 75 80 120

Тем не менее, я смущен тем, что линия

halfedge_descriptor bhd = CGAL::Polygon_mesh_processing::longest_border(mesh).first;

возвращает: кажется, что он перебирает только нижнюю границу. Это я мог проверить, посчитав вершины на границе,

typedef typename boost::graph_traits<Mesh>::vertex_descriptor Mesh_vertex_descriptor;
Mesh_vertex_descriptor beg = source(bhd, mesh);
int i=0;
do
{
    i++;
    bhd = next(bhd, mesh);
}
while(source(bhd, mesh) != beg);
std::cout << "There were " << i << " vertices on the boundary." << std::endl;

который вернул 34 (что, в свою очередь, является количеством вершин на нижней границе).

Вопрос. Как изменить конструкцию bhd, чтобы она охватывала всю (виртуальную) границу? То есть итерация, которую я только что показал, должна проходить через нижнюю границу, шов вверх, верхнюю границу и шов вниз и возвращать 32 + 3 + 32 + 3 = 70?

До сих пор я пытался найти альтернативу longest_boundary и посмотрите, есть ли возможность изменить поведение через именованные параметры . Я также пробовал добавлять вершины на нижней и верхней границах сетки, но это ничего не меняет, как указано в документации Seam_mesh. Изменение порядка вершин шва также не дало видимых изменений.

Заранее спасибо!


person Dominik Mokriš    schedule 17.06.2020    source источник
comment
Является ли mesh сеткой шва или основной сеткой поверхности? Вы проверили, что ваш файл полилинии был правильно прочитан? Вы пытались добавить его вручную с помощью Seam_mesh::add_seam() ? Я действительно не думаю, что это проблема поведения longest_boundary(), либо это ошибка, либо ваша сетка шва не такая, как вы думаете.   -  person mgimeno    schedule 18.06.2020
comment
@mgimeno mesh — это seam_mesh. Я попробую добавить шов вручную. Как проверить правильность полилинии? Все, о чем я сейчас могу думать, это попытаться напечатать координаты его вершин.   -  person Dominik Mokriš    schedule 18.06.2020
comment
Вы можете открыть файл в потоке и протестировать поток с помощью чего-то вроде std::ifstream in("yourfile.txt"); if(!in) std::cerr<<"file not found"<<std::endl;   -  person mgimeno    schedule 18.06.2020
comment
Спасибо. На самом деле пример уже проверяет, вернул ли add_seams полуребро. Я не хотел выкладывать пример (он из документации и тогда вопрос был бы довольно длинным), но, наверное, было бы лучше, потому что перед нами был бы исходный код.   -  person Dominik Mokriš    schedule 18.06.2020
comment
В любом случае комментарий @mgimeno помог мне понять, что не так, спасибо!   -  person Dominik Mokriš    schedule 18.06.2020


Ответы (1)


Комментарий @mgimeno помог мне понять, что не так. Я публикую это как ответ на случай, если кто-то в будущем запутается в структуре файлов .selection.txt (см. также связанное обсуждение).

Вот еще раз меш, но с метками вершин, по которым я хочу разрезать.

сетка с помеченными вершинами

Совет. Чтобы найти эти числа в вашей сетке, откройте ее в Meshlab и нажмите «Рендеринг» > «Показать метки». Он хорошо работает с сетками в формате .off, но может столкнуться с проблемами с .stl, где порядок вершин не указан.

На основе документации Seam_mesh::add_seam(..) нам нужно добавить три ребра шва. Каждое из этих ребер задается индексами своих концов. Правильный формат seam.selection.txt тогда



73 75 75 80 80 120

Обратите внимание на дубликаты (каждая вершина есть один раз в качестве начальной точки и один раз в качестве конечной точки) и две ведущие пустые строки.

Граница теперь имеет 70 вершин (я неоднократно ошибался в исходной версии моего вопроса).

person Dominik Mokriš    schedule 18.06.2020