Subversion Repositories gelsvn

Rev

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

Rev 586 Rev 587
Line 22... Line 22...
22
    void flatten(Manifold& m, WeightScheme ws)
22
    void flatten(Manifold& m, WeightScheme ws)
23
    {
23
    {
24
        HalfEdgeAttributeVector<double> edge_weights(m.allocated_halfedges(), 0);
24
        HalfEdgeAttributeVector<double> edge_weights(m.allocated_halfedges(), 0);
25
		for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f)
25
		for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f)
26
		{
26
		{
27
			for(HalfEdgeWalker wv = m.halfedgewalker(*f); !wv.full_circle(); wv = wv.circulate_face_ccw())
27
			for(Walker wv = m.walker(*f); !wv.full_circle(); wv = wv.circulate_face_ccw())
28
			{
28
			{
29
				HalfEdgeID h = wv.halfedge();
29
				HalfEdgeID h = wv.halfedge();
30
				Vec3d p1(m.pos(wv.vertex()));
30
				Vec3d p1(m.pos(wv.vertex()));
31
				Vec3d p2(m.pos(wv.next().vertex()));
31
				Vec3d p2(m.pos(wv.next().vertex()));
32
				Vec3d p0(m.pos(wv.opp().vertex()));
32
				Vec3d p0(m.pos(wv.opp().vertex()));
Line 66... Line 66...
66
        for(; v != m.vertices_end(); ++v){
66
        for(; v != m.vertices_end(); ++v){
67
            if(boundary(m, *v))
67
            if(boundary(m, *v))
68
                break;
68
                break;
69
        }
69
        }
70
        int n = 0;
70
        int n = 0;
71
        HalfEdgeWalker bv = m.halfedgewalker(*v);
71
        Walker bv = m.walker(*v);
72
        do{
72
        do{
73
            ++n;
73
            ++n;
74
            bv = bv.next();
74
            bv = bv.next();
75
        }
75
        }
76
        while(bv.vertex() != *v);
76
        while(bv.vertex() != *v);
Line 78... Line 78...
78
        int i = 0;
78
        int i = 0;
79
        do{
79
        do{
80
			if(i==int(n*0.25) || i==int(n*0.75))
80
			if(i==int(n*0.25) || i==int(n*0.75))
81
				touched[bv.vertex()]=1;
81
				touched[bv.vertex()]=1;
82
            double a = 2.0*M_PI*double(i)/n;
82
            double a = 2.0*M_PI*double(i)/n;
83
            m.pos(bv.vertex()) = Vec3f(cos(a), sin(a), 0);
83
            m.pos(bv.vertex()) = Vec3d(cos(a), sin(a), 0);
84
            ++i;
84
            ++i;
85
            bv = bv.next();
85
            bv = bv.next();
86
        }
86
        }
87
        while(bv.vertex() != *v);
87
        while(bv.vertex() != *v);
88
		
88
		
89
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
89
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
90
            if(!boundary(m, *v))
90
            if(!boundary(m, *v))
91
                m.pos(*v) = Vec3f(0.0);
91
                m.pos(*v) = Vec3d(0.0);
92
		
92
		
93
        VertexAttributeVector<Vec3f> new_pos(m.no_vertices());
93
        VertexAttributeVector<Vec3d> new_pos(m.no_vertices());
94
        for(int i = 0; i < 10000; ++i){
94
        for(int i = 0; i < 10000; ++i){
95
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v){
95
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v){
96
				if(boundary(m, *v))
96
				if(boundary(m, *v))
97
				{
97
				{
98
					if(ws == LSCM_W && touched[*v] != 1)
98
					if(ws == LSCM_W && touched[*v] != 1)
99
					{
99
					{
100
						Vec3d p_new(0);
100
						Vec3d p_new(0);
101
						double w_sum = 0;
101
						double w_sum = 0;
102
						Vec3d grad_sum(0.0);
102
						Vec3d grad_sum(0.0);
103
						HalfEdgeWalker wv = m.halfedgewalker(*v);
103
						Walker wv = m.walker(*v);
104
						for(;!wv.full_circle(); wv = wv.circulate_vertex_ccw())
104
						for(;!wv.full_circle(); wv = wv.circulate_vertex_ccw())
105
                        {
105
                        {
106
							if(wv.face() != InvalidFaceID)
106
							if(wv.face() != InvalidFaceID)
107
							{
107
							{
108
								Vec3d p1(m.pos(wv.next().vertex()));
108
								Vec3d p1(m.pos(wv.next().vertex()));
Line 113... Line 113...
113
							}
113
							}
114
                            double w = edge_weights[wv.halfedge()];
114
                            double w = edge_weights[wv.halfedge()];
115
                            p_new += Vec3d(m.pos(wv.vertex()) * w);
115
                            p_new += Vec3d(m.pos(wv.vertex()) * w);
116
                            w_sum += w;                            
116
                            w_sum += w;                            
117
                        }
117
                        }
118
						new_pos[*v] = (Vec3f(p_new) - Vec3f(grad_sum))/w_sum;	
118
						new_pos[*v] = ((p_new) - (grad_sum))/w_sum;	
119
					}
119
					}
120
                    else
120
                    else
121
                        new_pos[*v] = m.pos(*v);
121
                        new_pos[*v] = m.pos(*v);
122
				}
122
				}
123
				else
123
				else
124
				{
124
				{
125
					Vec3d p_new(0);
125
					Vec3d p_new(0);
126
					double w_sum = 0;
126
					double w_sum = 0;
127
					for(HalfEdgeWalker wv = m.halfedgewalker(*v); !wv.full_circle(); wv = wv.circulate_vertex_ccw()) 
127
					for(Walker wv = m.walker(*v); !wv.full_circle(); wv = wv.circulate_vertex_ccw()) 
128
					{
128
					{
129
						double w = edge_weights[wv.halfedge()];
129
						double w = edge_weights[wv.halfedge()];
130
						p_new += Vec3d(m.pos(wv.vertex()) * w);
130
						p_new += Vec3d(m.pos(wv.vertex()) * w);
131
						w_sum += w;
131
						w_sum += w;
132
					}
132
					}
133
                    new_pos[*v] = Vec3f(p_new/w_sum);
133
                    new_pos[*v] = p_new/w_sum;
134
                }
134
                }
135
            }
135
            }
136
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
136
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
137
                m.pos(*v) = new_pos[*v];
137
                m.pos(*v) = new_pos[*v];
138
        }
138
        }
Line 146... Line 146...
146
		
146
		
147
        ofs << endl;
147
        ofs << endl;
148
		
148
		
149
        for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f){
149
        for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f){
150
            ofs << "f ";
150
            ofs << "f ";
151
            for(HalfEdgeWalker w = m.halfedgewalker(*f); !w.full_circle(); w = w.circulate_face_cw()){
151
            for(Walker w = m.walker(*f); !w.full_circle(); w = w.circulate_face_cw()){
152
                int idx = vtouched[w.vertex()] + 1;
152
                int idx = vtouched[w.vertex()] + 1;
153
                ofs << idx << "/" << idx <<" ";
153
                ofs << idx << "/" << idx <<" ";
154
            }
154
            }
155
            ofs << endl;
155
            ofs << endl;
156
        }
156
        }