Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
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
|
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