Как можно сделать результат итерации CGAL Constrained_triangulation_plus_2 повторяемым при разных запусках?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как можно сделать результат итерации CGAL Constrained_triangulation_plus_2 повторяемым при разных запусках?

Сообщение Anonymous »

В настоящее время я работаю с 2D-триангуляцией с ограничениями CGAL. После вставки полилиний в ограниченную триангуляцию я заметил, что при итерации по ним с помощью Constraint_iterator полилинии не всегда перемещаются в одном и том же порядке, даже когда я дважды запускаю один и тот же код на одной и той же машине без перекомпиляции между ними. бежит. Стандартный вывод приведенного ниже кода показывает одни и те же полилинии с одинаковыми точками, но не всегда печатается в одном и том же порядке между различными запусками. Есть ли способ, чтобы эти полилинии всегда повторялись в одном и том же порядке? Повторяемый вывод, если это возможно, помог бы, поскольку в настоящее время я пытаюсь отладить более крупный проект CGAL.
Я также заметил, что такое непоследовательное поведение случается редко; иногда мне приходится запускать демо-версию около дюжины раз, прежде чем выходные данные покажут какие-либо несоответствия, или запускать демо-версию с разными входными полигонами, прежде чем повторить попытку. Более простые многоугольники, похоже, редко дают такую ​​недетерминированную итерацию (отсюда и сложный пример многоугольника в следующем коде).
В примере, который я использовал, есть многоугольники с общими границами и отверстиями. Вот изображение использованных примеров полигонов. Этот обход ломаной линии мне нужен для отладки кода, который также вызывает функцию CGAL simple(). Поэтому мой демонстрационный код модифицирован из документации по упрощению ломаных линий CGAL по адресу https://doc.cgal.org/latest/Polyline_si ... index.html.

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

typedef CGAL::Simple_cartesian K;
typedef CGAL::Polygon_2 Polygon_2;
typedef CGAL::Polygon_with_holes_2 Polygon_with_holes_2;

typedef CGAL::Constrained_Delaunay_triangulation_2 CDT;
typedef CGAL::Constrained_triangulation_plus_2     CT;
typedef CT::Constraint_iterator             Constraint_iterator;
typedef CT::Points_in_constraint_iterator   Points_in_constraint_iterator;

