EXAMEN PRIMERA UNIDAD:
ESFERA DIMENSIONAL COMPLEJA.
No pude realizar una esfera perfecta, pero tomé un camino algo procedural usando
niveles de triángulos, cada nivel tomando de referencia las medidas del nivel
anterior. No se logra una esfera perfecta sin embargo el resultado se aproxima a lo
pedido, no dibujando todos los triángulos a mano
5 Niveles: 4 Niveles:
3 Niveles:
CÓDIGO FUENTE:
from OpenGL.GL import *
from OpenGL.GLUT import *
import math
h_c = 0.6 # Hipotenusa central (ajustar de 0.1 a 1.0)
nlvl = 4 # Niveles (5 es similar a una esfera)
fp_base = 0.85 # Factor de ponderación base (ajusta el tamaño de los triangulos
circundantes)
def draw_triangle(x1, y1, x2, y2, x3, y3):
glBegin(GL_TRIANGLES)
glVertex2f(x1, y1)
glVertex2f(x2, y2)
glVertex2f(x3, y3)
glEnd()
def draw_sphere():
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1.0, 1.0, 1.0) # Color base (blanco)
ca_c = h_c / math.sqrt(2)
# Colores en array
colores = [
[(1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0), (1.0, 0.5, 0.0)],
[(0.0, 0.5, 1.0), (0.5, 0.0, 1.0), (1.0, 0.0, 0.5), (0.0, 1.0, 0.5)],
[(0.5, 0.8, 0.2), (0.2, 0.8, 0.5), (0.8, 0.2, 0.5), (0.8, 0.5, 0.2)],
[(0.7, 0.3, 0.8), (0.8, 0.7, 0.3), (0.3, 0.8, 0.7), (0.7, 0.8, 0.3)],
]
def draw_level(nivel, vertices_prev):
fp = fp_base ** nivel
ca = ca_c * fp
colores_nivel = colores[nivel % len(colores)]
vertex_now = [] # Vértices actuales
if nivel == 0:
glColor3fv(colores_nivel[0])
draw_triangle(0.0, 0.0, ca, ca, ca, -ca)
glColor3fv(colores_nivel[1])
draw_triangle(0.0, 0.0, -ca, ca, ca, ca)
glColor3fv(colores_nivel[2])
draw_triangle(0.0, 0.0, -ca, -ca, -ca, ca)
glColor3fv(colores_nivel[3])
draw_triangle(0.0, 0.0, ca, -ca, -ca, -ca)
vertex_now = [(ca, ca), (-ca, ca), (-ca, -ca), (ca, -ca)] # Guardado de
vértices
else:
for i in range(0, len(vertices_prev)):
v1x, v1y = vertices_prev[i]
v2x, v2y = vertices_prev[(i + 1) % len(vertices_prev)]
mid_x = (v1x + v2x) / 2
mid_y = (v1y + v2y) / 2
dist = math.sqrt(mid_x ** 2 + mid_y ** 2)
norm_x = mid_x / dist
norm_y = mid_y / dist
nuevo_x = norm_x * (dist + (ca / math.sqrt(2)))
nuevo_y = norm_y * (dist + (ca / math.sqrt(2)))
glColor3fv(colores_nivel[i % len(colores_nivel)])
draw_triangle(v1x, v1y, v2x, v2y, nuevo_x, nuevo_y)
vertex_now.append((v1x, v1y))
vertex_now.append((nuevo_x, nuevo_y))
return ca, vertex_now
vertices = []
for n in range(nlvl):
cateto, vertices = draw_level(n, vertices)
glFlush()
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(500, 500)
glutInitWindowPosition(100, 100)
glutCreateWindow(b"Esfera Dimensional Mas o Menos :(")
glClearColor(0.0, 0.0, 0.0, 1.0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1.5, 1.5, -1.5, 1.5, -1.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glutDisplayFunc(draw_sphere)
glutMainLoop()
if __name__ == "__main__":
main()