Descargar

Graficadora de funciones matemáticas en Visual Basic 2005 (página 5)

Enviado por jaimemontoya


Partes: 1, 2, 3, 4, 5, 6

End Sub

End Class

formulariodeinicio.vb

Public Class formulariodeinicio

Private Sub graficar_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles graficar.Click

formularioparagraficar.Show()

Me.Hide()

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

cosfunction.Visible = False

tanfunction.Visible = True

Timer1.Enabled = False

End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick

tanfunction.Visible = False

parabolefunction.Visible = True

Timer2.Enabled = False

End Sub

Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick

parabolefunction.Visible = False

exponentialfunction.Visible = True

Timer3.Enabled = False

End Sub

Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick

exponentialfunction.Visible = False

functionfunction.Visible = True

Timer4.Enabled = False

End Sub

Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick

functionfunction.Visible = False

bienvenido.Visible = True

Timer5.Enabled = False

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

sinfunction.Visible = False

cosfunction.Visible = True

End Sub

End Class

formulariodesalida.vb

Public Class formulariodesalida

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

labelsaliendodelprograma.Visible = False

labelcerrando.Visible = True

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

End

End Sub

End Class

formulariometododelafalsaposicion.vb

Imports System.Text

Imports System.CodeDom.Compiler

Imports System.Collections.Specialized 'Sin esto no funcionaría ninguna instanciación o variable declarada "As New StringCollection()"

Public Class formulariometododelafalsaposicion

Public valora As Double 'Almacenará el valor a introducido por el usuario (valor a en la primera iteración).

Public valorb As Double 'Almacenará el valor b introducido por el usuario (valor b en la primera iteración).

Public valorc As Double 'Almacenará el valor c en la primera iteración.

Public celda(151, 10) As Double

Public Sub encontrarraizconmetodofalsaposicion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles encontrarraizconmetodofalsaposicion.Click

valora = Val(textboxa.Text)

valorb = Val(textboxb.Text)

Dim respuesta As Double 'Almacenará el valor de la respuesta para luego mostrarlo en un textbox al usuario.

Dim i, j As Integer '"i" significará "fila" y "j" significará columna, de modo que se trabajará con (i,j)=(fila,columna)

'Establece cuántas filas y columnas tendrá el Grid.

AxMSFlexGrid1.Rows = 151 'Establece 21 filas.

AxMSFlexGrid1.Cols = 10 'Establece 10 columnas.

'Determina si el usuario puede modificar el ancho de columna

'en tiempo de ejecución

AxMSFlexGrid1.AllowUserResizing = MSFlexGridLib.AllowUserResizeSettings.flexResizeBoth

TextBox1.Text = "" 'Para que no conserve la respuesta de cálculos anteriores.

TextBox2.Text = "" 'Para que no conserve la respuesta de cálculos anteriores.

For j = 1 To 150

celda(j, 0) = j

Next j 'Poner "j" no es necesario, pero tampoco es error de sintaxis.

'Se crea una nueva instancia de la clase Evaluador.

Dim mEval As New Evaluador()

'Se crea una variable tipo string y se le asigna la expresión que se quiere evaluar.

Dim mExpresion As String = textboxfuncion.Text ' = "X".

'Se crea un objeto StringCollection y se le agregan los parámetros de entrada que usará el método eval.

Dim mParameters As New StringCollection()

mParameters.Add("ByVal X as Double")

'Las funciones a utilizar pertenece al espacio de nombres System.Math.

'se hace necesario entonces, crear un objeto StringCollection y agregar

'el namespace System.Math.

Dim mNameSpaces As New StringCollection()

mNameSpaces.Add("System.Math")

'Se invoca el método PrecompilarFunción y se verifica si se generó correctamente el assembly.

If mEval.PrecompilarAssembly(mExpresion, mParameters, mNameSpaces) Then

'Si el assembly se generó correctamente, se crea un array con los valores de los parametros a evaluar.

Dim mParam() = {valora} 'La variable "celda(1, 1)" es la que se le está dando para que la evalúe en la función que introdujo el usuario. Significa que en vez que las "x" introducidas por el usuario, se pondrá el valor de "a" de la iteración 1, que fue precisamente el que el usuario introdujo en el TextBox de a.

'Se invoca el método Evaluar y se asignan los resultados correspondientes.

If Val(textboxa.Text) < Val(textboxb.Text) Then

'Lo primero será limpiar todos los valores para que no quede nada en las celdas de los cálculos que se hayan hecho anteriormente.

For a As Integer = 1 To 150

celda(a, 1) = 0

celda(a, 2) = 0

celda(a, 3) = 0

celda(a, 4) = 0

celda(a, 5) = 0

celda(a, 6) = 0

celda(a, 7) = 0

celda(a, 8) = 0

celda(a, 9) = 0

Next a

celda(1, 1) = valora 'En esa celda se almacenará el valor a introducido por el usuario.

celda(1, 2) = valorb 'En esa celda se almacenará el valor b introducido por el usuario.

celda(1, 3) = mEval.Evaluar(mParam) 'En esta celda se pone el valor del "a" de la primera iteración evaluado en la función.

celda(1, 4) = mEval.Evaluar(valorb) 'Ahora el parámetro que toma la función es valorb, es decir que en la función, siempre que aparezca la letra "x", la va a sustituir por el valor de b introducido por el usuario. En esta celda se pone el valor del "b" de la primera iteración evaluado en la función.

valorc = celda(1, 1) – celda(1, 3) * ((celda(1, 2) – celda(1, 1)) / (celda(1, 4) – celda(1, 3))) 'Aplica la fórmula c=a-f(a)*((b-a)/(f(b)-f(a))) para encontrar el valor de c. Lo que almacene la variable valorc se iría a poner en la celda(1, 5).

celda(1, 5) = valorc

celda(1, 6) = mEval.Evaluar(valorc) 'Aplica la función al valor de c de la primera iteraciónn, contenido en la celda(1, 5).

