ms CE 地形转化为mesh过慢

老师:我这边地形转化为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;
}