Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links

Gráficos de funciones en 2D

Este código me grafica una función del tipo y=f(x), donde la unica restriccion es que f(x), sea continua en el intervalo [Xmin, Xmax], la función es evaluada en tiempo de ejecución, lo que me permite graficar cualquier tipo de función.

Las siguientes son funciones validas : abs(x), atn(x), arctan(x), cos(x), exp(x), fix(x), int(x), log(x), rnd(x), sgn(x), sin(x), sqr(x), tan(x), min(x), max(x), random(x), mod(x), logn(x), rnd(x), sec(x), cosec(x), cotan(x), arcsin(x), arccos(x), arcsec(x), arccosec(x), arccotan(x), sinh(x), cosh(x), tanh(x).

Ejemplo

Grafica de la funcion f(x)=(100/x2)*sin(10/x), con X min=1.0, X max=3.0 y con N puntos=100.
plot2d.jpg

Código Fuente

El proyecto completo en VisualBasic 5.0 se encuentra en : (plot2d.zip, 6 Kb)

'Ramiro Alcocer
'email : valcoey@hotmail.com
'web   : www.oocities.org/valcoey/index.html
'Este programa grafica una funcion f(x) en 2D
'la novedad es que la funcion es evaluada en tiempo
'de ejecucion, para ello utilizo la clase:
'clsEquation.cls
Option Explicit
'Maxima cantidad de puntos a calcular
Const MaxPuntos = 1000

'para almacenar los valores de la función
Dim valx(1 To MaxPuntos) As Double
Dim valy(1 To MaxPuntos) As Double
'esto es para guardar los valores escalados de
'la función
Dim tmpx(1 To MaxPuntos) As Double
Dim tmpy(1 To MaxPuntos) As Double
Dim Xmin, Xmax, Ymin, Ymax As Double
Dim x1, y1, x2, y2 As Double
Dim NPuntos As Long
'dimenciones del PictureBox
Dim ScreenX, ScreenY As Long

Private objEqu1 As clsEquation
Dim MiString As String


Private Sub Form_Load()
Picture1.ScaleMode = 3
ScreenX = Picture1.ScaleWidth
ScreenY = Picture1.ScaleHeight
Picture1.BackColor = &HFFFFFF
End Sub

'aqui va la función a graficar, la unica restricción es
'que esta función sea continua
'Function f(ByVal X As Double) As Double
'f = (100# / (X * X)) * Sin(10# / X)
'End Function

'Busco el indice del valor máximo de Y (valy(j))
Function PosMaxY() As Long
Dim i, j As Integer
i = 1
j = NPuntos
Do While (i <> j)
    If (valy(i) <= valy(j)) Then
        i = i + 1
    Else
        j = j - 1
    End If
Loop
PosMaxY = i
End Function

'Busco el indice del valor minimo de Y (valy(j))
Function PosMinY() As Long
Dim i, j As Integer
i = 1
j = NPuntos
Do While (i <>> j)
    If (valy(i) >= valy(j)) Then
        i = i + 1
    Else
        j = j - 1
    End If
Loop
PosMinY = i
End Function

'Me cálcula los puntos de la funcion
Private Sub EvaluarFuncion(f As String)
Dim X, deltax As Double
Dim i As Integer

Set objEqu1 = New clsEquation
objEqu1.Equation = f

deltax = (Xmax - Xmin) / (NPuntos - 1)
X = Xmin
For i = 1 To NPuntos
    'esto es similar a valy(i)=f(X), evalua la funcion en
    'tiempo de ejeucion, donde f tiene que ser una funcion
    'continua en el intervalo [xmin, xmax].
    objEqu1.Var("x") = X
    objEqu1.Solve
    valy(i) = objEqu1.Solution
    
    valx(i) = X
    X = X + deltax
Next i
Ymin = valy(PosMinY)
Ymax = valy(PosMaxY)
End Sub

'Escala todos los valores de la función a las dimenciones
'del PictureBox
Private Sub EscalarFuncion()
Dim sx1, sy1, sx2, sy2 As Double
Dim deltax, deltay As Double
Dim i As Integer
sx1 = 15
sx2 = ScreenX - sx1
sy1 = 15
sy2 = ScreenY - sy1
deltax = (sx2 - sx1) / (Xmax - Xmin)
deltay = (sy2 - sy1) / (Ymax - Ymin)
For i = 1 To NPuntos
    tmpx(i) = deltax * (valx(i) - Xmin) + sx1
    tmpy(i) = deltay * (valy(i) - Ymin) + sy1
Next i
x1 = deltax * (Xmin - Xmin) + sx1
x2 = deltax * (Xmax - Xmin) + sx1
y1 = deltay * (Ymin - Ymin) + sy1
y2 = deltay * (Ymax - Ymin) + sy1
End Sub


'Dibujo la función, utilizando rectas para unir los
'puntos y tambien los ejes en color ROJO
Private Sub Plot_Click()
Dim i As Integer
Picture1.Cls
Xmin = Text1.Text
Xmax = Text2.Text
NPuntos = Text3.Text
MiString = Text4.Text
EvaluarFuncion (MiString)
EscalarFuncion
For i = 1 To (NPuntos - 1)
    Picture1.Line (tmpx(i), ScreenY - tmpy(i))-(tmpx(i + 1), ScreenY - tmpy(i + 1)), RGB(0, 0, 255)
Next i
Picture1.Line (x1, y1)-(x2, y1), RGB(255, 0, 0)
Picture1.Line (x2, y1)-(x2, y2), RGB(255, 0, 0)
Picture1.Line (x2, y2)-(x1, y2), RGB(255, 0, 0)
Picture1.Line (x1, y2)-(x1, y1), RGB(255, 0, 0)
End Sub


valcoey@hotmail.com

Ramiro Alcocer, 2001

Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links