override public Element Optimize()
        {
            OptimizeChildren();

            IWorkshopTree a = ParameterValues[0];
            IWorkshopTree b = ParameterValues[1];

            // Multiply number and number
            if (a is V_Number && b is V_Number)
            {
                return(((V_Number)ParameterValues[0]).Value * ((V_Number)ParameterValues[1]).Value);
            }

            // Multiply vector and number
            if ((a is V_Vector && b is V_Number) || (a is V_Number && b is V_Vector))
            {
                V_Vector vector = a is V_Vector ? (V_Vector)a : (V_Vector)b;
                V_Number number = a is V_Number ? (V_Number)a : (V_Number)b;

                if (vector.ConstantSupported <Models.Vertex>())
                {
                    Models.Vertex vertex = (Models.Vertex)vector.GetConstant();
                    return(new V_Vector(
                               vertex.X * number.Value,
                               vertex.Y * number.Value,
                               vertex.Z * number.Value
                               ));
                }
            }

            return(this);
        }
Exemplo n.º 2
0
        public static V_Number[] IntToElement(params int[] numbers)
        {
            V_Number[] elements = new V_Number[numbers?.Length ?? 0];
            for (int i = 0; i < elements.Length; i++)
            {
                elements[i] = new V_Number(numbers[i]);
            }

            return(elements);
        }
        public Element OptimizeAddOperation(
            Func <double, double, double> op,
            Func <Element, Element, Element> areEqual,
            bool returnBIf0
            )
        {
            OptimizeChildren();

            Element a = (Element)ParameterValues[0];
            Element b = (Element)ParameterValues[1];

            V_Number aAsNumber = a as V_Number;
            V_Number bAsNumber = b as V_Number;

            // If a and b are numbers, operate them.
            if (aAsNumber != null && bAsNumber != null)
            {
                return(op(aAsNumber.Value, bAsNumber.Value));
            }

            // If a is 0, return b.
            if (aAsNumber != null && aAsNumber.Value == 0 && returnBIf0)
            {
                return(b);
            }

            // If b is 0, return a.
            if (bAsNumber != null && bAsNumber.Value == 0)
            {
                return(a);
            }

            if (a.EqualTo(b))
            {
                return(areEqual(a, b));
            }

            if (a.ConstantSupported <Vertex>() && b.ConstantSupported <Vertex>())
            {
                var aVertex = (Vertex)a.GetConstant();
                var bVertex = (Vertex)b.GetConstant();

                return(new V_Vector(
                           op(aVertex.X, bVertex.X),
                           op(aVertex.Y, bVertex.Y),
                           op(aVertex.Z, bVertex.Z)
                           ));
            }

            return(this);
        }
        public Element OptimizeMultiplyOperation(
            Func <double, double, double> op,
            Func <Element, Element, Element> areEqual,
            bool returnBIf1
            )
        {
            OptimizeChildren();

            Element a = (Element)ParameterValues[0];
            Element b = (Element)ParameterValues[1];

            V_Number aAsNumber = a as V_Number;
            V_Number bAsNumber = b as V_Number;

            // Multiply number and number
            if (aAsNumber != null && bAsNumber != null)
            {
                return(op(aAsNumber.Value, bAsNumber.Value));
            }

            // Multiply vector and a vector
            if (a.ConstantSupported <Vertex>() && b.ConstantSupported <Vertex>())
            {
                Vertex vertexA = (Vertex)a.GetConstant();
                Vertex vertexB = (Vertex)b.GetConstant();
                return(new V_Vector(
                           op(vertexA.X, vertexB.X),
                           op(vertexA.Y, vertexB.Y),
                           op(vertexA.Z, vertexB.Z)
                           ));
            }

            // Multiply vector and number
            if ((a.ConstantSupported <Vertex>() && b is V_Number) || (a is V_Number && b.ConstantSupported <Vertex>()))
            {
                Vertex   vector = a.ConstantSupported <Vertex>() ? (Vertex)a.GetConstant() : (Vertex)b.GetConstant();
                V_Number number = a is V_Number ? (V_Number)a : (V_Number)b;
                return(new V_Vector(
                           op(vector.X, number.Value),
                           op(vector.Y, number.Value),
                           op(vector.Z, number.Value)
                           ));
            }

            if (aAsNumber != null)
            {
                if (aAsNumber.Value == 1 && returnBIf1)
                {
                    return(b);
                }
                if (aAsNumber.Value == 0)
                {
                    return(0);
                }
            }

            if (bAsNumber != null)
            {
                if (bAsNumber.Value == 1)
                {
                    return(a);
                }
                if (bAsNumber.Value == 0)
                {
                    return(0);
                }
            }

            if (a.EqualTo(b))
            {
                return(areEqual(a, b));
            }

            return(this);
        }
 public V_Vector(V_Number x, V_Number y, V_Number z)
 {
     ParameterValues = new IWorkshopTree[] { x, y, z };
 }