Subversion Repositories gelsvn

Rev

Rev 646 | Rev 658 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 646 Rev 657
Line 775... Line 775...
775
            while(kernel.face(h) != f);
775
            while(kernel.face(h) != f);
776
            return f;
776
            return f;
777
        }
777
        }
778
        return kernel.face(h);
778
        return kernel.face(h);
779
    }
779
    }
-
 
780
    
-
 
781
    VertexID Manifold::slit_vertex(VertexID v, HalfEdgeID h_in, HalfEdgeID h_out)
-
 
782
    {
-
 
783
        assert(kernel.face(h_in) != InvalidFaceID);
-
 
784
        assert(kernel.face(h_out) != InvalidFaceID);
-
 
785
        assert(kernel.opp(h_out) != h_in);
-
 
786
        
-
 
787
        VertexID v_new = kernel.add_vertex();
-
 
788
        pos(v_new) = pos(v);
-
 
789
        HalfEdgeID h = kernel.prev(h_out);
-
 
790
        kernel.set_vert(h, v_new);
-
 
791
        while ( h != h_in) {
-
 
792
            h = kernel.prev(kernel.opp(h));
-
 
793
            kernel.set_vert(h, v_new);
-
 
794
        }
-
 
795
        
-
 
796
        HalfEdgeID h_in_opp = kernel.opp(h_in);
-
 
797
        HalfEdgeID hn_in, hn_in_opp;
-
 
798
        if(kernel.face(h_in_opp) != InvalidFaceID)
-
 
799
        {
-
 
800
            hn_in = kernel.add_halfedge();
-
 
801
            kernel.set_face(hn_in, InvalidFaceID);
-
 
802
            glue(h_in_opp, hn_in);
-
 
803
            
-
 
804
            hn_in_opp = kernel.add_halfedge();
-
 
805
            kernel.set_face(hn_in_opp, InvalidFaceID);
-
 
806
            glue(h_in, hn_in_opp);
-
 
807
            
-
 
808
            link(hn_in_opp, hn_in);
-
 
809
            
-
 
810
            VertexID v_i = kernel.vert(h_in_opp);
-
 
811
            kernel.set_vert(hn_in_opp, v_i);
-
 
812
            kernel.set_out(v_i, hn_in);
-
 
813
        }
-
 
814
        else
-
 
815
        {
-
 
816
            hn_in_opp = h_in_opp;
-
 
817
            hn_in = kernel.prev(hn_in_opp);
-
 
818
            h_in_opp = kernel.opp(hn_in);
-
 
819
        }
-
 
820
        
-
 
821
        HalfEdgeID h_out_opp = kernel.opp(h_out);
-
 
822
        HalfEdgeID hn_out,hn_out_opp;
-
 
823
        if(kernel.face(h_out_opp) != InvalidFaceID)
-
 
824
        {
-
 
825
            hn_out = kernel.add_halfedge();
-
 
826
            kernel.set_face(hn_out, InvalidFaceID);
-
 
827
            glue(h_out_opp, hn_out);
-
 
828
            
-
 
829
            hn_out_opp = kernel.add_halfedge();
-
 
830
            kernel.set_face(hn_out_opp, InvalidFaceID);
-
 
831
            glue(h_out, hn_out_opp);
-
 
832
 
-
 
833
            link(hn_out, hn_out_opp);
-
 
834
 
-
 
835
            VertexID v_o = kernel.vert(h_out);
-
 
836
            kernel.set_vert(hn_out, v_o);
-
 
837
            kernel.set_out(v_o, hn_out_opp);
-
 
838
        }
-
 
839
        else
-
 
840
        {
-
 
841
            hn_out_opp = h_out_opp;
-
 
842
            hn_out = kernel.next(hn_out_opp);
-
 
843
            h_out_opp = kernel.opp(hn_out);
-
 
844
        }
-
 
845
        
-
 
846
        link(hn_out_opp, hn_in_opp);
-
 
847
        link(hn_in, hn_out);
-
 
848
        
-
 
849
        kernel.set_vert(hn_in, v);
-
 
850
        kernel.set_vert(hn_out_opp, v_new);
-
 
851
        
-
 
852
        kernel.set_out(v, hn_out);
-
 
853
        kernel.set_out(v_new, hn_in_opp);
-
 
854
        
-
 
855
        return v_new;
-
 
856
    }
-
 
857
 
-
 
858
    
-
 
859
    HalfEdgeID Manifold::slit_edges(VertexAttributeVector<int>& insel)
-
 
860
    {
-
 
861
        for(auto vid : vertices())
-
 
862
        {
-
 
863
            if(insel[vid])
-
 
864
            {
-
 
865
                HalfEdgeID h_in = InvalidHalfEdgeID, h_out = InvalidHalfEdgeID;
-
 
866
                Walker w = walker(vid);
-
 
867
                while(!w.full_circle())
-
 
868
                {
-
 
869
                    if(insel[w.vertex()]) {
-
 
870
                        if(h_in == InvalidHalfEdgeID) {
-
 
871
                            if(w.opp().face() == InvalidFaceID)
-
 
872
                                h_in = w.opp().next().opp().halfedge();
-
 
873
                            else
-
 
874
                                h_in = w.opp().halfedge();
-
 
875
                        }
-
 
876
                        else {
-
 
877
                            if(w.face() == InvalidFaceID)
-
 
878
                                h_out = w.prev().opp().halfedge();
-
 
879
                            else
-
 
880
                                h_out = w.halfedge();
-
 
881
                            break;
-
 
882
                        }
-
 
883
                    }
-
 
884
                    w = w.circulate_vertex_ccw();
-
 
885
                }
-
 
886
                if(h_in != InvalidHalfEdgeID &&
-
 
887
                   h_out != InvalidHalfEdgeID) {
-
 
888
                    VertexID v_new = slit_vertex(vid, h_in, h_out);
-
 
889
                    	}
-
 
890
            }
-
 
891
        }
-
 
892
    }
-
 
893
 
-
 
894
    
780
    void Manifold::flip_edge(HalfEdgeID h)
895
    void Manifold::flip_edge(HalfEdgeID h)
781
    {
896
    {
782
        HalfEdgeID hn = kernel.next(h);
897
        HalfEdgeID hn = kernel.next(h);
783
        HalfEdgeID hp = kernel.prev(h);
898
        HalfEdgeID hp = kernel.prev(h);
784
        HalfEdgeID ho = kernel.opp(h);
899
        HalfEdgeID ho = kernel.opp(h);