计算网格点面拓扑信息

计算网格点面拓扑信息

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;
		}
	}
}
已标记关键词 清除标记
一.数字地质图中的拓扑关系 数字地质图中的点是有特定的位置,主要有: 数字地质图中的线有如下特征: 建立统一的工程文件; 9.★建立统一的系统库: ③系统库之间的拷贝:★图例板的制作: ★影像图的镶嵌配准、矢量化图的误差校正 (1).影像图的镶嵌配准:矢量化图的误差校正: 由MAPGIS主选单中→误差校正,双击弹出画(MAPGIS误差校正系统),点击“文件→打开文件”打开文件“实际矢量化的含内图框的网格文件与理论的含内图框的网格文件”。 ①点击“显示→复位窗口”弹出“选择文件名” 对话框,只选择实际矢量化的含内图框的网格文件将其点蓝。 ④点击“控制点→选择采集文件”弹出“选择要采集控制点的文件名” 对话框,将实际矢量化的含内图框的网格文件点蓝并点击“确定”。 随后点击“文件→保存控制点” 弹出对话框后点击“确定”。 ③点击“控制点→选择采集文件”弹出“选择要采集控制点的文件名”对话框,将理论的含内图框的网格文件点蓝并点击“确定”。 ⑤若一一对应,点击“文件→保存控制点” 弹出对话框后点击“确定”。⑥点击“显示→复位窗口”弹出“选择文件名” 对话框,只选择实际矢量化的含内图框的网格文件将其点蓝之后,点击“数据校正→进行线文件校正转换”,再次点击“显示→复位窗口”弹出“选择文件名”对话框,选择新生成的线文件NEWLIN. 另一种是装入文件平移后的主要是内图框中的所有文件,分别点击“数据校正→依次进行线文件校正转换、点文件校正转换、文件校正转换”,进行校正转换完毕,点击“文件→另存文件” 分别将NEWLIN. 建立正确的拓扑关系,应注意的问题 在“投影变换系统”界下,点击“投影转换→成批文件投影转换”弹出对话框,如右图所示,①点击“投影文件/目录”选择要投影的所有文件;②点击“当前投影参数”弹出相应的对话框,在对应的位置处输入已知的参数;③点击“结果投影参数”弹出相应的对话框,在对应的位置处输入目的参数;Ⅱ单个文件投影:在“投影变换系统”界下,点击“文件→打开文件(装入需要校正的文件)”利用“投影转换”中“进行投影变换”弹出对话框,如右图所示,此时的“当前投影参数”与打开文件是一致,只需要输入“结果投影参数”弹出相应的对话框,在对应的位置处输入目的参数;文件。 Ⅲ用户文件的投影变换: 可分工程裁剪与及文件裁剪两种,重点是工程裁剪,传统的文件裁剪-图形裁剪; ①首先建立一个新文件夹,存放裁剪后的文件,因裁剪后的文件名继承了源文件的名称; ④进入“编辑子系统→打开新形的工程文件”。Ⅱ传统的文件裁剪-图形裁剪 ②在“文件”中分别装入点、线、文件→“编辑裁剪框→装入裁剪框”; ⑤在对话框中依次将文件裁剪框的点,线、文件点蓝,点击“浏览”选择路径输入“结果文件名”,点击“增加”→“KO” ⑥在“裁剪工程→裁剪”。①工程裁剪的裁剪框是文件而传统的文件裁剪-图形裁剪的裁剪框是线文件; ③拓扑裁剪与制图裁剪的区别:拓扑裁剪前若文件中的点、线、拓扑关系正确,那么拓扑裁剪后的所有点、线、文件中的点、线与线、线与之间仍保留良好拓扑关系,符合建库的要求,而制图裁剪前对文件中的点、线、拓扑关系不要求,制图裁剪后的所有点、线、文件中的点、线与线、线与之间也就谈不上拓扑关系,只用于制图。 ③在“影像处理”的“影像分析”中→“文件”中“打开影像”→“镶嵌融合”的“打开参照文件”中“参照区文件(文件裁剪框)” ①弹出“图例文件不存在,是否新建”的对话框→点击“是”,又弹出“是否从工程的所有文件中提取图例”的对话框点击“是”。再次弹出右图对话框→点击“确定”; ②点击“工程图例信息”对话框中“退出”→弹出“工程关联图例文件已修改,是否保存”的对话框→点击“是”。 ③回到显示工作台内空白处点击鼠标右手键(弹出对话框)→点击对话框中“关联图例文件”(弹出对话框)→点击“工程图例信息”中的“修改图例文件”,打开已存的“裁剪文件图例板”文件→点击“确定”; 修改数字地质图中易出现的问题 1.双线河与以河岸为界的地质体之间的关系 (2).地质体与断层之间的关系 2.打折弧段的处理 4.计算机制图过程中应注意的问题→影像图的镶嵌配准、矢量化图的误差校正→套用标准图框:
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页