/// <summary> /// Provides the surface of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the graph</param> /// <param name="Xparameter">The parameter used for the X axis</param> /// <param name="Yparameter">The parameter used for the Y axis</param> /// <returns></returns> public virtual Surface createSurfaceForParameters(Interpreter.InterpretationContext context, Parameter Xparameter, Parameter Yparameter) { Surface retVal = Surface; if (retVal == null) { if (Xparameter != null) { if (Yparameter != null) { if (Cases.Count > 0) { retVal = new Surface(Xparameter, Yparameter); foreach (Case cas in Cases) { if (PreconditionSatisfied(context, cas, Xparameter, Yparameter)) { Surface surface = cas.Expression.createSurface(context, Xparameter, Yparameter); if (surface != null) { Parameter parameter = null; surface = ReduceSurface(context, cas, surface, out parameter); if (parameter == null || parameter == surface.XParameter) { retVal.MergeX(surface); } else { retVal = Surface.MergeY(retVal, surface); } } else { AddError("Cannot create surface for expression " + cas.ExpressionText); retVal = null; break; } } } } else if (Graph != null) { // The function is defined by a graph // Extend it to a surface // TODO: Check the right parameter retVal = Graph.ToSurfaceX(); retVal.XParameter = Xparameter; retVal.YParameter = Yparameter; } else { AddError("cannot create surface for function " + Name + " with given parameters"); } } else { // Function with 1 parameter that ranges over the Xaxis retVal = new Surface(Xparameter, Yparameter); Functions.Graph graph = createGraphForParameter(context, Xparameter); foreach (Graph.Segment segment in graph.Segments) { Graph newGraph = Graph.createGraph(segment.Expression.v0); Surface.Segment newSegment = new Surface.Segment(segment.Start, segment.End, newGraph); retVal.AddSegment(newSegment); } } } else if (Yparameter != null) { // TODO : Remove check code if ((Yparameter.Enclosing != this)) { System.Diagnostics.Debugger.Break(); } // Function with 1 parameter that ranges over the Yaxis retVal = new Surface(Xparameter, Yparameter); Graph graph = createGraphForParameter(context, Yparameter); Surface.Segment segment = new Functions.Surface.Segment(0, double.MaxValue, graph); retVal.AddSegment(segment); } else { AddError("Invalid parameters for surface creation"); } } retVal.XParameter = Xparameter; retVal.YParameter = Yparameter; return(retVal); }
/// <summary> /// Provides the surface of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the graph</param> /// <param name="Xparameter">The parameter used for the X axis</param> /// <param name="Yparameter">The parameter used for the Y axis</param> /// <returns></returns> public virtual Surface createSurfaceForParameters(Interpreter.InterpretationContext context, Parameter Xparameter, Parameter Yparameter) { Surface retVal = Surface; if (retVal == null) { if (Xparameter != null) { if (Yparameter != null) { if (Cases.Count > 0) { retVal = new Surface(Xparameter, Yparameter); foreach (Case cas in Cases) { if (PreconditionSatisfied(context, cas, Xparameter, Yparameter)) { Surface surface = cas.Expression.createSurface(context, Xparameter, Yparameter); if (surface != null) { Parameter parameter = null; surface = ReduceSurface(context, cas, surface, out parameter); if (parameter == null || parameter == surface.XParameter) { retVal.MergeX(surface); } else { retVal = Surface.MergeY(retVal, surface); } } else { AddError("Cannot create surface for expression " + cas.ExpressionText); retVal = null; break; } } } } else if (Graph != null) { // The function is defined by a graph // Extend it to a surface // TODO: Check the right parameter retVal = Graph.ToSurfaceX(); retVal.XParameter = Xparameter; retVal.YParameter = Yparameter; } else { AddError("cannot create surface for function " + Name + " with given parameters"); } } else { // Function with 1 parameter that ranges over the Xaxis retVal = new Surface(Xparameter, Yparameter); Functions.Graph graph = createGraphForParameter(context, Xparameter); foreach (Graph.Segment segment in graph.Segments) { Graph newGraph = Graph.createGraph(segment.Expression.v0); Surface.Segment newSegment = new Surface.Segment(segment.Start, segment.End, newGraph); retVal.AddSegment(newSegment); } } } else if (Yparameter != null) { // TODO : Remove check code if ((Yparameter.Enclosing != this)) { System.Diagnostics.Debugger.Break(); } // Function with 1 parameter that ranges over the Yaxis retVal = new Surface(Xparameter, Yparameter); Graph graph = createGraphForParameter(context, Yparameter); Surface.Segment segment = new Functions.Surface.Segment(0, double.MaxValue, graph); retVal.AddSegment(segment); } else { AddError("Invalid parameters for surface creation"); } } retVal.XParameter = Xparameter; retVal.YParameter = Yparameter; return retVal; }