//导出数据到ConvexData中 public void ExportCHData(ConvexData chData) { List <int> lstMap = new List <int>(); //一个由顶点在本类中id到CConvexHullData中id的一个映射表; //遍历每一个Patch for (int i = 0; i < LstPatches.Count; i++) { Patch pat = LstPatches[i]; Vector3 n = pat.Normal; CovFace face = new CovFace(); face.Normal = n; face.Dist = pat.Dist; for (int j = 0; j < pat.GetVNum(); j++) { int vid = pat.GetVID(j); //构造垂直于该边法向朝外的HalfSpace Vector3 v1 = Vector3.zero; Vector3 v2 = Vector3.zero; pat.GetEdge(j, ref v1, ref v2); int ExistID = FindInArray(vid, lstMap); if (ExistID == -1) { //说明是新的顶点 //插入到CConvexHullData的Vertices中 chData.AddVertex(v1); int newID = chData.GetVertexNum() - 1; //在pCHData中的id face.AddElement(newID); lstMap.Add(vid); } else { //说明是已经存在的顶点 face.AddElement(ExistID); } } //插入该面片 chData.AddFace(face); } }
public bool CreateConvexHullData(Vector3[] vertBuf, CovFace faceTop, CovFace faceBottom) { if (vertBuf == null || vertBuf.Length <= 0) { return(false); } int vertCount = vertBuf.Length; Reset(); for (int i = 0; i < vertCount; ++i) { AddVertex(vertBuf[i]); } Vector3 vNormalTop = faceTop.Normal; Vector3 vNormalBTM = faceBottom.Normal; int idx = 0; int nHalfVert = vertCount / 2; int idxInverse = (nHalfVert - 1) * 2; int p0, p1, p2, p3; int pi0, pi2, pi3; for (int i = 0; i < nHalfVert; ++i) { /* * a side face: * p0 p2 +-------+ | | | | | | +-------+ | p1 p3 */ p0 = idx; p1 = idx + 1; p2 = idx + 2; p3 = idx + 3; if (p2 >= vertCount) { p2 -= vertCount; } if (p3 >= vertCount) { p3 -= vertCount; } CovFace face = new CovFace(); face.Set(vertBuf[p0], vertBuf[p1], vertBuf[p2]); Vector3 vNormal = face.Normal; face.AddElement(p0); face.AddElement(p2); face.AddElement(p3); face.AddElement(p1); AddFace(face); faceBottom.AddElement(p1); pi0 = idxInverse; //pi1 = idxInverse + 1; pi2 = idxInverse + 2; pi3 = idxInverse + 3; if (pi2 >= vertCount) { pi2 -= vertCount; } if (pi3 >= vertCount) { pi3 -= vertCount; } faceTop.AddElement(pi0); idx += 2; idxInverse -= 2; } AddFace(faceTop); AddFace(faceBottom); return(true); }