If (celda(1, 3) * celda(1, 6)) < 0 Then 'Si la multiplicación de f(a) * f(c) da menor que cero, entonces a en la iteración 2 se mantiene y b cambiaría por el valor de c de la iteración 1.

celda(2, 1) = celda(1, 1)

Else 'Si la multiplicación de f(a) * f(c) no da menor que cero, entonces a en la iteración 2 pasa a ser c y b se mantendría igual.

celda(2, 1) = valorc

'.set_TextMatrix(2, 1, Math.Round(celda(1, 5))) 'Si la multiplicación de f(a) * f(c) da mayor que cero, entonces a pasa a ser el c de la iteración 1 y b se mantiene.

End If

If celda(2, 1) = celda(1, 1) Then 'Si a de la iteración 2 es igual al c de la iteración 1, entonces b de la iteración 2 pasará a ser el c de la iteración 1.

celda(2, 2) = celda(1, 5)

Else

celda(2, 2) = celda(1, 2) 'Si la condición no se cumple, b en la segunda iteración sigue conservando el valor que tenía en la iteración 1, pues el a de la iteración 2 sería el que habría cambiado su valor.

End If

celda(2, 3) = mEval.Evaluar(celda(2, 1))

celda(2, 4) = mEval.Evaluar(celda(2, 2))

celda(2, 5) = celda(2, 1) – celda(2, 3) * ((celda(2, 2) – celda(2, 1)) / (celda(2, 4) – celda(2, 3))) 'Aplica la fórmula c=a-f(a)*((b-a)/(f(b)-f(a))) para encontrar el valor de c en la segunda iteración.

celda(2, 6) = mEval.Evaluar(celda(2, 5))

celda(2, 7) = Math.Abs(celda(2, 5) – celda(1, 5))

celda(2, 8) = (celda(2, 7) / celda(2, 5)) * 100

If celda(2, 7) < Val(textboxtolerancia.Text) Then

celda(2, 9) = celda(2, 5)

Else 'De lo contrario que no se imprima nada en la respuesta en esta iteración, porque no se conoce aún la respuesta. Por eso dentro del Else ya no se pone nada, lo que es equivalente a ni siquiera haber escrito esta línea de "Else".

End If

For a As Integer = 3 To 150

If celda(2, 7) < Val(textboxtolerancia.Text) Then

respuesta = celda(2, 9) 'Este valor de respuesta se iría a imprimir en un TextBox como raíz de la función introducida por el usuario.

a = 150

Else

If celda(a, 1) = celda(a – 1, 1) Then

celda(a, 2) = celda(a – 1, 5)

Else

celda(a, 2) = celda(a – 1, 2)

End If

celda(a, 3) = mEval.Evaluar(celda(a, 1))

celda(a, 4) = mEval.Evaluar(celda(a, 2))

celda(a, 5) = celda(a, 1) – celda(a, 3) * ((celda(a, 2) – celda(a, 1)) / (celda(a, 4) – celda(a, 3)))

celda(a, 6) = mEval.Evaluar(celda(a, 5))

celda(a, 7) = Math.Abs(celda(a, 5) – celda(a – 1, 5))

celda(a, 8) = (celda(a, 7) / celda(a, 5)) * 100

If celda(a, 7) < Val(textboxtolerancia.Text) Then

celda(a, 9) = celda(a, 5)

respuesta = celda(a, 9)

a = 150 'Porque si la tolerancia es menor que el error, ya se tiene la respuesta y que se salga inmediatamente del For.

Else

End If

End If

Next a

Else

MsgBox("El punto b debe ser mayor que el punto a.", MsgBoxStyle.OkOnly, "Graficador de Funciones Matemáticas")

End If

Else

MsgBox("Introduzca una función válida.", MsgBoxStyle.OkOnly, "No se ha generado el Assembly")

End If

'Para indicar que se realizarán operaciones con el objeto flxTabla

'sin necesidad de escribir su nombre.

'De aquí en adelante vienen las impresiones de los valores en las celdas correspondientes.

AxMSFlexGrid1.ForeColor = Color.Blue 'Cambia el color de letra de todas las celdas a azul.

With AxMSFlexGrid1 'Para no estar poniendo por ejemplo aXMSFlexGrid1.set_ColWidth(1, 500) y así sucesivamente, no estar repitiendo a cada rato "AxMSFlexGrid1." NOTA: Desde el "With" hasta el "End With" solamente deben estarse mandando a imprimir valores a cada una de las celdas, y no estar haciendo cálculos con condiciones If ni nada de eso dentro del "With", pues todos los cálculos y condiciones deben hacerse afuera y venir a esta sección del "With" única y exclusivamente ha hacer impresiones.

'Establece la alineación del contenido de la columna 0

.set_ColAlignment(0, MSFlexGridLib.AlignmentSettings.flexAlignCenterCenter)

'establece el ancho en pixels de la comumna 1

' .set_ColWidth(1, 1500)

.set_TextMatrix(0, 0, "Iteración")

.set_TextMatrix(0, 1, "a")

.set_TextMatrix(0, 2, "b")

.set_TextMatrix(0, 3, "f(a)")

.set_TextMatrix(0, 4, "f(b)")

.set_TextMatrix(0, 5, "c")

.set_TextMatrix(0, 6, "f(c)")

.set_TextMatrix(0, 7, "Error")

.set_TextMatrix(0, 8, "Error %")

.set_TextMatrix(0, 9, "Respuesta")

For i = 1 To 150

.set_TextMatrix(i, 0, i)

Next i

'Lo primero será imprimir todos los valores inicializados con cero para que no quede nada en las celdas de los cálculos que se hayan hecho anriormente.

For a As Integer = 1 To 150

.set_TextMatrix(a, 1, Math.Round(celda(a, 1), 6))

.set_TextMatrix(a, 2, Math.Round(celda(a, 2), 6))

.set_TextMatrix(a, 3, Math.Round(celda(a, 3), 6))

