Почему CGAL isotropic_remeshing генерирует самопересечения?

#c #cgal

Вопрос:

Это мой первый раз, когда я использую CGAL, и я пытаюсь использовать CGAL isotropic_remeshing, следуя руководству и примерам CGAL.

 typedef CGAL::Simple_cartesian<double> geometric_kernel;
typedef CGAL::Surface_mesh<geometric_kernel::Point_3> triangle_mesh;
typedef boost::graph_traits<triangle_mesh>::edge_descriptor edge_descriptor;
typedef boost::graph_traits<triangle_mesh>::halfedge_descriptor halfedge_descriptor;

struct halfedge2edge
{
    halfedge2edge(const triangle_meshamp; m, std::vector<edge_descriptor>amp; edges)
        : m_mesh(m), m_edges(edges)
    {}
    void operator()(const halfedge_descriptoramp; h) const
    {
        m_edges.push_back(edge(h, m_mesh));
    }
    const triangle_meshamp; m_mesh;
    std::vector<edge_descriptor>amp; m_edges;
};

void remesh(std::string fname) {
     
    fmt::print("reading input file {}n", fname);
    std::ifstream input(fname);
    bool b = CGAL::IO::read_PLY(input, _mesh);
    input.close();   
    if (!b) throw std::runtime_error("cannot read input file");

    // this returns false (initial mesh is ok)
    fmt::print("Self-intersaction: {}", CGAL::Polygon_mesh_processing::does_self_intersect(faces(_mesh), _mesh) ? "YESn" : "NOn");

    std::vector<edge_descriptor> border;
    PMP::border_halfedges(faces(_mesh), _mesh, boost::make_function_output_iterator(halfedge2edge(_mesh, border)));
    split_long_edges(border, 0.05, _mesh);

    CGAL::Polygon_mesh_processing::isotropic_remeshing(faces(_mesh), 0.05, _mesh, CGAL::Polygon_mesh_processing::parameters::number_of_iterations(3).protect_constraints(true));

    // this returns true ...
    fmt::print("Self-intersaction: {}", CGAL::Polygon_mesh_processing::does_self_intersect(faces(_mesh), _mesh) ? "YESn" : "NOn");
}
 

а это файл PLY:

 ply
