public List <Vector3d[]> Split(LinkedList <Vector3d> polyVertList, Vector3d polyFaceNormal)
        {
            if (polyVertList == null)
            {
                return(null);
            }

            Vector3d dir;

            LinkedListNode <Vector3d>[] abc;
            List <Vector3d[]>           triVertexList = new List <Vector3d[]>();

            legalTriNodeList.Clear();

            while (polyVertList.Count > 2)
            {
                for (var node = polyVertList.First; node != null; node = node.Next)
                {
                    //获取一个耳三角形
                    abc = GetTriNodes(polyVertList, node);

                    Vector3d ab = abc[1].Value - abc[0].Value;
                    Vector3d bc = abc[2].Value - abc[1].Value;
                    dir = Vector3d.Cross(ab, bc);
                    int ret = geoAlgor.CmpParallelVecDir(dir, polyFaceNormal);
                    if (ret == -1)
                    {
                        continue;
                    }

                    Vector3d ac     = abc[2].Value - abc[0].Value;
                    Vector3d ba     = abc[0].Value - abc[1].Value;
                    Vector3d ca     = abc[0].Value - abc[2].Value;
                    Vector3d cb     = abc[1].Value - abc[2].Value;
                    Vector3d aCross = Vector3d.Cross(ab, ac);
                    Vector3d bCross = Vector3d.Cross(bc, ba);
                    Vector3d cCross = Vector3d.Cross(ca, cb);

                    //
                    bool isInTri = false;
                    for (var node2 = polyVertList.First; node2 != null; node2 = node2.Next)
                    {
                        if (node2 == abc[0] || node2 == abc[1] || node2 == abc[2])
                        {
                            continue;
                        }

                        Vector3d pt = node2.Value;
                        isInTri = TestPointInTri(pt, abc[0].Value, abc[1].Value, abc[2].Value, aCross, bCross, cCross);
                        if (isInTri == true)
                        {
                            break;
                        }
                    }

                    if (isInTri == false)
                    {
                        legalTriNodeList.AddLast(abc);
                    }

                    if (polyVertList.Count == 3)
                    {
                        break;
                    }
                }

                LinkedListNode <Vector3d>[] nodes = GetLimitShortSideTri(legalTriNodeList);
                if (nodes != null)
                {
                    polyVertList.Remove(nodes[1]);
                    Vector3d[] vertexs = new Vector3d[3];
                    vertexs[0] = nodes[0].Value;
                    vertexs[1] = nodes[1].Value;
                    vertexs[2] = nodes[2].Value;
                    triVertexList.Add(vertexs);
                }
                else
                {
                    break;
                }

                legalTriNodeList.Clear();
            }

            return(triVertexList);
        }