.set_TextMatrix(a, 4, Math.Round(celda(a, 4), 6))

.set_TextMatrix(a, 5, Math.Round(celda(a, 5), 6))

.set_TextMatrix(a, 6, Math.Round(celda(a, 6), 6))

.set_TextMatrix(a, 7, Math.Round(celda(a, 7), 6))

.set_TextMatrix(a, 8, Math.Round(celda(a, 8), 6))

.set_TextMatrix(a, 9, Math.Round(celda(a, 9), 6))

Next

.set_TextMatrix(1, 1, Math.Round(Val(textboxa.Text), 6)) 'Almacena el valor de a en la primera iteración (con 6 decimales), que sería el valor que el usuario introdujo en el TextBox, pero con 6 cifras significativas, lo cual se programa en el argumento del Math.Round(valorasdouble,digitossignificativosasinteger).

.set_TextMatrix(1, 2, Math.Round(Val(textboxb.Text), 6)) 'Almacena el valor de b en la primera iteración (con 6 decimales), que sería el valor que el usuario introdujo en el TextBox.

.set_TextMatrix(1, 3, Math.Round(celda(1, 3), 6)) 'Almacena el valor de f(a) en la primera iteración (con 6 decimales), que sería el valor de "a" introducido por el usuario, pero evaluado en la función también introducida por el usuario.

.set_TextMatrix(1, 4, Math.Round(celda(1, 4), 6)) 'Almacena el valor de f(b) en la primera iteración (con 6 decimales), que sería el valor de "b" introducido por el usuario, pero evaluado en la función también introducida por el usuario.

.set_TextMatrix(1, 5, Math.Round(celda(1, 5), 6)) 'Almacena el valor de c en la primera iteración (con 6 decimales), que sería el valor obtenido mediante la fórmula: c=a-f(a)*((b-a)/(f(b)-f(a))).

.set_TextMatrix(1, 6, Math.Round(celda(1, 6), 6)) 'Almacena el valor de f(c) en la primera iteración (con 6 decimales).

.set_TextMatrix(2, 1, Math.Round(celda(2, 1), 6)) 'Almacena el valor de a en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 2, Math.Round(celda(2, 2), 6)) 'Almacena el valor de b en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 3, Math.Round(celda(2, 3), 6)) 'Almacena el valor de f(a) en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 4, Math.Round(celda(2, 4), 6)) 'Almacena el valor de f(b) en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 5, Math.Round(celda(2, 5), 6)) 'Almacena el valor de c en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 6, Math.Round(celda(2, 6), 6)) 'Almacena el valor de f(c) en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 7, Math.Round(celda(2, 7), 6)) 'Almacena el valor de Error en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 8, Math.Round(celda(2, 8), 6)) 'Almacena el valor de Error % en la segunda iteración (con 6 decimales).

.set_TextMatrix(2, 9, Math.Round(celda(2, 9), 6)) 'Almacena el valor de Respuesta en la segunda iteración (con 6 decimales).

For a As Integer = 3 To 150

.set_TextMatrix(a, 1, Math.Round(celda(a, 1), 6))

.set_TextMatrix(a, 2, Math.Round(celda(a, 2), 6))

.set_TextMatrix(a, 3, Math.Round(celda(a, 3), 6))

.set_TextMatrix(a, 4, Math.Round(celda(a, 4), 6))

.set_TextMatrix(a, 5, Math.Round(celda(a, 5), 6))

.set_TextMatrix(a, 6, Math.Round(celda(a, 6), 6))

.set_TextMatrix(a, 7, Math.Round(celda(a, 7), 6))

.set_TextMatrix(a, 8, Math.Round(celda(a, 8), 6))

If respuesta <> 0 Then 'Porque si da cero es porque no ha encontrado la respuesta, pues automáticamente la variable toma el valor de cero por haberse declarado como Double, y si no encuentra respuesta, permanece como cero. Por eso la respuesta se ha encontrado sólo cuando respuesta es diferente de cero.

TextBox1.ForeColor = Color.Green 'Para que lo que haya dentro del TextBox1 sea color verde.

TextBox2.ForeColor = Color.Green 'Para que lo que haya dentro del TextBox2 sea color verde.

TextBox1.Text = respuesta

TextBox2.Text = Val(textboxtolerancia.Text)

End If

Next a

End With

End Sub

Private Sub regresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles regresar.Click

formularioparagraficar.Show()

Me.Hide()

End Sub

Private Sub textboxa_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textboxa.KeyPress

If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 45 Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Then

Else

Beep() 'Emite sonido.

e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.

End If

End Sub

Private Sub textboxb_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textboxb.KeyPress

If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 45 Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Then

Else

Beep() 'Emite sonido.

e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.

End If

End Sub

Private Sub textboxtolerancia_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textboxtolerancia.KeyPress

If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Then 'Solamente permite los dígitos del 0 al 9 (ASCII 48-57) y el punto (".") (ASCII 46).

Else

Beep() 'Emite sonido.

e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.

End If

End Sub

End Class

formulariometodonewtonraphson.vb

Imports System.Text

Imports System.CodeDom.Compiler

Imports System.Collections.Specialized 'Sin esto no funcionaría ninguna instanciación o variable declarada "As New StringCollection()"

Public Class formulariometodonewtonraphson

Public valorx0 As Double 'Almacenará el valor Xo introducido por el usuario (valor Xo) en la primera iteración.

Public valorx1 As Double 'Almacenará el valor X1 en la primera iteración.

Public celda(151, 8) As Double 'Establece cuántas filas y columnas tendrá el Grid.

Private Sub encontrarraizconmetodonewtonraphson_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles encontrarraizconmetodonewtonraphson.Click

valorx0 = Val(textboxx0.Text)

Dim respuesta As Double 'Almacenará el valor de la respuesta para luego mostrarlo en un textbox al usuario.

Dim i, j As Integer '"i" significará "fila" y "j" significará columna, de modo que se trabajará con (i,j)=(fila,columna)

