Subversion Repositories gelsvn

Rev

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

Rev 543 Rev 566
Line 43... Line 43...
43
					edge_weights[h]  += tan(ang/2) / l;
43
					edge_weights[h]  += tan(ang/2) / l;
44
					edge_weights[wv.opp().halfedge()]  += tan(ang_opp/2) / l;
44
					edge_weights[wv.opp().halfedge()]  += tan(ang_opp/2) / l;
45
				}
45
				}
46
				else if(ws == HARMONIC_W || ws == LSCM_W){
46
				else if(ws == HARMONIC_W || ws == LSCM_W){
47
					double a = acos(min(1.0, max(-1.0, dot(normalize(p0-p2), normalize(p1-p2)))));
47
					double a = acos(min(1.0, max(-1.0, dot(normalize(p0-p2), normalize(p1-p2)))));
48
					double w = max(0.0001,0.5/tan(a));
48
					double w = max(0.0000001,0.5/tan(a));
49
					edge_weights[h]  += w;
49
					edge_weights[h]  += w;
50
					edge_weights[wv.opp().halfedge()]  += w;
50
					edge_weights[wv.opp().halfedge()]  += w;
51
				}
51
				}
52
				else{
52
				else{
53
					edge_weights[h]  = valency(m, wv.opp().vertex());
53
					edge_weights[h]  = valency(m, wv.opp().vertex());
Line 93... Line 93...
93
		
93
		
94
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
94
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
95
            if(!boundary(m, *v))
95
            if(!boundary(m, *v))
96
                m.pos(*v) = Vec3f(0.0);
96
                m.pos(*v) = Vec3f(0.0);
97
		
97
		
-
 
98
        VertexAttributeVector<Vec3f> new_pos(m.active_vertices());
98
        for(int i = 0; i < 10000; ++i){
99
        for(int i = 0; i < 10000; ++i){
99
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v){
100
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v){
100
				if(boundary(m, *v))
101
				if(boundary(m, *v))
101
				{
102
				{
102
					if(ws == LSCM_W && touched[*v] != 1)
103
					if(ws == LSCM_W && touched[*v] != 1)
103
					{
104
					{
104
						Vec3d p_new(0);
105
						Vec3d p_new(0);
105
						double w_sum = 0;
106
						double w_sum = 0;
106
						Vec3d grad_sum(0.0);
107
						Vec3d grad_sum(0.0);
107
						HalfEdgeWalker wv = m.halfedgewalker(*v);
108
						HalfEdgeWalker wv = m.halfedgewalker(*v);
108
						int steps=0;
-
 
109
						for(;!wv.full_circle(); wv = wv.circulate_vertex_cw())
109
						for(;!wv.full_circle(); wv = wv.circulate_vertex_ccw())
-
 
110
                        {
110
							if(wv.face() != InvalidFaceID)
111
							if(wv.face() != InvalidFaceID)
111
							{
112
							{
112
								Vec3d p1(m.pos(wv.next().vertex()));
113
								Vec3d p1(m.pos(wv.next().vertex()));
113
								Vec3d p0(m.pos(wv.vertex()));
114
								Vec3d p0(m.pos(wv.vertex()));
114
								Vec3d area_grad = 0.5*(p1 - p0); 
115
								Vec3d area_grad = 0.5*(p1 - p0); 
115
								grad_sum[0] += -area_grad[1];
116
								grad_sum[0] += -area_grad[1];
116
								grad_sum[1] += area_grad[0];
117
								grad_sum[1] += area_grad[0];
117
								double w = edge_weights[wv.halfedge()];
-
 
118
								p_new += Vec3d(m.pos(wv.vertex()) * w);
-
 
119
								w_sum += w;
-
 
120
								++steps;
-
 
121
							}
118
							}
-
 
119
                            double w = edge_weights[wv.halfedge()];
-
 
120
                            p_new += Vec3d(m.pos(wv.vertex()) * w);
-
 
121
                            w_sum += w;                            
-
 
122
                        }
122
						m.pos(*v) = m.pos(*v)*.5 + .5*Vec3f((grad_sum + p_new)/w_sum);	
123
						new_pos[*v] = (Vec3f(p_new) - Vec3f(grad_sum))/w_sum;	
123
					}
124
					}
-
 
125
                    else
-
 
126
                        new_pos[*v] = m.pos(*v);
124
				}
127
				}
125
				else
128
				else
126
				{
129
				{
127
					Vec3d p_new(0);
130
					Vec3d p_new(0);
128
					double w_sum = 0;
131
					double w_sum = 0;
129
					for(HalfEdgeWalker wv = m.halfedgewalker(*v); !wv.full_circle(); wv = wv.circulate_vertex_cw()) 
132
					for(HalfEdgeWalker wv = m.halfedgewalker(*v); !wv.full_circle(); wv = wv.circulate_vertex_ccw()) 
130
					{
133
					{
131
						double w = edge_weights[wv.halfedge()];
134
						double w = edge_weights[wv.halfedge()];
132
						p_new += Vec3d(m.pos(wv.vertex()) * w);
135
						p_new += Vec3d(m.pos(wv.vertex()) * w);
133
						w_sum += w;
136
						w_sum += w;
134
					}
137
					}
135
                    m.pos(*v) = m.pos(*v)*.5 + .5*Vec3f(p_new/w_sum);
138
                    new_pos[*v] = Vec3f(p_new/w_sum);
136
                }
139
                }
137
            }
140
            }
-
 
141
            for(v = m.vertices_begin(); v != m.vertices_end(); ++v)
-
 
142
                m.pos(*v) = new_pos[*v];
138
        }
143
        }
139
		
144
		
140
        VertexAttributeVector<int> vtouched(m.total_vertices(), 0);
145
        VertexAttributeVector<int> vtouched(m.total_vertices(), 0);
141
        i = 0;
146
        i = 0;
142
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v, ++i){
147
        for(v = m.vertices_begin(); v != m.vertices_end(); ++v, ++i){