59 |
} |
} |
60 |
|
|
61 |
int operator() (int i, int j, float fract = .5) { |
int operator() (int i, int j, float fract = .5) { |
62 |
DBG(dbg_paperquad) << "New vertex "<<i<<" "<<j<<" "<<fract<<"\n"; |
DBG(dbg_paperquad) << "New vertex "<<i<<" "<<j<<" "<<fract<<"\n" |
63 |
|
<< points[i].orig <<" " |
64 |
|
<< points[j].orig <<" " |
65 |
|
<< points[i].final <<" " |
66 |
|
<< points[j].final <<"\n" |
67 |
|
; |
68 |
return append( |
return append( |
69 |
lerp(points[i].orig, points[j].orig, fract) ); |
lerp(points[i].orig, points[j].orig, fract) ); |
70 |
} |
} |
121 |
return ret; |
return ret; |
122 |
} |
} |
123 |
|
|
|
/** Whether the i-j stretch should be split again |
|
|
* @return 1 = yes, 0 = no, -1 = j should be dropped |
|
|
*/ |
|
|
inline int split3(Verts &v, float dicelen1, float dicelen2, int i, int j, int k) { |
|
|
Pt o1 = (Pt)v.points[i].final - (Pt)v.points[j].final; |
|
|
Pt o2 = (Pt)v.points[j].final - (Pt)v.points[k].final; |
|
|
float x1, x2; |
|
|
if(fabs(o1.x) > fabs(o1.y)) { |
|
|
x1 = o1.x; x2 = o2.x; |
|
|
} else { |
|
|
x1 = o1.y; x2 = o2.y; |
|
|
} |
|
|
Pt v1 = (Pt)v.points[i].final - (Pt)v.points[j].final; |
|
|
Pt v2 = (Pt)v.points[j].final - (Pt)v.points[k].final; |
|
|
|
|
|
float v1l = v1.length(); |
|
|
float v2l = v2.length(); |
|
|
|
|
|
if(v1l > dicelen1) return 1; |
|
|
|
|
|
Pt v2_mapped = v2 * (x1 / x2); |
|
|
|
|
|
float area = (v1 - v2_mapped).length(); |
|
|
|
|
|
float carea = area * v1l / (v1l + v2l); |
|
|
DBG(dbg_paperquad) << "Split3 "<<i<<" "<<j<<" "<< |
|
|
v.points[i].final<<" "<<v.points[j].final<<" " |
|
|
<< v.points[k].final<< " " <<area<<" "<<carea<<"\n"; |
|
|
if(area < dicelen2 / 2) return -1; |
|
|
// The portion that is v1's worry |
|
|
if(carea < dicelen2) return 0; |
|
|
return 1; |
|
|
} |
|
|
|
|
124 |
inline int splitTri(Verts &v, float dicelen1, float dicelen2, int i, int j, int k) { |
inline int splitTri(Verts &v, float dicelen1, float dicelen2, int i, int j, int k) { |
125 |
DBG(dbg_paperquad) << "SplitTri "<<i<<" "<<j<<" "<< |
DBG(dbg_paperquad) << "SplitTri "<<i<<" "<<j<<" "<<k<<" "<< |
126 |
v.points[i].final<<" "<<v.points[j].final<<" " |
v.points[i].orig<<" "<< |
127 |
<< v.points[k].final<< "\n"; |
v.points[j].orig<<" "<< |
128 |
|
v.points[k].orig<<" "<< |
129 |
|
v.points[i].final<<" "<< |
130 |
|
v.points[j].final<<" "<< |
131 |
|
v.points[k].final<< "\n"; |
132 |
Pt ctr = 1/3. * ( |
Pt ctr = 1/3. * ( |
133 |
v.points[i].orig + |
v.points[i].orig + |
134 |
v.points[j].orig + |
v.points[j].orig + |