'Establece cuántas filas y columnas tendrá el Grid.

AxMSFlexGrid1.Rows = 151 'Establece 21 filas.

AxMSFlexGrid1.Cols = 8 'Establece 8 columnas.

'Determina si el usuario puede modificar el ancho de columna

'en tiempo de ejecución

AxMSFlexGrid1.AllowUserResizing = MSFlexGridLib.AllowUserResizeSettings.flexResizeBoth

TextBox1.Text = "" 'Para que no conserve la respuesta de cálculos anteriores.

TextBox2.Text = "" 'Para que no conserve la respuesta de cálculos anteriores.

For j = 1 To 150

celda(j, 0) = j

Next j 'Poner "j" no es necesario, pero tampoco es error de sintaxis.

'Se crea una nueva instancia de la clase Evaluador.

Dim mEval As New Evaluador()

'Se crea una variable tipo string y se le asigna la expresión que se quiere evaluar.

Dim mExpresion As String = textboxfuncion.Text ' = "X".

'Se crea un objeto StringCollection y se le agregan los parámetros de entrada que usará el método eval.

Dim mParameters As New StringCollection()

mParameters.Add("ByVal X as Double")

'Las funciones a utilizar pertenece al espacio de nombres System.Math.

'se hace necesario entonces, crear un objeto StringCollection y agregar

'el namespace System.Math.

Dim mNameSpaces As New StringCollection()

mNameSpaces.Add("System.Math")

'Se invoca el método PrecompilarFunción y se verifica si se generó correctamente el assembly.

If mEval.PrecompilarAssembly(mExpresion, mParameters, mNameSpaces) Then

'Si el assembly se generó correctamente, se crea un array con los valores de los parametros a evaluar.

Dim mParam() = {valorx0} 'La variable "celda(1, 1)" es la que se le está dando para que la evalúe en la función que introdujo el usuario. Significa que en vez que las "x" introducidas por el usuario, se pondrá el valor de "Xo" de la iteración 1, que fue precisamente el que el usuario introdujo en el TextBox de Xo.

'Se invoca el método Evaluar y se asignan los resultados correspondientes.

'Lo primero será limpiar todos los valores para que no quede nada en las celdas de los cálculos que se hayan hecho anriormente.

For a As Integer = 1 To 150

celda(a, 1) = 0

celda(a, 2) = 0

celda(a, 3) = 0

celda(a, 4) = 0

celda(a, 5) = 0

celda(a, 6) = 0

celda(a, 7) = 0

Next

celda(1, 1) = valorx0 'En esa celda se almacenará el valor Xo introducido por el usuario.

celda(1, 2) = mEval.Evaluar(valorx0) 'Dentro del paréntesis pudo haberse puesto "mParam" o "valorx0" y el resultado es el mismo. El parámetro que toma la función es Xo, es decir que en la función, siempre que aparezca la letra "x", la va a sustituir por el valor de Xo introducido por el usuario. En esta celda se pone el valor del "Xo" de la primera iteración evaluado en la función.

celda(1, 3) = (mEval.Evaluar(valorx0 + 0.000001) – mEval.Evaluar(valorx0)) / 0.000001 'Se le saca la derivada al f(Xo) de la iteración 1. Para sacar la derivada, se utiliza el Teorema de Límites, con la siguiente fórmula: (f(Xo + Deltax) – f(Xo))/Deltax, donde a Deltax se le ha dado el valor de 0.000001. Se recomienda darle entre 0.001 y .000001 a Deltax para que la aproximación de la derivada sea buena.

celda(1, 4) = celda(1, 1) – (celda(1, 2) / celda(1, 3)) 'celda(1, 4) contendrá el valor de X1, el cual se obtiene mediante la fórmula X1=Xo-(f(Xo)/f'(Xo)).

celda(2, 1) = celda(1, 4) 'El Xo de la iteración 2 es el X1 de la iteración 1.

celda(2, 2) = mEval.Evaluar(celda(2, 1)) 'El f(Xo) de la segunda iteración es el valor de la función evaluada en el Xo de la segunda iteración.

celda(2, 3) = (mEval.Evaluar(celda(2, 1) + 0.000001) – mEval.Evaluar(celda(2, 1))) / 0.000001 'Se le saca la derivada al f(Xo) de la iteración 2. Para sacar la derivada, se utiliza el Teorema de Límites, con la siguiente fórmula: (f(Xo + Deltax) – f(Xo))/Deltax, donde a Deltax se le ha dado el valor de 0.000001. Se recomienda que a Deltax se le dé un valor entre 0.001 y 0.000001 para que la aproximación de la derivada sea buena.

celda(2, 4) = celda(2, 1) – (celda(2, 2) / celda(2, 3)) 'celda(2, 4) contendrá el valor del X1 de la segunda iteración, el cual se obtiene mediante la fórmula X1=Xo-(f(Xo)/f'(Xo)).

celda(2, 5) = Math.Abs(celda(2, 4) – celda(1, 4))

celda(2, 6) = Math.Abs((celda(2, 5) / celda(2, 4)) * 100)

If celda(2, 5) < Val(textboxtolerancia.Text) Then

celda(2, 7) = celda(2, 4)

Else 'De lo contrario que no se imprima nada en la respuesta en esta iteración, porque no se conoce aún la respuesta. Por eso dentro del Else ya no se pone nada, lo que es equivalente a ni siquiera haber escrito esta línea de "Else".

End If

For a As Integer = 3 To 150

If celda(2, 5) < Val(textboxtolerancia.Text) Then 'Si esto sucede es porque ya se ha encontrado la respuesta.

respuesta = celda(2, 7) 'Este valor de respuesta se iría a imprimir en un TextBox como raíz de la función introducida por el usuario.

a = 150 'Esto hará que la próxima iteración sea la 151, por lo cual ya no se va a entrar al For, pues ya se ha encontrado la respuesta.

Else

celda(a, 1) = celda(a – 1, 4)

