CGAL detect_features () создает незащищенные функции - PullRequest
0 голосов
/ 18 июня 2020

На основе этого примера (повторное зацепление многогранного домена с поверхностями в 3D Me sh Руководство по созданию ), я хочу, чтобы sh домен в форме куба с его средняя панель защищена (см. код ниже). Однако, make_mesh_3 вызывает нарушение утверждения:

CGAL ERROR: assertion violation!
Expr: minimal_size_ > 0 || sq_d > 0

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

Не разрешены ли пересекающиеся многогранники в области сетки? Если да, есть ли способ получить доступ к результатам detect_features и управлять ими для обработки конфликтующих функций? Я пытаюсь понять, как полилинии хранятся в домене me sh, но ничего не добился.

Куб с промежуточной плоскостью

// --- External Includes ---
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_polyhedron_3.h>

#include <CGAL/Polyhedral_mesh_domain_with_features_3.h>
#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>
#include <CGAL/make_mesh_3.h>

// CGAL types
namespace cgal {

using Kernel            = CGAL::Exact_predicates_inexact_constructions_kernel;
using ConcurrencyTag    = CGAL::Sequential_tag;
using PolyhedronSurface = CGAL::Mesh_polyhedron_3<Kernel>::type;

using MeshDomain        = CGAL::Polyhedral_mesh_domain_with_features_3<Kernel>;
using Tr                = CGAL::Mesh_triangulation_3<MeshDomain,CGAL::Default,ConcurrencyTag>::type;
using Triangulation     = CGAL::Mesh_complex_3_in_triangulation_3<Tr>;
using MeshCriteria      = CGAL::Mesh_criteria_3<Tr>;

using Point             = cgal::MeshDomain::Point_3;
}



int main()
{
    // Define points for the cube and midPlane
    std::vector<cgal::Point> points = 
    {
        cgal::Point(  1.0,    0.0,    0.0),
        cgal::Point(  1.0,    1.0,    0.0),
        cgal::Point(  0.0,    1.0,    0.0),
        cgal::Point(  0.0,    0.0,    0.0),
        cgal::Point(  1.0,    0.0,    1.0),
        cgal::Point(  1.0,    1.0,    1.0),
        cgal::Point(  0.0,    1.0,    1.0),
        cgal::Point(  0.0,    0.0,    1.0),

        cgal::Point(  1.0,    0.0,    0.5),
        cgal::Point(  1.0,    1.0,    0.5),
        cgal::Point(  0.0,    1.0,    0.5),
        cgal::Point(  0.0,    0.0,    0.5)
    };

    // Create polyhedra
    cgal::PolyhedronSurface cube, midPlane;
    cube.make_triangle( points[0],  points[3],  points[1]);
    cube.make_triangle( points[1],  points[3],  points[2]);
    cube.make_triangle( points[4],  points[5],  points[7]);
    cube.make_triangle( points[5],  points[6],  points[7]);

    cube.make_triangle( points[0],  points[4],  points[3]);
    cube.make_triangle( points[3],  points[4],  points[7]);
    cube.make_triangle( points[1],  points[2],  points[5]);
    cube.make_triangle( points[2],  points[6],  points[5]);

    cube.make_triangle( points[2],  points[3],  points[6]);
    cube.make_triangle( points[3],  points[7],  points[6]);
    cube.make_triangle( points[0],  points[1],  points[5]);
    cube.make_triangle( points[0],  points[5],  points[4]);

    midPlane.make_triangle( points[8],  points[9],  points[10]);
    midPlane.make_triangle( points[8],  points[10], points[11]);

    // Triangulation
    cgal::MeshDomain meshDomain( midPlane, cube );
    meshDomain.detect_features();

    cgal::MeshCriteria meshCriteria(    CGAL::parameters::facet_angle   = 30,
                                        CGAL::parameters::edge_size     = 0.2 );

    auto triangulation = CGAL::make_mesh_3<cgal::Triangulation>(    meshDomain,
                                                                    meshCriteria );

    return 0;
}

Ответы [ 2 ]

1 голос
/ 25 июня 2020

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

1 голос
/ 18 июня 2020

Из здесь :

Эта поверхность не должна иметь пересечения.

В вашем случае ограничивающая рамка и промежуточная плоскость пересекаются. Если вы хотите, чтобы я sh получил эту геометрию, эти сетки необходимо соединить вместе перед созданием сетки.

Если вы посмотрите на пример в разделе 3.3.2 здесь , вы увидите аналогичный пример с внутренней геометрией, которая находится вне ограничивающего прямоугольника.

detect_features () не пересекает непересекающиеся входы: он просто ищет функции в существующем me sh (и добавляет их в домен, поэтому сетка будет их уважать).

...