internal static Movement4 getMoveVector(Triangle tri, Triangle adjacentTri, Edge commonEdge)
        {
            Movement4 r      = new Movement4();
            Point     center = tri.Center;
            Edge      e      = center.PerpendicularOn(commonEdge.ToLine());

            if (adjacentTri == null)
            {
                return(r);
            }
            Edge e2 = adjacentTri.Center.PerpendicularOn(commonEdge.ToLine());

            Autodesk.AutoCAD.Geometry.Vector3d v      = MyConvert.toVector(e);
            Autodesk.AutoCAD.Geometry.Vector3d v2     = MyConvert.toVector(e2);
            Autodesk.AutoCAD.Geometry.Vector3d crossv = v.CrossProduct(v2);
            Autodesk.AutoCAD.Geometry.Vector3d movev  = crossv.CrossProduct(v);
            double angle = v.GetAngleTo(v2);

            if (angle < 0)
            {
                throw new System.Exception("angle<0");
            }
            if (angle > Math.PI)
            {
                angle = Math.PI * 2 - angle;
            }
            double length = e.Length;

            Autodesk.AutoCAD.Geometry.Vector3d unitV = movev.GetNormal();

            r.move = -unitV * (Math.PI - angle) * 1 / 16;
            r.dis  = length;
            return(r);
        }
        public static List <InterpolatedPoint> interp2(TEDictionary ted, Triangle tri)
        {
            List <InterpolatedPoint> r = new List <InterpolatedPoint>();

            Autodesk.AutoCAD.Geometry.Vector3d totalMoveV = new Autodesk.AutoCAD.Geometry.Vector3d();
            List <Movement4> moveList = new List <Movement4>();
            Point            center   = tri.Center;

            for (int i = 0; i < 3; i++)
            {
                Edge     commonEdge  = tri.Edges[i];
                Triangle adjacentTri = getAdjacentTri(ted, tri, commonEdge);
                if (adjacentTri == null)
                {
                    continue;
                }
                Movement4 moveV = getMoveVector(tri, adjacentTri, commonEdge);
                moveList.Add(moveV);
            }
            double totalLength = 0;

            for (int i = 0; i < moveList.Count; i++)
            {
                totalLength += moveList[i].dis;
            }

            for (int i = 0; i < moveList.Count; i++)
            {
                totalMoveV += moveList[i].move * totalLength;
            }

            Point movedP = center.Move(new ngeometry.VectorGeometry.Vector3d(totalMoveV.X, totalMoveV.Y, totalMoveV.Z));

            r.Add(new InterpolatedPoint(totalMoveV.Length, movedP));
            return(r);
        }