@2214312040

  • 考虑到原函数逻辑不完善,有卡住的风险,于是对 HalfedgeMesh::isotropic_remesh() 中对 collapse 的调用做了一点改进:
    tmp=this->edges.head;
    int is_tail=0;
    while(1){
    if(tmp==this->edges.tail){
    is_tail=1;
    }
    if(tmp->length()<4.0/5.0*aver_len){
    collapse_edge(tmp);
    }
    if(is_tail==1){
    break;
    }
    else{
    tmp=tmp->next_node;
    }
    }
    但结果依然卡死,正如一开始提问说到的,问题出现在第 63 次 collapse 操作时删除点的操作之前

    Post #6
  • void HalfedgeMesh::erase(Edge* e)
    {
    erased_edges[e->id] = edges.release(e);
    }
    这是 erase 函数,它实际上是调用了 edges 的 release 函数
    Node* LinkedList::release(Node* node)
    {
    if (node == nullptr || !this->size) {
    return nullptr;
    }
    --this->size;
    if (!this->size) {
    // Erase the last element in the list
    this->head = nullptr;
    this->tail = nullptr;
    } else if (node == this->head) {
    // Erasure for the head node
    this->head = this->head->next_node;
    this->head->prev_node = nullptr;
    } else if (node == this->tail) {
    // Erasure for the tail node
    this->tail = this->tail->prev_node;
    this->tail->next_node = nullptr;
    } else {
    // Otherwise a general erasure
    node->prev_node->next_node = node->next_node;
    node->next_node->prev_node = node->prev_node;
    }
    return node;
    }
    这是 release 函数,我们可以看到,在这个过程中,tmp 虽然从链表中被剔除,但是它的内存并没有释放,同时,tmp 的 next_node 也没有改变,所以调用 tmp->next_node 理应是合法的,同理,按照您所说,collapse_edge 会百分之一百从链表中删除传入的元素,那么这个程序从 collapse 第一个节点时就会卡死,应该不至于到第 63 次 collapse 才卡死

    Post #5
  • 这是我卡死前的命令行输出,显示卡死前并没有删除 vertex,但是已经进入了 collapse_edge 函数
    [Halfedge Mesh] [info] not on_boundar:35897,9465,35936,9464,35938,9462,35937,35905,21345,35939,35941

    [Halfedge Mesh] [info] not on_boundar:21374,9472,35948,9471,35950,9470,35949,21373,9494,35951,35953

    [Halfedge Mesh] [info] vertex

    [Halfedge Mesh] [info] face

    [Halfedge Mesh] [info] edge

    [Halfedge Mesh] [info] halfedge

    [Halfedge Mesh] [info] not on_boundar:21374,9472,35948,9471,35950,9470,35949,21373,9494,35951,35953

    [Halfedge Mesh] [info] not on_boundar:35943,9494,9496,35984,35951,35952,9474,9469,35987,35986,10081

    [Halfedge Mesh] [info] vertex

    [Halfedge Mesh] [info] face

    [Halfedge Mesh] [info] edge

    [Halfedge Mesh] [info] halfedge

    [Halfedge Mesh] [info] not on_boundar:35943,9494,9496,35984,35951,35952,9474,9469,35987,35986,10081

    [Halfedge Mesh] [info] not on_boundar:10057,9496,35984,9494,35986,9493,35985,10056,35951,35987,35989

    Post #3
  • 每次都会在同一个地方卡住,这是我 collapse_edge 函数对不在边界的边的处理:
    可见,在开头和结尾会输出参与此次操作的半边 id,然后成功删除点后会输出 vertex,删除其他元素同理
    image|576x499

    Post #2
  • toolbar.cpp
    scene.cpp
    group.cpp
    object.cpp
    camera.cpp
    C:\data\submissions\dandelion\src\scene\camera.cpp(55,17): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\scene\camera.cpp(55,17): warning C4189: “right”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    light.cpp
    stb_image_wrapper.cpp
    kinetic_state.cpp
    logger.cpp
    rasterizer.cpp
    rasterizer_renderer.cpp
    C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(101,41): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(101,41): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(102,41): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(112,52): warning C4267: “初始化”: 从“size_t”转换到“unsigned int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    whitted_renderer.cpp
    render_engine.cpp
    triangle.cpp
    halfedge_mesh.cpp
    正在生成代码...
    正在编译...
    meshedit.cpp
    C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,15): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,15): warning C4189: “e2”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,28): warning C4189: “e3”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    C:\data\submissions\dandelion\src\geometry\meshedit.cpp(74,30): warning C4189: “p2”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
    halfedge.cpp
    vertex.cpp
    edge.cpp
    face.cpp
    solver.cpp
    imgui.cpp
    imgui_demo.cpp
    imgui_draw.cpp
    imgui_tables.cpp
    imgui_widgets.cpp
    imgui_impl_glfw.cpp
    imgui_impl_opengl3.cpp
    正在生成代码...
    2.8 显示提交错误,产生了一大堆看不懂且毫无反馈效果的东西

    Post #5
  • 经过实践,id 为空是不可以的,类中没有定义参数为空的构造函数

    Post #4
  • 是添加了的
    image|579x352
    这是我 cmakelist 的写法,我使用了 fetchcontent:
    image|492x186

    Post #4
  • 您好,能说的更具体一些吗,是有什么问题,这是我文件的初始状态:
    image|621x326
    运行 cmake .
    image|499x500
    接着 make:
    image|469x500
    最后执行:
    image|466x500

    Post #3