CGAL Mesh_3 ОШИБКА: нарушение утверждения! Выражение: минимальный_размер_ › 0 || кв_д › 0

Мое приложение использует CGAL для создания тетраэдрической сетки. На вход подаются шесть патчей (каждый в виде OFF-файла), образующих границу домена, а также файл с ребрами признаков (являющимися интерфейсами между патчами).

Благодаря помощи, которую я получил здесь и снова здесь, это сработало отлично много раз. Однако недавно я наткнулся на такой, казалось бы, безобидный пример:

Введите домен; объекты выделены красным цветом, остальные ребра сетки зелеными.

Заметим, что нижний участок представляет собой сетку цилиндра, т. е. область не является выпуклой.

Это не удается со следующим сообщением об ошибке

Error: CGAL ERROR: assertion violation!
Expr: minimal_size_ > 0 || sq_d > 0
File: /path/to/CGAL-5.2/include/CGAL/Mesh_3/Protect_edges_sizing_field.h
Line: 750

Я активировал вывод отладки над утверждением. Непосредственно перед сбоем он печатает следующее

Nearest power vertex of (16.1 2.74455 159.976) is 0x44fafe0 (16.1 2.74455 159.976 5.47731e-28) at distance: 8.08582e-28
Nearest power vertex of (16.1 2.74455 159.976) is 0x44fb3d0 (16.1 2.74455 159.976 4.84338e-28) at distance: 9.66355e-30
Nearest power vertex of (16.1 2.74455 159.976) is 0x44fb050 (16.1 2.74455 159.976 2.73616e-27) at distance: 3.23196e-27
Nearest power vertex of (16.1 2.74455 159.976) is 0x44fb590 (16.1 2.74455 159.976 7.82747e-30) at distance: 0

Чтобы увидеть точку (16.1 2.74455 159.976), нужно увеличить очень близко к углу, где сходятся три полилинии объектов.

Увеличение предыдущего изображения, показывающего точку.

Вопрос 1

Что случилось?

Я предполагаю, что при построении защитных шаров требуемый квадрат радиуса каким-то образом падает примерно до 10 ^ -60, что считается нулем. Но этого не должно быть, верно? Я попытался помочь ему, изменив несколько входных параметров (размер целевого края, допуск поверхности и т. д.), но безрезультатно.

Вопрос 2 (если нельзя ответить на вопрос 1)

Не могли бы вы указать мне место в газетах, где именно это утверждение играет роль?

Думая, что у меня достаточно приличных знаний о триангуляции Делоне, я потратил несколько часов на чтение [7] и [8]. Однако мне потребовалось бы гораздо больше времени, чтобы понять детали алгоритма и его реализации, чтобы понять, что не так. Поэтому любая помощь (даже если она просто ограничивает область поиска) приветствуется.

Похожие вопросы

Я погуглил, но многого не нашел.

  • Этот пользователь получил ту же ошибку, потому что его сетки не были подвергнуты совместному уточнению (у меня есть) .
  • Другой пользователь получил ту же ошибку после использования detect_features() (тогда как я использую add_features()).
  • Также было обсуждение в списке рассылки (сейчас не могу найти), где у кого-то возникла такая же ошибка, потому что его треугольник имел нулевую высоту (это не мой случай).

person another lisp ninja on a bike    schedule 29.03.2021    source источник
comment
Я предполагаю, что ваш график функций не является чистым. Это означает, что у вас могут быть две полилинии, которые произвольно замкнуты. Если вы не вызываете функции обнаружения, то защищены будут только границы доменов. У вас есть способ их сбросить?   -  person sloriot    schedule 29.03.2021
comment
@sloriot Большое спасибо, вы были правы. Прежде чем спрашивать, я осмотрел функции визуально, но я должен был проверить файл. В любом случае, я преобразовал это в ответ, чтобы помочь людям, которые наткнутся на это в будущем.   -  person another lisp ninja on a bike    schedule 30.03.2021


Ответы (1)


Как правильно указал @sloriot в комментариях, проблема заключалась в том, что мои ломаные линии не совпадают точно.

Чтобы помочь будущим читателям, вот соответствующая часть моего файла полилинии:

(...)
    1.6100000e+1    2.2933305e-1    1.5999984e+2
    1.6100000e+1    1.4022496e+0    1.5999386e+2
    1.6100000e+1    2.7445457e+0    1.5997646e+2
34
    1.6100000e+1    2.7445456e+0    1.5997646e+2
    1.4946531e+1    3.3592107e+0    1.5996473e+2
    1.4337449e+1    3.6838449e+0    1.5995759e+2
(...)

Обратите внимание на разницу y-координат последней точки предыдущей ломаной и первой точки второй ломаной.

person another lisp ninja on a bike    schedule 30.03.2021