Exemplo n.º 1
0
        void RefreshDisplay()
        {
            OutputState os = PrepareCalculators();

            if (os != null)
            {
                // Refresh result label immediately
                string resultText = null;
                try {
                    foreach (var c in os.Calcs)
                    {
                        resultText  = resultText == null ? "" : resultText + ", ";
                        resultText += CalculatorCore.Eval(c.Expr, c.Vars);
                    }
                    txtResult.Enabled = true;
                } catch (Exception e) {
                    if (resultText == null)
                    {
                        resultText = e.Message;
                    }
                    txtResult.Enabled = false;
                }
                txtResult.Text = resultText;

                if (_bw.IsBusy)
                {
                    _refreshRequested = true;
                    return;
                }

                os.Bitmap = new DirectBitmap(graphPanel.ClientSize);

                _bw.RunWorkerAsync(os);
            }
        }
 void RenderSeries(CalculatorCore calc, int seriesIndex, Graphics g)
 {
     sbyte[,] bins = null;
     using (Pen pen = MakePen(calc.Expr, seriesIndex)) {
         if (calc.Results is double[])
         {
             RenderXFunc(g, (double[])calc.Results, pen);
         }
         else
         {
             double[,] data = (double[, ])calc.Results;
             if (((Calculator3D)calc).EquationMode)
             {
                 RenderXYFunc(data, true, pen.Color);
             }
             else
             {
                 bins = bins ?? new sbyte[data.GetLength(0), data.GetLength(1)];
                 double lo, interval = ChooseGridSpacing(out lo, ZRange, data);
                 RenderContourLines(data, bins, pen.Color, lo, interval);
                 DrawText(g, "Contour interval: {0}".Localized(interval), Bitmap.Width / 2, 5, pen.Color, StringAlignment.Center, StringAlignment.Near);
             }
         }
     }
 }
Exemplo n.º 3
0
        OutputState PrepareCalculators()
        {
            try {
                // Parse the three combo boxes and build a dictionary of variables
                var exprs     = ParseExprs("Formula", cbFormulas.Text);
                var variables = ParseExprs("Variables", string.Format(CultureInfo.InvariantCulture,
                                                                      "pi={0};tau={1};e={2};phi=1.6180339887498948; {3}", Math.PI, Math.PI * 2, Math.E, cbVariables.Text));
                var ranges  = ParseExprs("Range", cbRanges.Text);
                var varDict = CalculatorCore.ParseVarList(variables);

                // Get display range.
                Size  size = graphPanel.ClientSize;
                LNode xRangeExpr = ranges.TryGet(0, null), yRangeExpr = ranges.TryGet(1, null);
                var   xRange = GraphRange.New("x", xRangeExpr, size.Width, varDict);
                var   yRange = GraphRange.New("y", yRangeExpr ?? xRangeExpr, size.Height, varDict);
                var   zRange = GraphRange.New("z", ranges.TryGet(2, null), 0, varDict);
                yRange.AutoRange = (yRangeExpr == null); // For functions of x only; ignored if y is used

                var calcs = exprs.Select(e => CalculatorCore.New(e, varDict, xRange, yRange)).ToList();

                panelError.Visible = false;

                return(new OutputState(calcs, xRange, yRange, zRange, _prevBitmap));
            } catch (Exception exc) {
                ShowError("(Immediate) {msg}".Localized("msg", exc.Message));
                return(null);
            }
        }
Exemplo n.º 4
0
        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));
        }
    }