老师:我这边地形转化为mesh很慢,当地形过大时,求取对应的标高也很慢,请问有什么简单的方法没有,是不是我的方法不对.但地形很大的情况下这两个函数都很慢.
下面是我的转化代码
/*** @brief 将一个元素转换为mesh* @param[out] eeh_mesh 转换后的mesh元素* @param[in] eeh_source 原元素* @param[in] ifo 转换参数结构体* @param[in] dmr mesh元素所在model* @return 成功返回true,失败返回false*/bool EW_GetElevation::elementToMesh(EditElementHandleR eeh_mesh, const ElementHandle & eeh_source, IFacetOptionsPtr ifo, DgnModelRefR dmr){ //将任意元素转换为mesh if (!ifo.IsValid()) { ifo = IFacetOptions::New(); setOptions(ifo); } //获取转换后的所有mesh auto meshes = getMesh(&eeh_source, ifo); if (meshes.size() == 0) { return false; } MSElementDescrP edp_chain = nullptr; int num = 0; //将所有mesh拼接成一个mesh 以下拼接代码需要理解 for (auto mesh : meshes) { EditElementHandle eeh; if (SUCCESS != MeshHeaderHandler::CreateMeshElement(eeh, NULL, *mesh, dmr.Is3d(), dmr) || !eeh.IsValid()) { continue; } if (!eeh.PeekElementDescrCP()) { continue; } auto edp = eeh.ExtractElementDescr(); if (!edp) { continue; } if (!edp_chain) { edp_chain = edp; num++; } else { mdlElmdscr_addToChain(edp_chain, edp); num++; } } if (!edp_chain) { return false; } if (num == 1) { eeh_mesh.SetElementDescr(edp_chain, true, false, &dmr); } else { MSElementDescrP edp_mesh = nullptr; //mesh拼接 if (SUCCESS != mdlMesh_stitchFacets(&edp_mesh, edp_chain, 0., 0., 0.) || !edp_mesh) { return false; } edp_chain->Release(); eeh_mesh.SetElementDescr(edp_mesh, true, false, &dmr); } if (!eeh_mesh.IsValid()) { mdlDialog_dmsgsPrint(L"生成网格元素失败"); return false; } return true;}
这是求取标高的代码
bool EW_GetElevation::getElevation(ModelMesh mm, const double x, const double y, double & h){ //用射线和地形模型相交求交点的方式获取高程 static const auto vecDir = DPoint3d::From(0., 0., 1.); DPoint3d op; bvector<DPoint3d> vecPoint; switch (mm) { //自然高程 case EW_GetElevation::ModelMesh::Nature_mesh: { /* 点的计算由来:为确保求得交点,设定射线的起点为对应地形的最小高程减去特定值 */ op = DPoint3d::From(x, y, s_NatureMesh_PosMin.z - 1000.); /* vecPoint:射线与三角网交点集合 s_NatureMesh_eeh.GetElementDescrP():求交点的目标元素 &op:射线的起点 &vecDir:射线的方向 */ if (SUCCESS != mdlMesh_intersectRayWithMeshTriangles(&vecPoint, nullptr, nullptr, nullptr, s_NatureMesh_eeh.GetElementDescrP(), &op, &vecDir)) { //求交点失败 h = DBL_MIN; return false; } } break; case EW_GetElevation::ModelMesh::Design_mesh: { //设计高程 op = DPoint3d::From(x, y, s_DesignMesh_PosMin.z - 1000.); if (SUCCESS != mdlMesh_intersectRayWithMeshTriangles(&vecPoint, nullptr, nullptr, nullptr, s_DesignMesh_eeh.GetElementDescrP(), &op, &vecDir)) { //求交点失败 h = DBL_MIN; return false; } } break; default: h = DBL_MIN; return false; break; } //返回高程信息 if (vecPoint.size() <= 0) { //获取高程失败 h = DBL_MIN; return false; } h = vecPoint[0].z; //遍历交点,将所有交点中的z坐标最小值返回 for (auto point : vecPoint) { if (h < point.z) { h = point.z; } } return true;}
我看您代码里边调用了mdlMesh_stitchFacets,是否是这一步造成的?您可以试试将这一步先注掉看看是否仍然很慢?
老师,您好,这个代码是参考论坛回复写的,我去掉试一下速度。
但是我主要是需要解决以下这个问题,不知道老师还有其他思路没有,谢谢。
问题点:我转化为mesh面片用了30几秒,用得到的面片计算标高速度很慢,这是为什么。我用10000个点计算标高用了10多分钟,我主要为了解决这个问题。或者有没有通过地形元素直接获取标高的方法?
老师,注释之后速度也很慢,并且还导致获取标高的数值不对。
回复参见新帖:https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/198973/ms-ce-dtm
Answer Verified By: chen chen