private static Vector2 GetEachUnit(EachControlPointAngleMode angleMode, Vector2 selfUnit, Vector2 startingSelfUnit, Vector2 startingEachUnit)
        {
            switch (angleMode)
            {
            case EachControlPointAngleMode.None: return(startingEachUnit);

            case EachControlPointAngleMode.Asymmetric: return(-selfUnit);

            case EachControlPointAngleMode.Fixed:
            {
                float selfRadians         = Math.VectorToRadians(selfUnit);
                float startingSelfRadians = Math.VectorToRadians(startingSelfUnit);
                float startingEachRadians = Math.VectorToRadians(startingEachUnit);

                float radians = selfRadians - startingSelfRadians + startingEachRadians;
                return(new Vector2((float)System.Math.Cos(radians), (float)System.Math.Sin(radians)));
            }
            }
            return(Vector2.Zero);
        }
        /// <summary>
        /// It controls the transformation of node contol point.
        /// </summary>
        /// <param name="mode"> The mode. </param>
        /// <param name="lengthMode"> The length mode. </param>
        /// <param name="angleMode"> The angle mode. </param>
        /// <param name="point"> The point. </param>
        /// <param name="startingNoder"> The starting node. </param>
        /// <param name="isLeftControlPoint"> <see cref="Node.LeftControlPoint"/> or <see cref="Node.RightControlPoint"/>. </param>
        /// <returns> The controlled node. </returns>
        public static void Controller(SelfControlPointMode mode, EachControlPointLengthMode lengthMode, EachControlPointAngleMode angleMode, Vector2 point, Node node, bool isLeftControlPoint = true)
        {
            Vector2 startingPoint = node.StartingPoint;

            Vector2 startingSelfControlPoint = isLeftControlPoint ? node.StartingLeftControlPoint : node.StartingRightControlPoint;
            Vector2 startingEachControlPoint = isLeftControlPoint ? node.StartingRightControlPoint : node.StartingLeftControlPoint;

            Vector2 selfControlPoint = Node.GetSelfControlPoint(mode, point, startingPoint, startingSelfControlPoint);
            Vector2 eachControlPoint = Node.GetEachControlPoint(lengthMode, angleMode, startingPoint, selfControlPoint - startingPoint, startingSelfControlPoint - startingPoint, startingEachControlPoint - startingPoint);

            node.LeftControlPoint  = isLeftControlPoint ? selfControlPoint : eachControlPoint;
            node.RightControlPoint = isLeftControlPoint ? eachControlPoint : selfControlPoint;
        }
        // Each
        private static Vector2 GetEachControlPoint(EachControlPointLengthMode lengthMode, EachControlPointAngleMode angleMode, Vector2 startingPoint, Vector2 selfVector, Vector2 startingSelfVector, Vector2 startingEachVector)
        {
            float selfLength         = selfVector.Length();
            float startingSelfLength = startingSelfVector.Length();
            float startingEachLength = startingEachVector.Length();

            float   eachLength = Node.GetEachLength(lengthMode, selfLength, startingSelfLength, startingEachLength);
            Vector2 eachUnit   = Node.GetEachUnit(angleMode, selfVector / selfLength, startingSelfVector / selfLength, startingEachVector / startingEachLength);

            Vector2 eachControlPoint = startingPoint + eachLength * eachUnit;

            return(eachControlPoint);
        }