celda(a, 2) = mEval.Evaluar(celda(a, 1))

celda(a, 3) = (mEval.Evaluar(celda(a, 1) + 0.000001) – mEval.Evaluar(celda(a, 1))) / 0.000001

celda(a, 4) = celda(a, 1) – (celda(a, 2) / celda(a, 3))

celda(a, 5) = Math.Abs(celda(a, 4) – celda(a – 1, 4))

celda(a, 6) = Math.Abs((celda(a, 5) / celda(a, 4)) * 100)

If celda(a, 5) < Val(textboxtolerancia.Text) Then

celda(a, 7) = celda(a, 4)

respuesta = celda(a, 7)

a = 150 'Porque si la tolerancia es menor que el error, ya se tiene la respuesta y que ya no vuelva a entrar a una siguiente iteración, pues sería la 151 y el For llega hasta 150.

Else

End If

End If

Next a

Else

MsgBox("Introduzca una función válida.", MsgBoxStyle.OkOnly, "No se ha generado el Assembly")

End If

'Para indicar que se realizarán operaciones con el objeto flxTabla

'sin necesidad de escribir su nombre.

'De aquí en adelante vienen las impresiones de los valores en las celdas correspondientes.

AxMSFlexGrid1.ForeColor = Color.Blue 'Cambia el color de letra de todas las celdas a azul.

With AxMSFlexGrid1 'Para no estar poniendo por ejemplo aXMSFlexGrid1.set_ColWidth(1, 500) y así sucesivamente, no estar repitiendo a cada rato "AxMSFlexGrid1." NOTA: Desde el "With" hasta el "End With" solamente deben estarse mandando a imprimir valores a cada una de las celdas, y no estar haciendo cálculos con condiciones If ni nada de eso dentro del "With", pues todos los cálculos y condiciones deben hacerse afuera y venir a esta sección del "With" única y exclusivamente ha hacer impresiones.

'Establece la alineación del contenido de la columna 0

.set_ColAlignment(0, MSFlexGridLib.AlignmentSettings.flexAlignCenterCenter)

.set_TextMatrix(0, 0, "Iteración")

.set_TextMatrix(0, 1, "Xo")

.set_TextMatrix(0, 2, "f(Xo)")

.set_TextMatrix(0, 3, "f'(Xo)")

.set_TextMatrix(0, 4, "X1")

.set_TextMatrix(0, 5, "Error")

.set_TextMatrix(0, 6, "Error %")

.set_TextMatrix(0, 7, "Respuesta")

For i = 1 To 150

.set_TextMatrix(i, 0, i)

Next i

'Lo primero será imprimir todos los valores inicializados con cero para que no quede nada en las celdas de los cálculos que se hayan hecho anriormente.

For a As Integer = 1 To 150

.set_TextMatrix(a, 1, Math.Round(celda(a, 1), 6))

.set_TextMatrix(a, 2, Math.Round(celda(a, 2), 6))

.set_TextMatrix(a, 3, Math.Round(celda(a, 3), 6))

.set_TextMatrix(a, 4, Math.Round(celda(a, 4), 6))

.set_TextMatrix(a, 5, Math.Round(celda(a, 5), 6))

.set_TextMatrix(a, 6, Math.Round(celda(a, 6), 6))

.set_TextMatrix(a, 7, Math.Round(celda(a, 6), 6))

Next

.set_TextMatrix(1, 1, Math.Round(Val(textboxx0.Text), 6)) 'En vez de "Val(textboxx0.Text) se pudo haber puesto "celda(1, 1)" o bien "valorx0", que son la misma cosa. Almacena el valor de Xo de la primera iteración (con 6 cifras significativas), que sería el valor que el usuario introdujo en el TextBox, pero con 6 cifras significativas, lo cual se programa en el argumento del Math.Round(valorasdouble,digitossignificativosasinteger).

.set_TextMatrix(1, 2, Math.Round(celda(1, 2), 6)) 'Almacena el valor de f(Xo) en la primera iteración (con 6 cifras significativas).

.set_TextMatrix(1, 3, Math.Round(celda(1, 3), 6)) 'Almacena el valor de f'(Xo) en la primera iteración (con 6 cifras significativas).

.set_TextMatrix(1, 4, Math.Round(celda(1, 4), 6)) 'Almacena el valor de X1 en la primera iteración (con 6 cifras significativas).

.set_TextMatrix(2, 1, Math.Round(celda(2, 1), 6)) 'Almacena el valor de Xo de la segunda iteración.

.set_TextMatrix(2, 2, Math.Round(celda(2, 2), 6)) 'Alacena el valor de f(Xo) de la segunda iteración.

.set_TextMatrix(2, 3, Math.Round(celda(2, 3), 6)) 'Alacena el valor de f'(Xo) de la segunda iteración.

.set_TextMatrix(2, 4, Math.Round(celda(2, 4), 6)) 'Alacena el valor de X1 de la segunda iteración.

.set_TextMatrix(2, 5, Math.Round(celda(2, 5), 6)) 'Alacena el valor de Error de la segunda iteración.

.set_TextMatrix(2, 6, Math.Round(celda(2, 6), 6)) 'Alacena el valor de Error % de la segunda iteración.

.set_TextMatrix(2, 7, Math.Round(celda(2, 7), 6)) 'Alacena el valor de Respuesta de la segunda iteración.

For a As Integer = 3 To 150

.set_TextMatrix(a, 1, Math.Round(celda(a, 1), 6))

.set_TextMatrix(a, 2, Math.Round(celda(a, 2), 6))

.set_TextMatrix(a, 3, Math.Round(celda(a, 3), 6))

.set_TextMatrix(a, 4, Math.Round(celda(a, 4), 6))

.set_TextMatrix(a, 5, Math.Round(celda(a, 5), 6))

.set_TextMatrix(a, 6, Math.Round(celda(a, 6), 6))

.set_TextMatrix(a, 7, Math.Round(celda(a, 7), 6))

