/// <summary>
        /// 投影
        /// </summary>
        /// <param name="m"></param>
        /// <param name="h"></param>
        /// <param name="p"></param>
        /// <param name="cameraVector"></param>
        /// <param name="mathP"></param>
        /// <returns></returns>
        public static MathVector Project(this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathPoint p, IMathVector cameraVector, IMathUtility mathP)
        {
            IMathUtility math = mathP;

            //var zero = (IMathPoint)math.CreatePoint(new[] { 0, 0, 0 });
            //double pT, qT;
            switch (h)
            {
            case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:

                return(ClosestPointOnAxis(m, p, cameraVector, m.XAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                return(ClosestPointOnAxis(m, p, cameraVector, m.YAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                return(ClosestPointOnAxis(m, p, cameraVector, m.ZAxis));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                return((MathVector)p.Subtract(m.Origin));

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                return((MathVector)p.Subtract(m.Origin));

            default:
                throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }
        }
        public static MathVector Project(this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathPoint p, IMathVector cameraVector, IMathUtility mathP)
        {
            IMathUtility math = mathP;
            var zero = (IMathPoint) math.CreatePoint(new[] {0, 0, 0});
            double pT, qT;
            switch (h)
            {
                case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                    return (MathVector) p.Subtract(m.Origin);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:

                    return ClosestPointOnAxis(m, p, cameraVector, m.XAxis);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                    return ClosestPointOnAxis(m, p, cameraVector, m.YAxis);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                    return ClosestPointOnAxis(m, p, cameraVector, m.ZAxis);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                    return (MathVector) p.Subtract(m.Origin);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                    return (MathVector) p.Subtract(m.Origin);
                case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                    return (MathVector) p.Subtract(m.Origin);
                default:
                    throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }
        }
        public static MathTransform CreateTranslationTransform
            (this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathUtility math, double value)
        {
            MathVector translVector = null;
            switch (h)
            {
                case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:
                    translVector = (MathVector)math.CreateVector(new[] {value, 0, 0});
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                    translVector = (MathVector)math.CreateVector(new[] {0, value, 0});
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                    translVector = (MathVector)math.CreateVector(new[] {0, 0, value});
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                    break;
                case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }

            if (translVector == null)
                return null;

            return math.ComposeTransform(m.XAxis, m.YAxis, m.ZAxis, translVector, 1.0);
        }
        /// <summary>
        /// 创建变换矩阵
        /// </summary>
        /// <param name="m"></param>
        /// <param name="h"></param>
        /// <param name="math"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static MathTransform CreateTranslationTransform
            (this ITriadManipulator m, swTriadManipulatorControlPoints_e h, IMathUtility math, double value)
        {
            MathVector translVector = null;

            switch (h)
            {
            case swTriadManipulatorControlPoints_e.swTriadManipulatorOrigin:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXAxis:
                translVector = (MathVector)math.CreateVector(new[] { value, 0, 0 });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYAxis:
                translVector = (MathVector)math.CreateVector(new[] { 0, value, 0 });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZAxis:
                translVector = (MathVector)math.CreateVector(new[] { 0, 0, value });
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorXYPlane:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorYZPlane:
                break;

            case swTriadManipulatorControlPoints_e.swTriadManipulatorZXPlane:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(h), h, null);
            }

            if (translVector == null)
            {
                return(null);
            }

            return(math.ComposeTransform(m.XAxis, m.YAxis, m.ZAxis, translVector, 1.0));
        }