Example #1
0
    //导出数据到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);
        }
    }
Example #2
0
    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);
    }