int main(int argc, char* argv[])
{
// Uncomment if using an external WKT file
// std::ifstream ifs( (argc==1)?"data/polygon.wkt":argv[1]);

// Comment out if using an external WKT file
std::stringstream ifs("POLYGON ((4.24383 50.8196, 4.38314 50.7637, 4.48228 50.793, 4.43286 50.8947, 4.29449 50.8892, 4.24383 50.8196))\nPOLYGON ((5.68787 50.8119, 5.64166 50.8642, 5.75882 50.9517, 5.75839 51.035, 5.85578 51.1446, 5.24219 51.3052, 5.07117 51.3935, 4.66969 51.4264, 4.53818 51.4824, 4.38484 51.4493, 4.43169 51.375, 4.24205 51.354, 4.07063 51.2507, 3.88635 51.2002, 3.59082 51.3044, 3.44824 51.2415, 3.36613 51.3693, 3.07833 51.3027, 2.5455 51.089, 2.71077 50.8136, 2.86315 50.7083, 3.019 50.7736, 3.17839 50.7561, 3.56821 50.7281, 3.68874 50.7747, 3.8798 50.7515, 3.93145 50.6895, 4.30794 50.7004, 4.46355 50.7551, 4.64354 50.746, 4.74861 50.8074, 4.98168 50.7698, 5.09584 50.7034, 5.38958 50.748, 5.47863 50.7235, 5.68787 50.8119), (4.24383 50.8196, 4.29449 50.8892, 4.43286 50.8947, 4.48228 50.793, 4.38314 50.7637, 4.24383 50.8196))\nPOLYGON ((5.68206 50.7575, 5.68787 50.8119, 5.47863 50.7235, 5.38958 50.748, 5.09584 50.7034, 4.98168 50.7698, 4.74861 50.8074, 4.64354 50.746, 4.46355 50.7551, 4.30794 50.7004, 3.93145 50.6895, 3.8798 50.7515, 3.68874 50.7747, 3.56821 50.7281, 3.17839 50.7561, 3.24515 50.713, 3.28845 50.5259, 3.47439 50.5337, 3.66415 50.4524, 3.65726 50.3686, 3.91011 50.3289, 4.02795 50.3584, 4.12439 50.2729, 4.23058 50.0693, 4.19482 49.9568, 4.44551 49.9372, 4.68472 49.9968, 4.70207 50.0956, 4.85042 50.1, 4.81917 49.9952, 4.89013 49.9089, 4.86309 49.8018, 5.26851 49.6966, 5.4112 49.6083, 5.4837 49.5075, 5.84181 49.5531, 5.90772 49.6391, 5.7357 49.8969, 5.89532 50.1122, 6.14766 50.1605, 6.17576 50.2354, 6.39938 50.3451, 6.3775 50.4396, 6.19691 50.5303, 6.19097 50.6397, 6.11071 50.7235, 5.89217 50.7552, 5.68206 50.7575))");

CT ct;
Polygon_with_holes_2 P;
while(CGAL::IO::read_polygon_WKT(ifs, P)){
const Polygon_2& poly = P.outer_boundary();
ct.insert_constraint(poly);
for(Polygon_with_holes_2::Hole_const_iterator it = P.holes_begin(); it != P.holes_end(); ++it){
const Polygon_2& hole = *it;
ct.insert_constraint(hole);
}
}

for(Constraint_iterator cit = ct.constraints_begin();
cit != ct.constraints_end();
++cit) {
std::cout  5.64166 50.8642
> 5.75882 50.9517
> 5.75839 51.035
> 5.85578 51.1446
> 5.24219 51.3052
> 5.07117 51.3935
> 4.66969 51.4264
> 4.53818 51.4824
> 4.38484 51.4493
> 4.43169 51.375
> 4.24205 51.354
> 4.07063 51.2507
> 3.88635 51.2002
> 3.59082 51.3044
> 3.44824 51.2415
> 3.36613 51.3693
> 3.07833 51.3027
> 2.5455 51.089
> 2.71077 50.8136
> 2.86315 50.7083
> 3.019 50.7736
> 3.17839 50.7561
> 3.56821 50.7281
> 3.68874 50.7747
> 3.8798 50.7515
> 3.93145 50.6895
> 4.30794 50.7004
> 4.46355 50.7551
> 4.64354 50.746
> 4.74861 50.8074
> 4.98168 50.7698
> 5.09584 50.7034
> 5.38958 50.748
> 5.47863 50.7235
> 5.68787 50.8119
> simplified polyline
> 4.24383 50.8196
> 4.29449 50.8892
> 4.43286 50.8947
> 4.48228 50.793
> 4.38314 50.7637
> 4.24383 50.8196
> simplified polyline
157,200d200
< simplified polyline
< 5.68787 50.8119
< 5.64166 50.8642
< 5.75882 50.9517
< 5.75839 51.035
< 5.85578 51.1446
< 5.24219 51.3052
< 5.07117 51.3935
< 4.66969 51.4264
< 4.53818 51.4824
< 4.38484 51.4493
< 4.43169 51.375
< 4.24205 51.354
< 4.07063 51.2507
< 3.88635 51.2002
< 3.59082 51.3044
< 3.44824 51.2415
< 3.36613 51.3693
< 3.07833 51.3027
< 2.5455 51.089
< 2.71077 50.8136
< 2.86315 50.7083
< 3.019 50.7736
< 3.17839 50.7561
< 3.56821 50.7281
< 3.68874 50.7747
< 3.8798 50.7515
< 3.93145 50.6895
< 4.30794 50.7004
< 4.46355 50.7551
< 4.64354 50.746
< 4.74861 50.8074
< 4.98168 50.7698
< 5.09584 50.7034
< 5.38958 50.748
< 5.47863 50.7235
< 5.68787 50.8119
< simplified polyline
< 4.24383 50.8196
< 4.29449 50.8892
< 4.43286 50.8947
< 4.48228 50.793
< 4.38314 50.7637
< 4.24383 50.8196
Я пытался просмотреть документацию CGAL, но ничего по этому поводу не нашел. Установка -DCMAKE_BUILD_TYPE=debug, похоже, также не делает итерацию детерминированной. Если это поможет, я сейчас создаю код на Mac M2 под управлением macOS 12.6 с компилятором AppleClang 14.0.0.14000029 и CGAL 5.5.1.

Подробнее здесь: https://stackoverflow.com/questions/749 ... ion-plus-2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»