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); }
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 }; }