| 174 | } |
| 175 | |
| 176 | int |
| 177 | TriangleMeshGenerator::remesh(double alpha) |
| 178 | { |
| 179 | // reset |
| 180 | this->reset(); |
| 181 | |
| 182 | // get size |
| 183 | in.numberofpoints = pointlist.size()/2; |
| 184 | |
| 185 | // quick return |
| 186 | if(in.numberofpoints < 3) return 0; |
| 187 | |
| 188 | // set pointers |
| 189 | in.pointlist = &pointlist[0]; |
| 190 | |
| 191 | // meshing |
| 192 | char s[] = "Qnzv"; |
| 193 | triangulate(s, &in, &out, &vout); |
| 194 | |
| 195 | // reset pointers |
| 196 | in.pointlist = NULL; |
| 197 | |
| 198 | // clear input data |
| 199 | pointmarkerlist.clear(); |
| 200 | segmentlist.clear(); |
| 201 | segmentmarkerlist.clear(); |
| 202 | trianglelist.clear(); |
| 203 | neighborlist.clear(); |
| 204 | |
| 205 | neighborlist.assign(out.neighborlist, |
| 206 | out.neighborlist+out.numberoftriangles*3); |
| 207 | |
| 208 | // radius and average size of triangles |
| 209 | numberofcorners = out.numberofcorners; |
| 210 | int numtri = out.numberoftriangles; |
| 211 | std::vector<double> radius(numtri); |
| 212 | std::vector<double> beta(numtri); |
| 213 | double avesize = 0.0; |
| 214 | for(int i=0; i<numtri; i++) { |
| 215 | |
| 216 | // triangle circumcenter |
| 217 | double xc = vout.pointlist[2*i]; |
| 218 | double yc = vout.pointlist[2*i+1]; |
| 219 | |
| 220 | // triangle points |
| 221 | int pt[3]; |
| 222 | for(int j=0; j<3; j++) { |
| 223 | pt[j] = out.trianglelist[numberofcorners*i+j]; |
| 224 | } |
| 225 | |
| 226 | // nodal coordinates |
| 227 | double x[3], y[3]; |
| 228 | for(int j=0; j<3; j++) { |
| 229 | x[j] = out.pointlist[2*pt[j]]; |
| 230 | y[j] = out.pointlist[2*pt[j]+1]; |
| 231 | } |
| 232 | |
| 233 | // size of triangle |