效果图:
这是一个三维模型的局部二面图,用这个图为例连接bed构造模型表面最短线。
简单来说就是三步:
1.打破原有结构
2.添加新连接点
3.重建拓扑关联
1.打破原有结构
我们删除Fabc, Fadc两个面,要删除这个面的前提需要知道他们的cell id
public void DeleteCell(ref vtkPolyData polyData, long cellId)
{
polyData.BuildCells();
polyData.DeleteCell(cellId);
polyData.RemoveDeletedCells();
polyData.Modified();
}
删除Fabc, Fadc后就没有 ac 线。
2.添加点 e
因为是空间的点,且要满足 b-e-d 在模型表面最短直线,就是 e(x,y,z) 满足be + ed 在直线ac上有最小值的最值问题。假设求出 坐标e(x,y,z),现在将e 添加到模型中。
public long InsertPoint(ref vtkPolyData polyData, Point3d addPoint)
{
int pointNum = (int)polyData.GetNumberOfPoints();
polyData.BuildCells();
polyData.BuildLinks(pointNum);
long addId = polyData.InsertNextLinkedPoint(addPoint.GetIntPtr(), 4);
polyData.Modified();
return addId;
}
3.重建拓扑关联
需要添加Fabe,Fbec,Fced,Fdea 四个面来填补之前删除的面重新构建拓扑关系,我们需要知道 a,b,c,d,e所有点 Id。
public void InsertCell(ref vtkPolyData polyData, long id1, long id2, long id3)
{
polyData.BuildCells();
vtkIdList idList = new vtkIdList();
idList.InsertNextId(id1);
idList.InsertNextId(id2);
idList.InsertNextId(id3);
vtkCellArray cellArray = polyData.GetPolys();
cellArray.InsertNextCell(idList);
cellArray.Modified();
polyData.SetPolys(cellArray);
polyData.Modified();
}
到此完成了网格结构的改变