计算网格点面拓扑信息

计算网格点面拓扑信息

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;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值