If respuesta <> 0 Then 'Porque si da cero es porque no ha encontrado la respuesta, pues automáticamente la variable toma el valor de cero por haberse declarado como Double, y si no encuentra respuesta, permanece como cero. Por eso la respuesta se ha encontrado sólo cuando respuesta es diferente de cero.

TextBox1.ForeColor = Color.Green 'Para que lo que haya dentro del TextBox1 sea color verde.

TextBox2.ForeColor = Color.Green 'Para que lo que haya dentro del TextBox2 sea color verde.

TextBox1.Text = respuesta

TextBox2.Text = Val(textboxtolerancia.Text)

End If

Next a

End With

End Sub

Private Sub regresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles regresar.Click

formularioparagraficar.Show()

Me.Hide()

End Sub

Private Sub textboxxo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textboxx0.KeyPress

If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 45 Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Then

Else

Beep() 'Emite sonido.

e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.

End If

End Sub

Private Sub textboxtolerancia_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textboxtolerancia.KeyPress

If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Then 'Solamente permite los dígitos del 0 al 9 (ASCII 48-57) y el punto (".") (ASCII 46).

Else

Beep() 'Emite sonido.

e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.

End If

End Sub

End Class

formularioparagraficar.vb

Imports System.Text

Imports System.CodeDom.Compiler

Imports System.Collections.Specialized

Public Class formularioparagraficar

Public grafico As Graphics

Public xminimo As Double

Public xmaximo As Double

Public yminimo As Double

Public ymaximo As Double

Public coordenaday As Double

Public coordenadaxadaptada As Integer

Public coordenadayadaptada As Integer

Public Sub graficar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles graficar.Click

xminimo = Val(textboxxminimo.Text) 'Variable ya declarada como Public.

xmaximo = Val(textboxxmaximo.Text) 'Variable ya declarada como Public.

yminimo = Val(textboxyminimo.Text) 'Variable ya declarada como Public.

ymaximo = Val(textboxymaximo.Text) 'Variable ya declarada como Public.

Dim cerox As Integer = ((400) / (xmaximo – xminimo)) * (-xminimo) '400 son los pixeles que hay en el eje x. Esos 400 pixeles se dividirán entre el número de unidades que se mostrarán en la escala x y el resultado de eso será multiplicado por -xminimo para que el punto de origen en x se muestre correctamente.

Dim ceroy As Integer = ((400) / (yminimo – ymaximo)) * (-ymaximo) '400 son los pixeles que hay en el eje y. Esos 400 pixeles se dividirán entre el número de unidades que se mostrarán en la escala y y el resultado de eso será multiplicado por -ymaximo para que el punto de origen en y se muestra correctamente

Dim rayadeescala As Integer

grafico = PictureBox1.CreateGraphics

grafico.Clear(Color.Black) 'Para que cada vez que se haga clic en el botón Graficar, que borre el gráfico que estaba anteriormente antes de crear uno nuevo, para que no quede un gráfico sobre otro.

If yminimo < 0 Then 'Porque si la escala mínima negativa de las y fuera cero o fuera positiva, no se verá la línea del eje de las x al graficar. Pero en caso de ser menor que 0, entonces se va a graficar la línea horizontal del eje de las x, que es lo que se programa con la siguiente línea.

grafico.DrawLine(Pens.White, 0, ceroy, 400, ceroy) 'Trazo de la línea blanca horizontal (eje x).

End If

If xmaximo > 0 Then 'Porque si la escala máxima positiva de las x fuera cero o negativa, no se verá la línea del eje de las y al graficar. Pero en caso de que xmaximo sea mayor que cero, sí tiene que verse la línea vertical del eje de las y, que es lo que se programa con la siguiente línea.

grafico.DrawLine(Pens.White, cerox, 0, cerox, 400) 'Trazo de la línea blanca vertical (eje y).

End If

If yminimo < 0 Then 'Porque si la escala mínima de las y fuera cero o fuera positiva, no se verá la línea del eje de las x al graficar, y por lo tanto no se verían las rayitas de las escalas en el eje de las x. Pero en caso de que yminimo fuera menor que cero, sí tendría que verse el eje x y por lo tanto las rayitas de escala en el eje x, y eso es lo que se programa con los dos For que vienen a continuación.

'Este For es para poner las rayitas de escala del eje x positivo.

For a As Integer = 1 To xmaximo 'Al no ponerle Step al For se sabe que va automáticamente de 1 en 1. Se hacen las rayitas del eje x positivo, desde el 0 hasta el valor máximo de la escala de las x. El ciclo va desde uno porque no hace falta ponerlo desde cero, pues una raya en el origen ni siquiera se vería porque estaría ubicada sobre el eje y.

rayadeescala = (((400) / (xmaximo – xminimo)) * (a – xminimo)) 'Esta fórmula es casi la misma que se utilizó para determinar el cerox, con la única diferencia que ahora antes del -xminimo se le antepone la variable a. Sin la a, pondría el punto del origen del eje x. Pero como la a va a ir aumentando de 1 en 1 por el For, eso hará que en cada ciclo se vaya dando un desplazamiento de uno en uno en la escala positiva del eje de las x (y hacia la derecha conforme los ciclos van cambiando), y será esa la ubicación en la que tendrán que imprimirse las rayitas del eje de las x positivo.

grafico.DrawLine(Pens.White, rayadeescala, ceroy – 7, rayadeescala, ceroy + 7) 'Los números 7 significan el número de pixeles de la rayita de la escala tanto hacia abajo como hacia arriba del eje x, de modo que la longitud total de la rayita va a ser de 14 pixeles y por supuesto que va a ser una rayita vertical que cortará perpendicularmente el eje de las x. rayadeescala es la variable que almacena la ubicación en el eje x en la que se pondrá la línea de la rayita, y ceroy más/menos 7 es porque en el ceroy más/menos 7 (que corresponde a la ubicación de la línea horizontal del eje de las x) es donde se van a posicionar las rayitas verticales de la escala.

