计算网格点面拓扑信息
mesh的拓扑信息包括:
VF:顶点一邻域顶点拓扑
VV:顶点一邻域顶点拓扑
FF:Face一邻域的Face(两Face共线)
void computeFFTopology()
{
std::vector<std::set<unsigned>> ff_vector(faceNum);
std::vector<std::vector<unsigned int>> vf_vertor(vertexNum);
std::vector<std::set<unsigned int>> vv_vertor(vertexNum);
// 计算VF, VV拓扑
for (int i = 0; i < faceNum; ++i)
{
unsigned int vID[3]{ faces[i * 3 + 0],faces[i * 3 + 1],faces[i * 3 + 2] };
vf_vertor[vID[0]].push_back(i);
vf_vertor[vID[1]].push_back(i);
vf_vertor[vID[2]].push_back(i);
for (int j = 0; j < 3; ++j)
{
vv_vertor[vID[j]].insert(vID[(j + 1) % 3]);
vv_vertor[vID[j]].insert(vID[(j + 2) % 3]);
}
}
// 遍历VV中的一邻域vertices,让每个VF中所有faces对去判断是否包含同一个点,如果包含则是相邻关系
for (size_t i = 0, size = vv_vertor.size(); i < size; ++i)
{
for (std::set<unsigned int>::const_iterator iterV = vv_vertor[i].begin(), endV = vv_vertor[i].end(); iterV != endV; ++iterV)
{
unsigned int vQuary = *iterV;
int n(0);
unsigned int faceAdjacent[2];
for (size_t j = 0, sizeJ = vf_vertor[i].size(); j < sizeJ; ++j)
{
// 判断点在face内
if (n == 2)
break;
unsigned int faceID = vf_vertor[i][j] * 3;
unsigned int vIDs[3] = { faces[faceID],faces[faceID + 1],faces[faceID + 2] };
if (vQuary == vIDs[0] || vQuary == vIDs[1] || vQuary == vIDs[2])
{
faceAdjacent[n++] = faceID / 3;
}
}
if (n == 2)
{
ff_vector[faceAdjacent[0]].insert(faceAdjacent[1]);
ff_vector[faceAdjacent[1]].insert(faceAdjacent[0]);
}
}
}
int num(0);
// 处理边界face 补充边界face,让faceface的结构保持一个face3个相邻face
for (int i = 0; i < ff_vector.size(); ++i)
{
std::set<unsigned int>::iterator iter = ff_vector[i].begin();
size_t size= ff_vector[i].size();
if (size == 3)
{
ff[i * 3 + 0] = *(iter);
ff[i * 3 + 1] = *(++iter);
ff[i * 3 + 2] = *(++iter);
continue;
}
if (size == 0)
{
ff[i * 3 + 0] = i;
ff[i * 3 + 1] = i;
ff[i * 3 + 2] = i;
}
if (size == 1)
{
unsigned int v2 = *iter;
ff[i * 3 + 0] = i;
ff[i * 3 + 1] = i;
ff[i * 3 + 2] = v2;
}
if (size == 2)
{
unsigned int v1 = *iter;
unsigned int v2 = *(++iter);
ff[i * 3 + 0] = i;
ff[i * 3 + 1] = v1;
ff[i * 3 + 2] = v2;
}
}
}