mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
bisect face classification by permutation of 5
This commit is contained in:
parent
4592bf90a8
commit
a354bf9e51
@ -1569,8 +1569,23 @@ namespace netgen
|
|||||||
{
|
{
|
||||||
INT<3,PointIndex> f3(face2vert[i][0], face2vert[i][1], face2vert[i][2]);
|
INT<3,PointIndex> f3(face2vert[i][0], face2vert[i][1], face2vert[i][2]);
|
||||||
|
|
||||||
// find a vertex, such that one of its parent is a trig vertex
|
|
||||||
|
|
||||||
|
// face on coarses level ?
|
||||||
|
bool all_vert_coarse = true;
|
||||||
|
for (int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
PointIndex vb = f3[k];
|
||||||
|
if (vb >= mesh->mlbetweennodes.Size()+PointIndex::BASE)
|
||||||
|
continue;
|
||||||
|
auto parents = mesh->mlbetweennodes[vb];
|
||||||
|
if (parents[0] >= PointIndex::BASE)
|
||||||
|
all_vert_coarse = false;
|
||||||
|
}
|
||||||
|
if (all_vert_coarse) continue;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// find a vertex, such that one of its parent is a trig vertex
|
||||||
bool issplit = false;
|
bool issplit = false;
|
||||||
for (int k = 0; k < 3; k++)
|
for (int k = 0; k < 3; k++)
|
||||||
{
|
{
|
||||||
@ -1614,6 +1629,8 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
// is face a new face (bisect-face) ?
|
// is face a new face (bisect-face) ?
|
||||||
if (!issplit)
|
if (!issplit)
|
||||||
for (int k = 0; k < 3; k++)
|
for (int k = 0; k < 3; k++)
|
||||||
@ -1697,6 +1714,87 @@ namespace netgen
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// is face a new face (bisect-face) ?
|
||||||
|
if (!issplit)
|
||||||
|
for (int k = 0; k < 3; k++)
|
||||||
|
{
|
||||||
|
PointIndex vb = f3[k]; // assume vb as the new bisect vert
|
||||||
|
if (vb >= mesh->mlbetweennodes.Size()+PointIndex::BASE)
|
||||||
|
continue;
|
||||||
|
auto parents = mesh->mlbetweennodes[vb];
|
||||||
|
|
||||||
|
PointIndex v0 = parents[0];
|
||||||
|
PointIndex v1 = parents[1];
|
||||||
|
PointIndex v2 = f3[(k+1)%3];
|
||||||
|
PointIndex v3 = f3[(k+2)%3];
|
||||||
|
INT<2> parentedge1(v0, v2);
|
||||||
|
parentedge1.Sort();
|
||||||
|
INT<2> parentedge2(v0, v3);
|
||||||
|
parentedge2.Sort();
|
||||||
|
INT<2> parentedge3(v1, v2);
|
||||||
|
parentedge3.Sort();
|
||||||
|
INT<2> parentedge4(v1, v3);
|
||||||
|
parentedge4.Sort();
|
||||||
|
|
||||||
|
// if edges [v0,v2], [v0, v3], [v1,v2], [v1,v3] exists
|
||||||
|
// then vb is the bisecting edge
|
||||||
|
if (v2e.Used(parentedge1) && v2e.Used(parentedge2)
|
||||||
|
&& v2e.Used(parentedge3) && v2e.Used(parentedge4))
|
||||||
|
{
|
||||||
|
int verts[5] = { v0, v1, v2, v3, vb };
|
||||||
|
/*
|
||||||
|
cout << "verts5: ";
|
||||||
|
for (int j = 0; j < 5; j++)
|
||||||
|
cout << verts[j] << " ";
|
||||||
|
*/
|
||||||
|
// classify permutation of verts
|
||||||
|
int classnr = 0;
|
||||||
|
for (int j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
int maxk = 0;
|
||||||
|
for (int k = 0; k < 5-j; k++)
|
||||||
|
if (verts[k] > verts[maxk]) maxk = k;
|
||||||
|
// compress
|
||||||
|
for (int k = maxk; k < 4-j; k++)
|
||||||
|
verts[k] = verts[k+1];
|
||||||
|
classnr = maxk + (5-j) * classnr;
|
||||||
|
}
|
||||||
|
// cout << "classnr = " << classnr << endl;
|
||||||
|
|
||||||
|
INT<3> parentverts1(v1, v2, v3);
|
||||||
|
parentverts1.Sort();
|
||||||
|
INT<3> parentverts2(v0, v2, v3);
|
||||||
|
parentverts2.Sort();
|
||||||
|
INT<3> parentverts3(v0, v1, v3);
|
||||||
|
parentverts3.Sort();
|
||||||
|
INT<3> parentverts4(v0, v1, v2);
|
||||||
|
parentverts4.Sort();
|
||||||
|
|
||||||
|
if (!v2f.Used(parentverts1) || !v2f.Used(parentverts2) ||
|
||||||
|
!v2f.Used(parentverts3) || !v2f.Used(parentverts4))
|
||||||
|
{
|
||||||
|
cout << "all edges are used, but not faces ????" << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pafacenr1 = v2f[parentverts1];
|
||||||
|
int pafacenr2 = v2f[parentverts2];
|
||||||
|
int pafacenr3 = v2f[parentverts3];
|
||||||
|
int pafacenr4 = v2f[parentverts4];
|
||||||
|
|
||||||
|
|
||||||
|
parent_faces[i] = { classnr, { pafacenr1, pafacenr2,
|
||||||
|
pafacenr3, pafacenr4} };
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto [info, nrs] = parent_faces[i];
|
||||||
|
if (nrs[0] == -1)
|
||||||
|
cout << "************************** unhandled parent-face case **********************" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user