rss

@SunXueHao

  • for(Edge* e = edges.head; e != nullptr; e = e->next_node)
            {
                Halfedge* h = e->halfedge;
                Vertex* v1 = h->from;
                Vertex* v2 = h->inv->from;
                Vertex* v3 = h->prev->from;
                Vertex* v4 = h->inv->prev->from;
                size_t d_Per = std::abs(static_cast<long>(v1->degree()-6)) + std::abs(static_cast<long>(v2->degree()-6)) + 
                               std::abs(static_cast<long>(v3->degree()-6)) + std::abs(static_cast<long>(v4->degree()-6));
                size_t d_Aft = std::abs(static_cast<long>(v1->degree()-7)) + std::abs(static_cast<long>(v2->degree()-5)) + 
                               std::abs(static_cast<long>(v3->degree()-7)) + std::abs(static_cast<long>(v4->degree()-5));
                if(d_Per > d_Aft)
                {
                    flip_edge(e);
                    printf("Flip successful: %zu\n", e->id);
                }
            }
    

    这是我的边翻转的操作,为什么我翻转边也会卡死,没有理解,我前面的做法是定义了两个 set 类,分别存放要坍缩和分裂的,考虑到一次坍缩少三条边,我坍缩这么来写的:

    for(Edge* e : selectedCollapseEdges)
            {
                    printf("Attempting to collapse edge: %zu\n", e->id);
                    if(selectedCollapseEdges.find(e->halfedge->next->edge) != selectedCollapseEdges.end())
                    {
                        selectedCollapseEdges.erase(e->halfedge->next->edge);
                    }
                    if(selectedCollapseEdges.find(e->halfedge->inv->next->edge) != selectedCollapseEdges.end())
                    {
                        selectedCollapseEdges.erase(e->halfedge->inv->next->edge);
                    }                
                        collapse_edge(e);
                        
                    printf("Collapse successful: %zu\n", e->id);
            }
    

    这么写感觉怪怪的但是能运行过这一段
    QQ 图片 20241119214110|690x258, 75%
    这个是我翻转卡死的终端,我不知道是什么原因。 😩 😫 😩 😫

    Post #3