13 #if defined(HAVE_MESH)
35 n[0] = n[1] =
SVector3(nn[0], nn[1], nn[2]);
41 mat[0][0] =
_v[1]->
x() -
_v[0]->
x();
42 mat[0][1] =
_v[2]->
x() -
_v[0]->
x();
43 mat[0][2] =
_v[3]->
x() -
_v[0]->
x();
44 mat[1][0] =
_v[1]->
y() -
_v[0]->
y();
45 mat[1][1] =
_v[2]->
y() -
_v[0]->
y();
46 mat[1][2] =
_v[3]->
y() -
_v[0]->
y();
47 mat[2][0] =
_v[1]->
z() -
_v[0]->
z();
48 mat[2][1] =
_v[2]->
z() -
_v[0]->
z();
49 mat[2][2] =
_v[3]->
z() -
_v[0]->
z();
67 double dist[3], k = 0.;
68 int triEdges[3] = {0, 1, 3};
69 for(
int i = 0; i < 3; i++) {
74 double radTri = sqrt(k * (k - dist[0]) * (k - dist[1]) * (k - dist[2])) / k;
76 return std::min(radTri, radVert);
82 for(ithFace = 0; ithFace < 5; ithFace++) {
104 static double pp[6][3] = {{0, 0, -1}, {1, 0, -1}, {0, 1, -1},
105 {0, 0, 1}, {1, 0, 1}, {0, 1, 1}};
106 static int ed[9][2] = {{0, 1}, {0, 2}, {0, 3}, {1, 2}, {1, 4},
107 {2, 5}, {3, 4}, {3, 5}, {4, 5}};
108 int iEdge = num / numSubEdges;
109 int iSubEdge = num % numSubEdges;
111 int iVertex1 = ed[iEdge][0];
112 int iVertex2 = ed[iEdge][1];
113 double t1 = (double)iSubEdge / (
double)numSubEdges;
114 double u1 = pp[iVertex1][0] * (1. - t1) + pp[iVertex2][0] * t1;
115 double v1 = pp[iVertex1][1] * (1. - t1) + pp[iVertex2][1] * t1;
116 double w1 = pp[iVertex1][2] * (1. - t1) + pp[iVertex2][2] * t1;
118 double t2 = (double)(iSubEdge + 1) / (double)numSubEdges;
119 double u2 = pp[iVertex1][0] * (1. - t2) + pp[iVertex2][0] * t2;
120 double v2 = pp[iVertex1][1] * (1. - t2) + pp[iVertex2][1] * t2;
121 double w2 = pp[iVertex1][2] * (1. - t2) + pp[iVertex2][2] * t2;
124 pri->
pnt(u1, v1,
w1, pnt1);
125 pri->
pnt(u2, v2, w2, pnt2);
183 static double pp[6][3] = {{0, 0, -1}, {1, 0, -1}, {0, 1, -1},
184 {0, 0, 1}, {1, 0, 1}, {0, 1, 1}};
186 int iFace = num / (numSubEdges * numSubEdges);
187 int iSubFace = num % (numSubEdges * numSubEdges);
190 iFace = num / (2 * numSubEdges * numSubEdges) + 1;
191 iSubFace = num % (2 * numSubEdges * numSubEdges);
215 int io = iSubFace % 2;
216 int ix = (iSubFace / 2) / numSubEdges;
217 int iy = (iSubFace / 2) % numSubEdges;
219 const double d = 2. / numSubEdges;
220 double ox = -1. + d * ix;
221 double oy = -1. + d * iy;
224 double U1 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
225 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
226 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
227 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
228 double V1 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
229 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
230 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
231 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
232 double W1 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
233 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
234 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
235 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
239 double U2 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
240 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
241 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
242 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
243 double V2 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
244 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
245 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
246 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
247 double W2 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
248 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
249 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
250 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
254 double U3 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
255 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
256 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
257 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
258 double V3 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
259 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
260 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
261 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
262 double W3 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
263 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
264 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
265 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
267 pri->
pnt(U1, V1, W1, pnt1);
268 pri->
pnt(U2, V2, W2, pnt2);
269 pri->
pnt(U3, V3, W3, pnt3);
272 double U1 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
273 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
274 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
275 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
276 double V1 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
277 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
278 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
279 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
280 double W1 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
281 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
282 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
283 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
288 double U2 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
289 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
290 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
291 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
292 double V2 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
293 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
294 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
295 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
296 double W2 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
297 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
298 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
299 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
303 double U3 = pp[iVertex1][0] * (1. - ox) * (1 - oy) * .25 +
304 pp[iVertex2][0] * (1. + ox) * (1 - oy) * .25 +
305 pp[iVertex3][0] * (1. + ox) * (1 + oy) * .25 +
306 pp[iVertex4][0] * (1. - ox) * (1 + oy) * .25;
307 double V3 = pp[iVertex1][1] * (1. - ox) * (1 - oy) * .25 +
308 pp[iVertex2][1] * (1. + ox) * (1 - oy) * .25 +
309 pp[iVertex3][1] * (1. + ox) * (1 + oy) * .25 +
310 pp[iVertex4][1] * (1. - ox) * (1 + oy) * .25;
311 double W3 = pp[iVertex1][2] * (1. - ox) * (1 - oy) * .25 +
312 pp[iVertex2][2] * (1. + ox) * (1 - oy) * .25 +
313 pp[iVertex3][2] * (1. + ox) * (1 + oy) * .25 +
314 pp[iVertex4][2] * (1. - ox) * (1 + oy) * .25;
316 pri->
pnt(U1, V1, W1, pnt1);
317 pri->
pnt(U2, V2, W2, pnt2);
318 pri->
pnt(U3, V3, W3, pnt3);
324 for(
int i = 0; i < numSubEdges; i++) {
325 int nbl = (numSubEdges - i - 1) * 2 + 1;
329 ix = nbl - (nbt - iSubFace);
334 const double d = 1. / numSubEdges;
336 double u1, v1, u2, v2, u3, v3;
340 u2 = (ix / 2 + 1) * d;
346 u1 = (ix / 2 + 1) * d;
348 u2 = (ix / 2 + 1) * d;
354 double U1 = pp[iVertex1][0] * (1. - u1 - v1) + pp[iVertex2][0] * u1 +
355 pp[iVertex3][0] * v1;
356 double U2 = pp[iVertex1][0] * (1. - u2 - v2) + pp[iVertex2][0] * u2 +
357 pp[iVertex3][0] * v2;
358 double U3 = pp[iVertex1][0] * (1. - u3 - v3) + pp[iVertex2][0] * u3 +
359 pp[iVertex3][0] * v3;
361 double V1 = pp[iVertex1][1] * (1. - u1 - v1) + pp[iVertex2][1] * u1 +
362 pp[iVertex3][1] * v1;
363 double V2 = pp[iVertex1][1] * (1. - u2 - v2) + pp[iVertex2][1] * u2 +
364 pp[iVertex3][1] * v2;
365 double V3 = pp[iVertex1][1] * (1. - u3 - v3) + pp[iVertex2][1] * u3 +
366 pp[iVertex3][1] * v3;
368 double W1 = pp[iVertex1][2] * (1. - u1 - v1) + pp[iVertex2][2] * u1 +
369 pp[iVertex3][2] * v1;
370 double W2 = pp[iVertex1][2] * (1. - u2 - v2) + pp[iVertex2][2] * u2 +
371 pp[iVertex3][2] * v2;
372 double W3 = pp[iVertex1][2] * (1. - u3 - v3) + pp[iVertex2][2] * u3 +
373 pp[iVertex3][2] * v3;
375 pri->
pnt(U1, V1, W1, pnt1);
376 pri->
pnt(U2, V2, W2, pnt2);
377 pri->
pnt(U3, V3, W3, pnt3);
390 SVector3 d1(x[1] - x[0], y[1] - y[0],
z[1] -
z[0]);
391 SVector3 d2(x[2] - x[0], y[2] - y[0],
z[2] -
z[0]);
401 #if defined(HAVE_VISUDEV)
402 static const int fquad[12][4] = {{0, 1, 4, 3}, {1, 4, 3, 0}, {4, 3, 0, 1},
403 {3, 0, 1, 4}, {1, 2, 5, 4}, {2, 5, 4, 1},
404 {5, 4, 1, 2}, {4, 1, 2, 5}, {2, 0, 3, 5},
405 {0, 3, 5, 2}, {3, 5, 2, 0}, {5, 2, 0, 3}};
420 static const int f[8][3] = {{0, 2, 1}, {3, 4, 5}, {0, 1, 4}, {0, 4, 3},
421 {0, 3, 5}, {0, 5, 2}, {1, 2, 5}, {1, 5, 4}};
454 #if defined(HAVE_VISUDEV)
466 return curved ? 8 * std::pow(
CTX::instance()->mesh.numSubEdges, 2) :
472 return curved ? 8 * std::pow(
CTX::instance()->mesh.numSubEdges, 2) :
478 return curved ? 8 * std::pow(
CTX::instance()->mesh.numSubEdges, 2) :
483 const std::vector<MVertex *> &vs,
int &ind,
484 std::vector<MVertex *> &v)
486 const int nNode = order - 1, startNode = num * nNode,
487 endNode = startNode + nNode - 1;
490 for(
int i = endNode; i >= startNode; i--, ind++) v[ind] = vs[i];
492 for(
int i = startNode; i <= endNode; i++, ind++) v[ind] = vs[i];
495 static void _addFaceNodes(
int num,
int order,
const std::vector<MVertex *> &vs,
496 int &ind, std::vector<MVertex *> &v)
498 const int nNodeEd = order - 1, nNodeTri = (order - 2) * (order - 1) / 2;
500 int startNode, endNode;
502 startNode = 9 * nNodeEd + num * nNodeTri;
503 endNode = startNode + nNodeTri;
506 const int nNodeQuad = (order - 1) * (order - 1);
507 startNode = 9 * nNodeEd + 2 * nNodeTri + (num - 2) * nNodeQuad;
508 endNode = startNode + nNodeQuad;
511 for(
int i = startNode; i < endNode; i++, ind++) v[ind] = vs[i];
518 static const int edge[5][4] = {
519 {1, 3, 0, -1}, {6, 8, 7, -1}, {0, 4, 6, 2}, {2, 7, 5, 1}, {3, 5, 8, 4}};
520 static const bool reverse[5][4] = {{
false,
true,
true,
false},
521 {
false,
false,
true,
false},
522 {
false,
false,
true,
true},
523 {
false,
false,
true,
true},
524 {
false,
false,
true,
true}};
526 int nNodeTotal, nEdge;
536 v.resize(nNodeTotal);
543 for(
int iE = 0; iE < nEdge; iE++)
552 #if defined(HAVE_MESH)
563 indices.resize(ref.
size1());
564 for(
int i = 0; i < ref.
size1(); ++i) {
565 const double u = ref(i, 0);
566 const double v = ref(i, 1);
567 const double w = ref(i, 2);
568 for(
int j = 0; j < ref.
size1(); ++j) {
569 if(u == ref(j, 1) && v == ref(j, 0) && w == ref(j, 2)) {
590 std::vector<MVertex *> oldv(6 +
_vs.size());
595 for(
int i = 0; i < 6; ++i) {
_v[i] = oldv[indices[i]]; }
596 for(std::size_t i = 0; i <
_vs.size(); ++i) {
_vs[i] = oldv[indices[6 + i]]; }