format ascii 1.0
element vertex 240
property double x
property double y
property double z
element face 416
property list uchar int vertex_indices
end_header
-0.0677552 1.75428e-11 0.359551 
0.559233 -5.07748e-11 -0.00371597 
-0.422648 -0.0809302 0.0767055 
-0.422648 0.0809302 0.0767055 
0.353976 -0.31933 -0.0764848 
0.353976 0.31933 -0.0764848 
0.18628 -0.105913 0.136968 
0.18628 0.105913 0.136968 
0.0734964 -0.042885 0.171005 
0.0734964 0.042885 0.171005 
0.000894007 -0.101015 0.219853 
0.000894007 0.101015 0.219853 
-0.317115 -0.490302 -0.14088 
-0.317115 0.490302 -0.14088 
0.0363557 -0.18484 0.0595056 
0.0363557 0.18484 0.0595056 
0.679924 -0.284836 -0.185795 
0.679924 0.284836 -0.185795 
-0.902296 1.60765e-11 -0.0147902 
-0.334173 -0.308304 -0.0317029 
-0.226906 -0.388018 -0.0664415 
0.238526 -0.495303 -0.175104 
0.682336 -0.249117 -0.140847 
-0.527435 -0.227159 0.105247 
-0.915072 -0.285449 -0.0849493 
-0.588108 -0.384526 0.0274976 
-0.414261 -0.558083 -0.173693 
-0.709628 -0.546197 -0.209069 
-0.279147 -0.551078 -0.191796 
-0.441742 -0.0761666 0.0919278 
0.0750773 -0.548552 -0.169267 
0.151201 -0.0861054 0.142655 
-0.328035 -0.0785272 0.130721 
-0.188634 -0.160355 0.0781907 
-0.319349 -0.157333 -0.00956133 
-0.695544 -0.0781028 0.0827349 
-0.207819 -0.26498 -0.0189174 
-0.186662 -0.497279 -0.102856 
-0.0315025 -0.481533 -0.0632797 
-0.101123 -0.565625 -0.138967 
-0.954181 -0.0987909 -0.0469328 
-0.448314 -0.217296 0.00954906 
-0.855668 -0.454036 -0.168054 
-0.685034 -0.225247 0.0590258 
-0.19149 -0.085893 0.23609 
-0.346289 -0.446491 -0.0910963 
-0.0677861 -0.240685 0.03329 
-0.570304 -0.563494 -0.181845 
-0.0991308 -0.373187 -0.0199879 
0.0256409 -0.0662504 0.220869 
0.12104 -0.443556 -0.0725518 
-0.559714 -0.0601683 0.126809 
0.7294 -0.0778938 -0.0619168 
-0.485049 -0.500588 -0.0492544 
0.0544319 -0.163186 0.072704 
-0.659303 -0.466641 -0.0854264 
-0.769765 -0.338041 -0.0415794 
-0.0697669 -0.153351 0.179993 
0.0177175 -0.341852 0.0051975 
0.142156 -0.249748 0.0257109 
0.395681 -0.491973 -0.246075 
0.585311 -0.0507501 -0.00507005 
0.579522 -0.360325 -0.214198 
0.375654 -0.398838 -0.122424 
-0.0771929 -0.0805348 0.321587 
-0.83454 -0.127215 0.00225332 
-0.445651 -0.371942 0.010079 
0.584187 -0.166126 -0.0560823 
0.491718 -0.270257 -0.0989297 
-0.334173 0.308304 -0.0317029 
-0.226906 0.388018 -0.0664415 
0.238526 0.495303 -0.175104 
0.682336 0.249117 -0.140847 
-0.527435 0.227159 0.105247 
-0.915072 0.285449 -0.0849493 
-0.588108 0.384526 0.0274976 
-0.414261 0.558083 -0.173693 
-0.709628 0.546197 -0.209069 
-0.279147 0.551078 -0.191796 
-0.441742 0.0761666 0.0919278 
0.0750773 0.548552 -0.169267 
0.151201 0.0861054 0.142655 
-0.328035 0.0785272 0.130721 
-0.188634 0.160355 0.0781907 
-0.319349 0.157333 -0.00956133 
-0.695544 0.0781028 0.0827349 
-0.207819 0.26498 -0.0189174 
-0.186662 0.497279 -0.102856 
-0.0315025 0.481533 -0.0632797 
-0.101123 0.565625 -0.138967 
-0.954181 0.0987909 -0.0469328 
-0.448314 0.217296 0.00954906 
-0.855668 0.454036 -0.168054 
-0.685034 0.225247 0.0590258 
-0.19149 0.085893 0.23609 
-0.346289 0.446491 -0.0910963 
-0.0677861 0.240685 0.03329 
-0.570304 0.563494 -0.181845 
-0.0991308 0.373187 -0.0199879 
0.0256409 0.0662504 0.220869 
0.12104 0.443556 -0.0725518 
-0.559714 0.0601683 0.126809 
0.7294 0.0778938 -0.0619168 
-0.485049 0.500588 -0.0492544 
0.0544319 0.163186 0.072704 
-0.659303 0.466641 -0.0854264 
-0.769765 0.338041 -0.0415794 
-0.0697669 0.153351 0.179993 
0.0177175 0.341852 0.0051975 
0.142156 0.249748 0.0257109 
0.395681 0.491973 -0.246075 
0.585311 0.0507501 -0.00507006 
0.579522 0.360325 -0.214198 
0.375654 0.398838 -0.122424 
-0.0771929 0.0805348 0.321587 
-0.83454 0.127215 0.00225332 
-0.445651 0.371942 0.010079 
0.584187 0.166126 -0.0560823 
0.491718 0.270257 -0.0989297 
0.244787 0.44166 -0.124611 
0.224863 0.422926 -0.103295 
0.203555 0.403002 -0.0851674 
0.181818 0.382468 -0.0666096 
0.160161 0.361466 -0.0494549 
0.138703 0.340243 -0.0343855 
0.116587 0.315975 -0.0211481 
0.0930881 0.292328 -0.010644 
0.0683716 0.270062 -0.00112955 
0.0437934 0.247639 0.00896137 
0.0147427 0.229286 0.0184032 
0.244787 -0.44166 -0.124611 
0.224863 -0.422926 -0.103295 
0.203555 -0.403002 -0.0851674 
0.181818 -0.382468 -0.0666096 
0.160161 -0.361466 -0.0494549 
0.138703 -0.340243 -0.0343855 
0.116587 -0.315975 -0.0211481 
0.0930881 -0.292328 -0.010644 
0.0683716 -0.270062 -0.00112955 
0.0437934 -0.247639 0.00896137 
0.0147427 -0.229286 0.0184032 
0.353943 0.318951 -0.0768402 
0.318176 0.310251 -0.0529674 
0.28752 0.294134 -0.0220852 
0.263653 0.270201 0.00932505 
0.248486 0.239857 0.0406095 
0.237599 0.20638 0.0706802 
0.228386 0.170062 0.097771 
0.220138 0.131333 0.121548 
0.221814 0.0891843 0.140093 
0.237727 0.0468576 0.144191 
0.240837 -4.4941e-11 0.144112 
0.353943 -0.318951 -0.0768402 
0.318176 -0.310251 -0.0529674 
0.28752 -0.294134 -0.0220852 
0.263653 -0.270201 0.00932505 
0.248486 -0.239857 0.0406095 
0.237599 -0.20638 0.0706802 
0.228386 -0.170062 0.097771 
0.220138 -0.131333 0.121548 
0.221814 -0.0891843 0.140093 
0.237727 -0.0468576 0.144191 
0.334994 0.290335 -0.0602502 
0.324017 0.260279 -0.0388522 
0.31833 0.233087 -0.011531 
0.312891 0.206844 0.0165917 
0.306376 0.17827 0.0421742 
0.301065 0.146996 0.0646615 
0.297445 0.113434 0.0839683 
0.295181 0.07813 0.10025 
0.293328 0.0406645 0.110471 
0.290482 2.27582e-11 0.115974 
0.334994 -0.290335 -0.0602502 
0.324017 -0.260279 -0.0388522 
0.31833 -0.233087 -0.011531 
0.312891 -0.206844 0.0165917 
0.306376 -0.17827 0.0421742 
0.301065 -0.146996 0.0646615 
0.297445 -0.113434 0.0839683 
0.295181 -0.07813 0.10025 
0.293328 -0.0406645 0.110471 
0.347914 0.280814 -0.0613852 
0.33858 0.251578 -0.0407904 
0.333526 0.224505 -0.0155032 
0.330611 0.199101 0.010933 
0.326488 0.172047 0.0361431 
0.321941 0.142269 0.0582371 
0.318458 0.109138 0.0750352 
0.316637 0.0738964 0.0871513 
0.31877 0.0372044 0.0929536 
0.318747 -5.36519e-12 0.0939851 
0.347914 -0.280814 -0.0613852 
0.33858 -0.251578 -0.0407904 
0.333526 -0.224505 -0.0155032 
0.330611 -0.199101 0.010933 
0.326488 -0.172047 0.0361431 
0.321941 -0.142269 0.0582371 
0.318458 -0.109138 0.0750352 
0.316637 -0.0738964 0.0871513 
0.31877 -0.0372044 0.0929536 
0.383912 0.288495 -0.0737723 
0.401167 0.260743 -0.0567028 
0.416481 0.23323 -0.0356612 
0.427658 0.205483 -0.0128446 
0.433461 0.176582 0.0104455 
0.435967 0.146037 0.0318464 
0.436745 0.113498 0.0486202 
0.434922 0.0783314 0.0602004 
0.432704 0.0414137 0.0672302 
0.439201 4.6519e-12 0.0584096 
0.383912 -0.288495 -0.0737723 
0.401167 -0.260743 -0.0567028 
0.416481 -0.23323 -0.0356612 
0.427658 -0.205483 -0.0128446 
0.433461 -0.176582 0.0104455 
0.435967 -0.146037 0.0318464 
0.436745 -0.113498 0.0486202 
0.434922 -0.0783314 0.0602004 
0.432704 -0.0414137 0.0672302 
-0.399426 0.601789 -0.253601 
-0.434361 0.571336 -0.18351 
-0.469967 0.544585 -0.115531 
-0.50467 0.50818 -0.052334 
-0.524224 0.45265 0.00308497 
-0.529609 0.384371 0.046803 
-0.53244 0.309845 0.0804658 
-0.54185 0.233414 0.106686 
-0.558825 0.155064 0.120583 
-0.554692 0.074207 0.125803 
-0.526166 3.22982e-11 0.133583 
-0.399426 -0.601789 -0.253601 
-0.434361 -0.571336 -0.18351 
-0.469967 -0.544585 -0.115531 
-0.50467 -0.50818 -0.052334 
-0.524224 -0.45265 0.00308497 
-0.529609 -0.384371 0.046803 
-0.53244 -0.309845 0.0804658 
-0.54185 -0.233414 0.106686 
-0.558825 -0.155064 0.120583 
-0.554692 -0.074207 0.125803 
3 221 76 220 
3 131 21 130 
3 33 46 57 
3 2 32 82 
3 82 94 83 
3 37 20 45 
3 235 234 66 
3 2 3 79 
3 82 32 94 
3 39 30 38 
3 12 37 45 
3 50 21 131 
3 189 190 208 
3 2 41 34 
3 13 76 103 
3 77 97 219 
3 94 0 114 
3 124 109 143 
3 86 84 83 
3 47 27 230 
3 234 53 45 
3 107 94 114 
3 26 12 53 
3 18 40 65 
3 27 47 55 
3 37 39 38 
3 25 55 234 
3 20 19 45 
3 237 23 238 
3 160 6 159 
3 36 20 48 
3 40 18 90 
3 74 115 106 
3 35 18 65 
3 56 25 43 
3 227 3 91 
3 18 35 85 
3 19 20 36 
3 32 2 34 
3 229 29 79 
3 3 82 84 
3 3 2 82 
3 13 95 87 
3 46 36 48 
3 21 30 60 
3 36 46 33 
3 44 57 64 
3 30 21 50 
3 140 14 57 
3 210 62 68 
3 132 131 63 
3 59 14 139 
3 54 59 158 
3 57 14 54 
3 3 84 91 
3 223 75 224 
3 149 81 150 
3 64 54 10 
3 215 214 67 
3 104 81 147 
3 158 6 31 
3 18 85 115 
3 85 93 115 
3 75 225 224 
3 115 93 106 
3 106 75 105 
3 84 69 91 
3 80 88 100 
3 69 70 95 
3 87 70 98 
3 69 86 70 
3 15 109 128 
3 95 70 87 
3 96 107 129 
3 100 124 123 
3 13 87 78 
3 80 89 88 
3 71 80 100 
3 80 71 110 
3 206 207 111 
3 61 52 111 
3 141 5 142 
3 118 17 112 
3 24 42 56 
3 55 25 56 
3 232 26 53 
3 42 27 56 
3 27 55 56 
3 40 24 65 
3 43 35 65 
3 37 12 28 
3 230 26 231 
3 47 230 231 
3 231 26 232 
3 47 231 232 
3 55 47 233 
3 47 232 233 
3 12 26 28 
3 26 230 28 
3 233 232 53 
3 53 12 45 
3 55 233 234 
3 233 53 234 
3 25 235 236 
3 45 19 66 
3 28 230 39 
3 37 28 39 
3 25 234 235 
3 234 45 66 
3 235 66 236 
3 43 25 236 
3 85 35 51 
3 23 41 238 
3 66 19 236 
3 236 19 41 
3 236 23 237 
3 43 236 237 
3 23 236 41 
3 239 238 29 
3 32 33 44 
3 38 50 58 
3 24 56 65 
3 56 43 65 
3 90 18 115 
3 74 90 115 
3 35 43 238 
3 43 237 238 
3 238 41 29 
3 35 238 239 
3 51 35 239 
3 41 2 29 
3 51 239 29 
3 29 2 79 
3 41 19 34 
3 19 36 34 
3 34 36 33 
3 32 34 33 
3 51 29 229 
3 85 51 101 
3 101 51 229 
3 101 229 79 
3 93 85 227 
3 85 101 228 
3 227 85 228 
3 228 101 79 
3 3 227 79 
3 227 228 79 
3 86 69 84 
3 84 82 83 
3 107 114 11 
3 83 94 107 
3 38 30 50 
3 130 60 63 
3 50 131 132 
3 154 133 153 
3 133 132 153 
3 59 134 154 
3 63 60 62 
3 21 60 130 
3 20 37 48 
3 37 38 48 
3 48 38 58 
3 46 48 58 
3 46 140 57 
3 138 59 139 
3 139 14 140 
3 58 138 139 
3 46 58 140 
3 58 139 140 
3 134 133 154 
3 59 138 137 
3 134 59 135 
3 50 132 133 
3 135 59 136 
3 50 133 134 
3 58 50 135 
3 50 134 135 
3 136 59 137 
3 58 135 136 
3 138 58 137 
3 58 136 137 
3 195 194 213 
3 152 4 210 
3 4 62 210 
3 59 154 155 
3 4 152 153 
3 59 155 156 
3 155 154 172 
3 131 130 63 
3 211 210 68 
3 4 63 62 
3 63 4 153 
3 132 63 153 
3 153 152 172 
3 154 153 172 
3 156 155 173 
3 155 172 173 
3 156 173 174 
3 192 191 210 
3 191 152 210 
3 157 174 175 
3 156 174 157 
3 62 16 68 
3 22 52 67 
3 193 192 211 
3 192 210 211 
3 193 211 212 
3 194 212 213 
3 211 68 212 
3 68 16 67 
3 0 94 44 
3 94 32 44 
3 0 44 64 
3 33 57 44 
3 0 64 49 
3 14 59 54 
3 64 57 54 
3 6 160 31 
3 158 157 175 
3 59 156 157 
3 10 54 31 
3 59 157 158 
3 6 158 159 
3 161 180 151 
3 31 161 151 
3 54 158 31 
3 49 10 31 
3 8 0 49 
3 64 10 49 
3 0 8 9 
3 8 49 31 
3 108 88 98 
3 86 83 96 
3 99 9 81 
3 31 160 161 
3 109 15 104 
3 114 0 99 
3 0 9 99 
3 11 99 81 
3 114 99 11 
3 15 107 104 
3 107 11 104 
3 104 11 81 
3 81 7 147 
3 8 31 151 
3 149 7 81 
3 7 149 148 
3 146 109 147 
3 160 159 178 
3 193 212 194 
3 158 175 176 
3 159 158 177 
3 158 176 177 
3 16 22 67 
3 213 68 214 
3 159 177 178 
3 212 68 213 
3 214 68 67 
3 196 195 214 
3 195 213 214 
3 196 214 215 
3 150 81 151 
3 198 197 216 
3 196 215 197 
3 161 160 179 
3 160 178 179 
3 9 8 151 
3 161 179 180 
3 197 215 216 
3 216 215 67 
3 81 9 151 
3 1 61 111 
3 150 151 170 
3 199 198 217 
3 198 216 217 
3 218 217 61 
3 199 217 218 
3 217 216 67 
3 67 52 61 
3 1 218 61 
3 217 67 61 
3 218 1 209 
3 170 151 171 
3 151 180 171 
3 150 170 169 
3 148 149 168 
3 149 150 169 
3 199 218 190 
3 190 218 209 
3 208 1 111 
3 208 190 209 
3 1 208 209 
3 167 148 168 
3 168 149 169 
3 186 187 205 
3 147 167 166 
3 189 208 207 
3 188 189 207 
3 187 188 206 
3 204 117 118 
3 165 147 166 
3 205 187 206 
3 205 117 204 
3 206 188 207 
3 207 208 111 
3 111 52 102 
3 205 206 117 
3 206 111 117 
3 117 111 102 
3 97 221 220 
3 93 75 106 
3 106 77 92 
3 74 106 92 
3 97 77 105 
3 77 106 105 
3 226 73 225 
3 91 69 225 
3 93 227 226 
3 227 73 226 
3 73 227 91 
3 73 91 225 
3 75 93 225 
3 93 226 225 
3 105 75 223 
3 105 223 222 
3 224 225 116 
3 225 69 116 
3 95 13 103 
3 223 224 116 
3 95 223 116 
3 69 95 116 
3 223 95 103 
3 97 105 222 
3 103 76 221 
3 221 97 222 
3 103 221 222 
3 223 103 222 
3 88 89 87 
3 88 87 98 
3 76 13 78 
3 87 89 78 
3 219 97 220 
3 76 219 220 
3 219 76 78 
3 89 219 78 
3 128 96 129 
3 83 107 96 
3 109 145 144 
3 128 109 127 
3 107 15 129 
3 15 128 129 
3 70 86 98 
3 96 128 108 
3 108 128 127 
3 143 109 144 
3 145 109 146 
3 109 104 147 
3 7 148 147 
3 145 146 164 
3 148 167 147 
3 146 147 165 
3 127 109 126 
3 108 127 126 
3 124 108 125 
3 109 124 125 
3 125 108 126 
3 109 125 126 
3 119 120 113 
3 110 71 119 
3 163 145 164 
3 144 145 163 
3 86 96 98 
3 96 108 98 
3 108 124 100 
3 88 108 100 
3 122 143 142 
3 124 143 123 
3 121 100 122 
3 121 122 142 
3 122 100 123 
3 143 122 123 
3 71 100 119 
3 100 121 120 
3 119 100 120 
3 110 119 113 
3 182 201 200 
3 143 144 163 
3 182 183 201 
3 164 146 165 
3 186 205 204 
3 183 184 202 
3 185 186 204 
3 184 185 203 
3 5 141 200 
3 143 163 162 
3 201 183 202 
3 200 201 118 
3 202 184 203 
3 117 17 118 
3 203 185 204 
3 203 204 118 
3 142 5 113 
3 120 121 113 
3 121 142 113 
3 142 143 162 
3 141 142 162 
3 113 5 112 
3 181 182 200 
3 141 181 200 
3 202 203 118 
3 201 202 118 
3 17 117 72 
3 117 102 72 
3 5 200 112 
3 200 118 112 
3 110 113 112 
 

Когда моя программа считывает файл слоя, содержащий сетку (которая хранится _mesh и не пересекается сама по себе), выполняется изотропное повторное сшивание, но после этого CGAL does_self_intersect возвращает значение true. Это нормально? Если нет, то что я сделал не так?

Ответ №1:

Я заметил, что использую Simple_cartesian ядро, поэтому изменил его с Exact_predicates_inexact_constructions_kernel помощью .

Теперь с теми же параметрами (target_edge_length = 0,05, nb_iter = 3) CGAL::Polygon_mesh_processing::does_self_intersect возвращает False