Next

'Este For es para poner las rayitas de escala del eje x negativo.

For a As Integer = xminimo To 0 Step 1 'Al no ponerle Step al For se sabe que va automáticamente de 1 en 1. Se hacen las rayitas del eje x negativo, desde el valor mínimo en la escala de las x hasta 0.

rayadeescala = (((400) / (xmaximo – xminimo)) * (a – xminimo)) 'Esta fórmula es casi la misma que se utilizó para determinar el cerox, con la única diferencia que ahora antes del -xminimo se le antepone la variable a. Sin la a, pondría el punto del origen del eje x. Pero como la a va a ir aumentando de 1 en 1 por el For, eso hará que en cada ciclo se vaya dando un desplazamiento de uno en uno en la escala negativa del eje de las x (y hacia la derecha conforme los ciclos van cambiando), y será esa la ubicación en la que tendrán que imprimirse las rayitas del eje de las x negavivo.

grafico.DrawLine(Pens.White, rayadeescala, ceroy – 7, rayadeescala, ceroy + 7) 'Los números 7 significan el número de pixeles de la rayita de la escala tanto hacia abajo como hacia arriba del eje x, de modo que la longitud total de la rayita va a ser de 14 pixeles y por supuesto que va a ser una rayita vertical que cortará perpendicularmente el eje de las x. rayadeescala es la variable que almacena la ubicación en el eje x en la que se pondrá la línea de la rayita, y ceroy más/menos 7 es porque en el ceroy más/menos 7 (que corresponde a la ubicación de la línea horizontal del eje de las x) es donde se van a posicionar las rayitas.

Next

End If

If xmaximo > 0 Then 'Porque si la escala máxima positiva de las x fuera cero o fuera negativa, no se verá la línea del eje de las y al graficar, y por lo tanto no se verían las rayitas de las escalas en el eje de las y. Pero en el caso de que xmaximo sea mayor que cero, sí tiene que verse la línea vertical del eje de las y y las rayitas horizontales de las escalas sobre el eje positivo de las y, que es lo que se programa con el siguiente For.

'Este For es para poner las rayitas de escala del eje y positivo.

For a As Integer = 1 To ymaximo 'Se hacen las rayitas del eje y positivo, desde el 0 hasta el valor máximo de la escala de las y. El ciclo va desde uno porque no hace falta ponerlo desde cero, pues una raya en el origen ni siquiera se vería porque estaría ubicada sobre el eje x.

rayadeescala = (((400) / (yminimo – ymaximo)) * (a – ymaximo)) 'Esta fórmula es casi la misma que se utilizó para determinar el ceroy, con la única diferencia que ahora antes del -ymaximo se le antepone la variable a. Sin la a, pondría el punto del origen del eje y. Pero como la a va a ir aumentando de 1 en 1 por el For, eso hará que en cada ciclo se vaya dando un desplazamiento de uno en uno en la escala positiva del eje de las y (y hacia arriba conforme los ciclos van cambiando), y será esa la ubicación en la que tendrán que imprimirse las rayitas del eje de las y positivo.

grafico.DrawLine(Pens.White, cerox – 7, rayadeescala, cerox + 7, rayadeescala) 'Los número 7 significan el número de pixeles de la rayita de la escala tanto hacia la izquierda como hacia la derecha del eje y, de modo que la longitud total de la rayita va a ser de 14 pixeles y porsupuesto que va a ser una rayita horizontal que cortará perpendicularmente el eje de las y. rayadeescala es la variable que almacena la ubicación en el eje y en la que se pondrá la línea de la rayita, y cerox más/menos 7 (que corresponde a la ubicación de la línea vertical del eje de las y) es donde se van a posicionar las rayitas horizontales de la escala.

Next

'Este For es para poner las rayitas de escala del eje y negativo.

For a As Integer = yminimo To 0 'Se hacen las rayitas del eje y negativo, desde el valor mínimo de la escala del eje de las y hasta 0. Al no ponerle Step al For se sabe que va automáticamente de 1 en 1.

rayadeescala = (((400) / (yminimo – ymaximo)) * (a – ymaximo)) 'Esta fórmula es casi la misma que se utilizó para determinar el ceroy, con la única diferencia que ahora antes del -ymaximo se le antepone la variable a. Sin la a, pondría el punto del origen del eje y. Pero como la a va a ir aumentando de 1 en 1 por el For, eso hará que en cada ciclo se vaya dando un desplazamiento de uno en uno en la escala negativa del eje de las y (y hacia arriba conforme los ciclos van cambiando), y será esa la ubicación en la que tendrán que imprimirse las rayitas del eje de las y positivo.

grafico.DrawLine(Pens.White, cerox – 7, rayadeescala, cerox + 7, rayadeescala) 'Los número 7 significan el número de pixeles de la rayita de la escala tanto hacia la izquierda como hacia la derecha del eje y, de modo que la longitud total de la rayita va a ser de 14 pixeles y porsupuesto que va a ser una rayita horizontal que cortará perpendicularmente el eje de las y. rayadeescala es la variable que almacena la ubicación en el eje y en la que se pondrá la línea de la rayita, y cerox más/menos 7 (que corresponde a la ubicación de la línea vertical del eje de las y) es donde se van a posicionar las rayitas horizontales de la escala.

Next

End If

'Se crea una nueva instancia de la clase Evaluador

Dim mEval As New Evaluador()

'Se crea una variable tipo string y se le asigna la expresión que se quiere

Dim mExpresion As String = TextBox1.Text ' = "X"

'Se crea un objeto StringCollection y se agregan los parámetros de entrada que usará el método eval

Dim mParameters As New StringCollection()

mParameters.Add("ByVal X as Double")

'Las funciones a utilizar pertenecen al espacio de nombres System.Math.

'Se hace necesario entonces, crear un objeto StringCollection y agregar

'el namespace System.Math.

