示例#1
0
        /// <summary>
        /// Clones a specified tree based on a given node 'root'
        /// </summary>
        /// <param name="root"></param>
        /// <returns></returns>
        public static BaseNode CloneTree(BaseNode root)
        {
            if (root == null)
            {
                return(null);
            }

            BaseNode newNode = null;

            if (root is SubstractionNode)
            {
                newNode = new SubstractionNode(root.value);
            }
            else if (root is MultiplicationNode)
            {
                newNode = new MultiplicationNode(root.value);
            }
            else if (root is SumNode)
            {
                newNode = new SumNode(root.value);
            }
            else if (root is DivisionNode)
            {
                newNode = new DivisionNode(root.value);
            }
            else if (root is NumberNode)
            {
                newNode = new NumberNode(null, (root as NumberNode).RealValue);
            }
            else if (root is BasicFunctionXNode)
            {
                newNode = new BasicFunctionXNode(root.value);
            }
            else if (root is SinNode)
            {
                newNode = new SinNode(root.value);
            }
            else if (root is CosNode)
            {
                newNode = new CosNode(root.value);
            }
            else if (root is PowerNode)
            {
                newNode = new PowerNode(root.value);
            }
            else if (root is LnNode)
            {
                newNode = new LnNode(root.value);
            }
            else if (root is FactorialNode)
            {
                newNode = new FactorialNode(root.value);
            }

            newNode.left  = CloneTree(root.left);
            newNode.right = CloneTree(root.right);
            return(newNode);
        }
示例#2
0
        public override void CreateDerivativeTree(BaseNode parent, bool isLeft = true)
        {
            SinNode            sinNode        = new SinNode(Plotter.CloneTree(this.left), null);
            MultiplicationNode multiplication = new MultiplicationNode(new NumberNode(null, -1), sinNode, null);
            MultiplicationNode node           = new MultiplicationNode(Plotter.CloneTree(this.left), multiplication, null);

            if (parent != null)
            {
                if (isLeft)
                {
                    parent.left = node;
                }
                else
                {
                    parent.right = node;
                }
            }

            node.left.CreateDerivativeTree(node);

            //Plotter.SetDerivativeRoot (node);
            SetDerivativeRoot(node);
        }
示例#3
0
        /// <summary>
        /// Creates tree based on an input string and root node
        /// </summary>
        /// <param name="s"></param>
        /// <param name="baseNode"></param>
        public void CreateTree(string s, BaseNode baseNode)
        {
            // if the string is empty, we don't do anything. This is the base case to leave the recursion
            if (s == string.Empty)
            {
                return;
            }

            // if it's 's', or '+', or whatever, we create a dedicated class (watch first case to see the logic)
            if (s[0] == 's')
            {
                SinNode node = new SinNode(s, baseNode); // dedicated class
                baseNode.Insert(node);                   // we insert it to the current head node
                CreateTree(node.value, node);            // we change the head node to the newly created one
            }
            else if (s[0] == 'c')
            {
                CosNode node = new CosNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '*')
            {
                // same as in the first 'if'
                MultiplicationNode node = new MultiplicationNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '+')
            {
                // same as in the first 'if'
                SumNode node = new SumNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '/')
            {
                DivisionNode node = new DivisionNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '-' && !(s[1] >= '0' && s[1] <= '9'))
            {
                SubstractionNode node = new SubstractionNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == 'l')
            {
                LnNode node = new LnNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '^')
            {
                PowerNode node = new PowerNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '!')
            {
                FactorialNode node = new FactorialNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == 'p' || (s[0] >= '0' && s[0] <= '9'))
            {
                // stuff below just parses number
                string toParseIntoNumber = string.Empty;
                int    counter           = 0;

                if (s[0] == 'p')
                {
                    toParseIntoNumber = "p";
                }
                else
                {
                    while ((s[counter] >= '0' && s[counter] <= '9') || s[counter] == '.')
                    {
                        toParseIntoNumber += s[counter];
                        counter++;
                    }
                }

                if (toParseIntoNumber.Contains('.'))
                {
                    toParseIntoNumber = toParseIntoNumber.Replace('.', ',');
                }

                string @newS = string.Empty;

                for (int i = (s[0] == 'p' ? 1 : counter); i < s.Length; i++)
                {
                    newS += s[i];
                }

                // same stuff as in the first 'if'
                NumberNode node = new NumberNode(newS, baseNode, toParseIntoNumber);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '-' && (s[1] >= '0' && s[1] <= '9'))
            {
                // negative number
                s = Plotter.GetStringFromIndex(s, 1);

                string toParseIntoNumber = string.Empty;
                int    counter           = 0;

                if (s[0] == 'p')
                {
                    toParseIntoNumber = "p";
                }
                else
                {
                    do
                    {
                        toParseIntoNumber += s[counter];
                        counter++;
                    } while (counter < s.Length && ((s[counter] >= '0' && s[counter] <= '9') || s[counter] == '.'));
                }

                string @newS = string.Empty;

                for (int i = (s[0] == 'p' ? 1 : counter); i < s.Length; i++)
                {
                    newS += s[i];
                }

                NumberNode node = new NumberNode(newS, baseNode, "-" + toParseIntoNumber);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == 'x')
            {
                // same as in the first 'if'
                BasicFunctionXNode node = new BasicFunctionXNode(s, baseNode);
                baseNode.Insert(node);
                CreateTree(node.value, node);
            }
            else if (s[0] == '(' || s[0] == ' ')
            {
                s = GetStringFromIndex(s, 1);  // practically delete that ( or ' '
                CreateTree(s, baseNode);
            }
            else if (s[0] == ')')
            {
                // count how many times ')' appears, let this number be 'i', then our head node is gonna go 'i' levels up

                int i = 0;

                while (s[i] == ')' && (s[i] != ',' || s[i] != ' '))
                {
                    i++;
                    if (i == s.Length)
                    {
                        break;
                    }
                }

                for (int j = 0; j < i; j++)
                {
                    if (baseNode.parent != null)
                    {
                        baseNode = baseNode.parent;
                    }
                    else
                    {
                        throw new Exception("Eror in your input");
                    }
                }


                s = GetStringFromIndex(s, i);
                CreateTree(s, baseNode);
            }
            else if (s[0] == ',')
            {
                if (baseNode.parent == null)
                {
                    throw new Exception("Error in your input");
                }

                // go one level up
                baseNode = baseNode.parent;
                s        = GetStringFromIndex(s, 1);
                CreateTree(s, baseNode);
            }
        }