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

Klein Bottle

Es una superficie con solo una cara, sus ecuaciones parametricas son las siguientes.

r = 4(1 - Cos(u) / 2)
x = 6 Cos(u)(1 + Sin(u)) + r Cos(u)Cos(v)     si 0<= u <Pi
x = 6 Cos(u)(1 + Sin(u)) + r Cos(v + Pi)      si Pi< u <=2 Pi
y = 16 Sin(u) + r Sin(u) Cos(v)               si 0< u <= Pi
y = 16 Sin(u)                                 si Pi< u <=2 Pi
z = r  Sin(v)

donde 0<=u<=2Pi y 0<=v<=2Pi

Esta imagen fue generada por klein.zip (2.435 bytes) con angulos de rotación r1=0, r2=0.9 y r3=0.9

klein.gif

Código Fuente

Option Explicit
Const Pi = 3.141592654
Const Nu = 100
Const Nv = 50

Dim r1, r2, r3 As Double
Dim sr1, sr2, sr3, cr1, cr2, cr3 As Double
Dim x, y, z As Double
Dim sx, sy As Double
Dim MaxX, MaxY As Long
Dim p(0 To Nu, 0 To Nv) As Punto

Sub SinCos()
sr1 = Sin(r1)
sr2 = Sin(r2)
sr3 = Sin(r3)
cr1 = Cos(r1)
cr2 = Cos(r2)
cr3 = Cos(r3)
End Sub

Sub Rotacion3D()
Dim xa, ya, za As Double
x = (-1#) * x
xa = cr1 * x - sr1 * z
za = sr1 * x + cr1 * z
x = cr2 * xa + sr2 * y
ya = cr2 * y - sr2 * xa
z = cr3 * za - sr3 * ya
y = sr3 * za + cr3 * ya
End Sub

Sub Traslacion3D(ByVal mx As Double, ByVal my As Double, ByVal mz As Double)
x = x + mx
y = y + my
z = z + mz
End Sub

Sub Perspectiva()
Dim d As Double
d = 1200
sx = d * x / z
sy = d * y / z
End Sub

Sub Proyeccion()
sx = sx + 0.5 * MaxX
sy = sy + 0.5 * MaxY
End Sub

Sub Klein()
Dim r, u, v As Double
Dim i, j As Integer
Dim escalax, escalay, escalaz As Double

Picture1.Cls
escalax = 3
escalay = 3
escalaz = 3
Call SinCos

j = 0
v = 0
Do While (j <= Nv)
    i = 0
    u = 0
    Do While (i <= Nu)
        r = 4 * (1 - Cos(u) / 2)
        If (u < Pi) Then
            x = 6 * Cos(u) * (1 + Sin(u)) + r * Cos(u) * Cos(v)
            y = 16 * Sin(u) + r * Sin(u) * Cos(v)
        Else
            x = 6 * Cos(u) * (1 + Sin(u)) + r * Cos(v + Pi)
            y = 16 * Sin(u)
        End If
        z = r * Sin(v)
        x = escalax * x
        y = escalay * y
        z = escalaz * z
        Call Rotacion3D
        Call Traslacion3D(0, 0, -350)
        Call Perspectiva
        Call Proyeccion
        p(i, j).x = sx
        p(i, j).y = sy
        u = u + (2 * Pi / Nu)
        i = i + 1
    Loop
v = v + (2 * Pi / Nv)
j = j + 1
Loop
Call DibujarSuperficie
End Sub

Sub DibujarSuperficie()
Dim i, j As Integer
For j = 0 To Nv
    i = 0
    Picture1.PSet (p(i, j).x, p(i, j).y), RGB(40, 40, 40)
    For i = 1 To Nu
        Picture1.Line -(p(i, j).x, p(i, j).y), RGB(40, 40, 40)
    Next i
Next j
For i = 0 To Nu
    j = 0
    Picture1.PSet (p(i, j).x, p(i, j).y), RGB(40, 40, 40)
   For j = 1 To Nv
       Picture1.Line -(p(i, j).x, p(i, j).y), RGB(40, 40, 40)
   Next j
Next i
End Sub



Private Sub Form_Load()
Picture1.ScaleMode = 3
Picture1.BackColor = &HFFFFFF 'color de fondo del PictureBox
MaxX = Picture1.Width
MaxY = Picture1.Height
End Sub

Private Sub cmdEjecutar_Click()
r1 = Val(Text1.Text)
r2 = Val(Text2.Text)
r3 = Val(Text3.Text)
Call Klein
End Sub

Private Sub cmdSalir_Click()
Unload Me
End Sub


valcoey@hotmail.com

Ramiro Alcocer, 2001

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