public Funcion2D(string expresionY, Intervalo intervalo, uint puntosPorUnidad, Color color, float grosor, string nombre, bool dibujar, bool autoCalcularPuntos, ICalculadora calculadora, MetodoCalculoDelegate metodoCalculo) : base() { base.puntos = null; base.colorLinea = color; base.grosor = grosor; base.dib = dibujar; base.nom = nombre; ecuX = "x"; ecuY = expresionY; interv = intervalo; this.prof = puntosPorUnidad; calc = calculadora; metodo = metodoCalculo; if (autoCalcularPuntos) CalcularPuntos(metodo); }
public void MostrarAgregarFuncionForm(string funcionX, string funcionY, Color color, Intervalo interv) { Agregar2Form agregar = new Agregar2Form(this); agregar.colorPanel.BackColor = color; agregar.funcionXTextBox.Text = funcionX; agregar.funcionYTextBox.Text = funcionY; agregar.intervaloIniTextBox.Text = interv.Inicio.ToString(); agregar.intervaloFinTextBox.Text = interv.Fin.ToString(); DialogResult res = agregar.ShowDialog(); if (res == System.Windows.Forms.DialogResult.OK) { ICalculadora calc = padre.ObtenerCalculadoraDelUsuario(); AgregarFuncion(agregar.FuncionCreada); } }
private void aceptarButton_Click(object sender, EventArgs e) { #if muParser int i = 0; int j = 0; if (Int32.TryParse(intervaloIniTextBox.Text, out i) && Int32.TryParse(intervaloFinTextBox.Text, out j) && j > i) { Graficas2D.Control.muParser.Parser parser = new Graficas2D.Control.muParser.Parser(); Exception error = null; try { parser.SetDecSep('.'); // default: "." parser.SetArgSep(','); // default: "," parser.DefineVar("t", new Graficas2D.Control.muParser.ParserVariable(200.5)); parser.DefineVar("x", new Graficas2D.Control.muParser.ParserVariable(200.5)); parser.SetExpr(funcionXTextBox.Text); parser.Eval(); } catch (Exception ex) { error = ex; this.DialogResult = System.Windows.Forms.DialogResult.Abort; } if (error == null) { error = null; try { parser.SetDecSep('.'); // default: "." parser.SetArgSep(','); // default: "," parser.DefineVar("t", new Graficas2D.Control.muParser.ParserVariable(200.5)); parser.DefineVar("x", new Graficas2D.Control.muParser.ParserVariable(200.5)); parser.SetExpr(funcionXTextBox.Text); parser.Eval(); } catch (Exception ex) { error = ex; this.DialogResult = System.Windows.Forms.DialogResult.Abort; } if (error == null) { color = colorPanel.BackColor; interv = new Intervalo(i, j); ecuX = funcionXTextBox.Text; ecuY = funcionYTextBox.Text; this.DialogResult = System.Windows.Forms.DialogResult.OK; } else { MessageBox.Show(error.Message.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); this.DialogResult = System.Windows.Forms.DialogResult.Abort; } } else { MessageBox.Show(error.Message.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); this.DialogResult = System.Windows.Forms.DialogResult.Abort; } } else { MessageBox.Show("Los intervalos no están en el formato correcto.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); this.DialogResult = System.Windows.Forms.DialogResult.Abort; } #else float i = 0; float f = 0; ICalculadora calc = formGrafica.Padre.ObtenerCalculadoraDelUsuario(); if (calc.ComprobarValidez(intervaloIniTextBox.Text) && calc.ComprobarValidez(intervaloFinTextBox.Text)) { i = (float)calc.EvaluarExpresion(intervaloIniTextBox.Text); f = (float)calc.EvaluarExpresion(intervaloFinTextBox.Text); if (f >= i) { try { calc.EvaluarExpresion(funcionXTextBox.Text); calc.EvaluarExpresion(funcionYTextBox.Text); funcionFinal = new Funcion2D(funcionXTextBox.Text, funcionYTextBox.Text, new Intervalo(i, f), 20, colorPanel.BackColor, (float)grosorNumericUpDown.Value, "x= " + funcionXTextBox.Text + (checkBox1.Checked ? "; y'= " : "; y= ") + funcionYTextBox.Text, true, true, formGrafica.Padre.ObtenerCalculadoraDelUsuario(), checkBox1.Checked ? new Control.MetodoCalculoDelegate(Funcion2D.ObtenerPuntos.DerivadaT) : new Control.MetodoCalculoDelegate(Funcion2D.ObtenerPuntos.Normal)); this.DialogResult = System.Windows.Forms.DialogResult.OK; } catch (Exception ex) { MessageBox.Show(ex.Message.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("El valor de inicio no puede ser mayor que el valor final.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("Las expresiones del intervalo no son correctas.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } #endif }
public static PointF[] Normal(ICalculadora calc, string expresionX, string expresionY, Intervalo intervalo, uint puntosPorUnidad) { PointF[] puntos; int numtotal = ((int)Math.Round((Math.Abs(intervalo.Fin - intervalo.Inicio) * puntosPorUnidad),0, MidpointRounding.AwayFromZero) + 1); try { puntos = new PointF[numtotal]; for (int k = 0; k < calc.Variables.Count; k++) { calc.Variables[calc.Variables.Keys[k]] = intervalo.Inicio; } for (int i = 0; i < puntos.Length; i++) { puntos[i].X = (float)calc.EvaluarExpresion(expresionX); puntos[i].Y = (float)calc.EvaluarExpresion(expresionY); float a = 1f / (float)(puntosPorUnidad); for (int j = 0; j < calc.Variables.Count; j++) { calc.Variables[calc.Variables.Keys[j]] += a; } } return puntos; } catch (Exception ex) { throw ex; //PointF[] po = new PointF[]{PointF.Empty}; //return po; } }
/// <summary> /// Genera un MetodoCalculoDelegate que hace derivadas de la variable deseada. El delegado encapsula un método anónimo por lo que el rendimiento se puede ver deteriorado. Es preferible crear un método propio en vez de usar este. /// </summary> /// <param name="calc">Calculadora que se va a utilizar</param> /// <param name="expresionX">Expresion para PointF.X</param> /// <param name="expresionY">Expresion para PointF.Y</param> /// <param name="variableADerivar">Identificador de la variable a Derivar (Debe estar ya definida en la Calculadora)</param> /// <param name="intervalo">Intervalo de Cálculo</param> /// <param name="puntosPorUnidad">Puntos a calcular por unidad</param> /// <returns>MetodoCalculoDelegate</returns> public static MetodoCalculoDelegate GenerarMetodoDerivada(ICalculadora calc, string expresionX, string expresionY, string variableADerivar, Intervalo intervalo, uint puntosPorUnidad) { return delegate(ICalculadora calcu, string expresX, string expresY, Intervalo interv, uint PPU) { PointF[] puntos; try { puntos = new PointF[(int)Math.Round((Math.Abs(intervalo.Fin - intervalo.Inicio) * puntosPorUnidad), 0, MidpointRounding.AwayFromZero)]; for (int k = 0; k < calc.Variables.Count; k++) { calc.Variables[calc.Variables.Keys[k]] = intervalo.Inicio; } for (int i = 0; i < puntos.Length; i++) { puntos[i].X = (float)calc.EvaluarExpresion(expresionX); puntos[i].Y = (float)calc.EvaluarDerivada1(expresionY, variableADerivar); float a = 1f / (float)(puntosPorUnidad); for (int j = 0; j < calc.Variables.Count; j++) { calc.Variables[calc.Variables.Keys[j]] += a; } } return puntos; } catch (Exception ex) { throw ex; //PointF[] po = new PointF[]{PointF.Empty}; //return po; } }; }