如图,有两条路侧的多段线,我的需求是根据这两条线生成路面三角网,要求是 不能穿过路中间的封闭图形(如图所示的两个箭头)如果使用CreateXYTriangulation函数,这个函数似乎没有能够限制不穿过图案的参数,我只能传入路侧多段线的点直接生成网格,相当于无视了箭头,如果使用MS自带的”根据等高线创建网格“,在创建的的时候同时选择路侧的多段线和路中间的箭头,则会一起构网,但是又会在封闭图形内部也生成网格,此时就需要手工编辑网格删掉箭头内部的三角网。有没有什么方案能在生成网格的时候加入一些限制条件来尽量减少手工操作的部分。
您可以先不考虑这两个箭头生成一个网格元素,然后再用这两个箭头去切割Mesh。不知这样是否能满足您的需求?
切割这个操作如何用代码实现呢,我得试一下才知道行不行
直接用Mesh布尔差运算切割。
编程操作Mesh元素有多种方法,一个是C++的PolyfaceHeader类,另外一个是C的mdlPop_xxx函数。前者相对复杂一些,后者会简单。比如,两个Mesh的差集可以直接调用如下函数:
Bentley::DgnPlatform::ElementAgenda elementAgenda; SelectionSetManagerR manager = SelectionSetManager::GetManager(); vector<ElementId> v_id; if (SUCCESS == manager.BuildAgenda(elementAgenda)) { for (auto el : elementAgenda) { v_id.push_back(el.GetElementId()); } } MSElementDescr* pElm0 = NULL; MSElementDescr* pElm1 = NULL; MSElementDescr* pElm3 = NULL; UInt32 filePos = 0; mdlAssoc_getElementDescr(&pElm0, &filePos, v_id[0], ACTIVEMODEL, FALSE); mdlAssoc_getElementDescr(&pElm1, &filePos, v_id[1], ACTIVEMODEL, FALSE); pElm3 = mdlPop_elementDescrFromElementDescrDifference(pElm0, pElm1, NULL); if (pElm3 != NULL) { mdlElmdscr_add(pElm3); mdlElmdscr_freeAll(&pElm3); } if (pElm0 != NULL) { mdlElmdscr_freeAll(&pElm0); } if (pElm1 != NULL) { mdlElmdscr_freeAll(&pElm1); }