Dim mNameSpaces As New StringCollection()

mNameSpaces.Add("System.Math")

'Se invoca el método PrecompilarFunción y se verifica si se generó correctamente el assembly.

If mEval.PrecompilarAssembly(mExpresion, mParameters, mNameSpaces) Then

'Si el assembly se generó correctamente, se crea un array con los valores de los parametros a evaluar.

'Hasta este momento se tiene el plano cartesiano con las rayitas de las escalas correspondientes. De aquí en adelante el código es para graficar la función.

For coordenadax As Double = xminimo To xmaximo Step 0.001 'Por ejemplo, si el usuario puso en la escala x desde -5 hasta 5, entonces con un Step de 0.01 el For iría así: -5, -4.99, -4.98, -4.97,…0, 0.01, 0.02, 0.03,…4.97, 4.98, 4.99,5. NOTA: Si el Step se pone de 0.01, se graficarán menos puntos y dependiendo de la función, podrían verse puntos separados. Si se pone el Step de 0.001, habrían muchas más iteraciones, pero más nitidez en la gráfica. Si se pone de 0.0001, hasta se vería el trazado, pues iría mucho más lento por ser damasiadas iteraciones, pero mucha mayor nitidez en las gráficas. Así sucesivamente. Si fuera con 0.0001 y la escala fuera de -5 a 5, iría la iteración 1 del For con -5, la iteración 2 con -4.9999, la 3 con -4.9998,… hasta llegar a 5.

Dim mParam() = {coordenadax} 'la variable "coordenadax" es la que se le está dando para que la evalúe en la función que introdujo el usuario. Significa que en vez que las "x" escritas por el usuario al introducir la función, se pondrá el valor de la variable "coordenadax", que irá del valor mínimo de la escala de x hasta el valor máximo de la escala de x, con un incremento de 0.001 en 0.001, de acuerdo a como se ha programado en este For.

'Se invoca el método Evaluar y se muestra el resultado

coordenaday = mEval.Evaluar(mParam) 'El valor de x que se está trabajando en la iteración que corresponda (almacenado en la variable coordenadax ó mParam), se evalúa en la función que el usuario introdujo. Eso dará el valor de y, de modo que ya se tendrá un par coordenado (x, y), que será el que se va a graficar. Esto mismo se hará durante cada una de las iteraciones, de manera que el gráfico de muchos puntos continuos (x, y) darán origen al gráfico, tal como se haría al graficar en papel, que se hace una tabla con varios puntos y esos puntos seguiditos son los que generan la gráfica.

coordenadaxadaptada = (((400) / (xmaximo – xminimo)) * (coordenadax – xminimo)) 'Esta fórmula es casi la misma que se utilizó para determinar el cerox, con la única diferencia que ahora antes del -xminimo se le antepone la variable coordenadax. Sin la coordenadax antepuesta, pondría el punto del origen del eje x. Pero como la xmaximo estará ahí, va a ir modificando o cambiando el punto de coordenada en el eje x poco a poco dentro del For, para ir cubriendo los 400 pixeles que tiene de longitud el eje x. Entre menor sea el Step del For, más iteraciones habrán y más lentamente se irá desplazando en el eje x de izquierda a derecha, desde el borde izquierdo del PictureBox hasta el borde derecho en el eje x, junto con lo que corresponda en coordenadaadaptaday. Así es como se irá graficando. En pocas palabras, los 400 pixeles del eje x se dividen entre el número de iteraciones y ahí va saliendo cada puntito en el que habrá que graficar.

coordenadayadaptada = (((400) / (yminimo – ymaximo)) * (coordenaday – ymaximo)) 'Esta fórmula es casi la misma que se utilizó para determinar el ceroy, con la única diferencia que ahora antes del -ymaximo se le antepone la variable coordenaday. Sin la coordenaday antepuesta, pondría el punto del origen del eje y. Pero como la ymaximo estará ahí, va a ir modificando o cambiando el punto de coordenada en el eje y poco a poco dentro del For, para ir cubriendo los 400 pixeles que tiene de longitud el eje y. Entre menor sea el Step del For, más iteraciones habrán y más lentamente se irá desplazando en el eje y de abajo hacia arriba o de arriba hacia abajo en el PictureBox, dependiendo del comportamiento de la función, junto con lo que corresponda en coordenadaadaptadx. Así es como se irá graficando. Dependiendo de las escalas xminimo, xmaximo, yminimo y ymaximo, algunos puntos o valores en el eje y que resulten de la fórmula programada en esta línea, podrían no verse en el TextBox. Por ejemplo, si la función es "f(x)=x^(2)" y el usuario elije xminimo=-5, xmaximo=5, yminimo-5 y ymaximo=5; cuando xminimo valga -5, f(xminimo) valdrá 25 porque x*x=25, entonces la fórmula "(((400) / (yminimo – ymaximo)) * (coordenaday – ymaximo))" dará como coordenadaadaptaday el valor de -800, lo cual no se vería en el PictureBox, pues el punto(0,0) del PictureBox está en la parte superior izquierda del PictureBox, y los positivos van hacia abajo y los negativos hacia arriba, de manera que el -800 estaría 800 pixeles arriba de la esquina superior izquierda del PictureBox, y por eso no se vería. Pero luego cuando estuviera evaluando el coordenadax=-2, coordenaday=4 para la función "f(x)=x^(2)", entonces al meter el 4 de coordenaday en la fórmula "coordenadayadaptada = (((400) / (yminimo – ymaximo)) * (coordenaday – ymaximo))", coordenadaadaptaday toma un valor de 40, entonces a partir de la esquina superior izquierda del PictureBox se cuentan 40 pixeles hacia abajo, y ese es el punto de coordenadaadaptaday, que junto con lo que se tenga de coordenadaadaptadax, será el punto que se va a imprimir en pantalla como parte del gráfico de la función.

Partes: 1, 2, 3, 4, 5, 6
 Página anterior Volver al principio del trabajoPágina siguiente