public OutputState(List <CalculatorCore> calcs, GraphRange xRange, GraphRange yRange, GraphRange zRange, DirectBitmap bitmap)
 {
     Calcs  = calcs;
     XRange = xRange;
     YRange = yRange;
     ZRange = zRange;
     Bitmap = bitmap;
 }
 private static void MaybeChooseAutoZRange(GraphRange range, double[,] data)
 {
     if (data != null && range.AutoRange)
     {
         range.Lo = double.NaN;
         range.Hi = double.NaN;
         FindMinMax(data, ref range.Lo, ref range.Hi);
         if (double.IsNaN(range.Lo))
         {
             range.Lo = -1;
             range.Hi = 1;
         }
     }
 }
        public static GraphRange New(string rangeName, LNode range, int numPixels, Dictionary <Symbol, LNode> varDict)
        {
            if (range == null)
            {
                return new GraphRange(-1, 1, numPixels, Pens.MidnightBlue, null)
                       {
                           AutoRange = true
                       }
            }
            ;
            if (range.Calls(CodeSymbols.Colon, 2) && range[0].IsId && string.Compare(range[0].Name.Name, rangeName, true) == 0)
            {
                range = range[1]; // ignore axis prefix like "x:" or "y:"
            }
            if (range.Calls(CodeSymbols.Sub, 2) || range.Calls(CodeSymbols.DotDot, 2))
            {
                double lo    = CalculatorCore.Eval(range[0], varDict);
                double hi    = CalculatorCore.Eval(range[1], varDict);
                Pen    pen   = OutputState.MakePen(range);
                string label = range.Attrs.Select(a => a.Value as string).FirstOrDefault(s => s != null);

                var result = new GraphRange(lo, hi, numPixels, pen, label)
                {
                    RangeExpr = range
                };

                foreach (var attr in range.Attrs)
                {
                    if (attr.Value is int)
                    {
                        result.RoughLineCount = (int)attr.Value;
                    }
                }
                return(result);
            }
            throw new FormatException("Invalid range for {axis}: {range}".Localized("axis", rangeName, "range", range));
        }
    }
 static double ChooseGridSpacing(out double lo, GraphRange range, double[,] data = null)
 {
     lo = range.Lo;
     MaybeChooseAutoZRange(range, data);
     return(ChooseGridSpacing(ref lo, range.Hi, range.RoughLineCount));
 }