UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA PROFESIONAL DE INGENIERÍA INFORMÁTICA Y DE SISTEMAS
“COMPUTACIÓN GRÁFICA I”
DOCENTE:
- HANS HARLEY CCACYAHUILLCA BEJAR
INTEGRANTES:
- Yeferson Supa Cusipaucar 220553
CUSCO - PERÚ
2025
from [Link] import *
from [Link] import *
from [Link] import *
import sys
estado = 0
def init():
glClearColor(1.0, 1.0, 1.0, 1.0) # fondo blanco
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0.0, 400.0, 0.0, 300.0)
def DibujaTriangulo():
glColor3f(0.0, 0.0, 0.0)
glBegin(GL_TRIANGLES)
glVertex2f(0.0, 0.0)
glVertex2f(50.0, 0.0)
glVertex2f(25.0, 50.0)
glEnd()
def display():
global estado
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glPushMatrix() # Guardamos el estado de la matriz actual
# Para centrar el triángulo original, lo movemos a (175, 125)
glTranslatef(175.0, 125.0, 0.0)
if estado == 0:
DibujaTriangulo()
elif estado == 1:
# Escalado desde el centro del triángulo
glTranslatef(25.0, 25.0, 0.0) # mover al centro del
triángulo
glScalef(2.0, 2.0, 1.0)
glTranslatef(-25.0, -25.0, 0.0) # volver al origen
DibujaTriangulo()
elif estado == 2:
# Escalado y rotación desde el centro
glTranslatef(25.0, 25.0, 0.0)
glScalef(2.0, 2.0, 1.0)
glRotatef(30.0, 0.0, 0.0, 1.0)
glTranslatef(-25.0, -25.0, 0.0)
DibujaTriangulo()
elif estado == 3:
# Traslación, rotación, escalado (todo desde el centro)
glTranslatef(80.0, 20.0, 0.0)
glTranslatef(25.0, 25.0, 0.0)
glScalef(2.0, 2.0, 1.0)
glRotatef(30.0, 0.0, 0.0, 1.0)
glTranslatef(-25.0, -25.0, 0.0)
DibujaTriangulo()
glPopMatrix() # Restauramos el estado anterior de la matriz
glFlush()
def timer(value):
global estado
estado = (estado + 1) % 4
glutPostRedisplay()
glutTimerFunc(3000, timer, 0)
def main():
glutInit([Link])
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(400, 300)
glutInitWindowPosition(100, 100)
glutCreateWindow(b"Transformaciones progresivas en triangulo")
init()
glutDisplayFunc(display)
glutTimerFunc(3000, timer, 0)
glutMainLoop()
if __name__ == "__main__":
main()
Consideraciones:
- El código presentado funciona de la siguiente manera se agrupan en tres estados
principales (escalado,rotado y traslado).
- Se usa la librería time, de tal forma que el triángulo cada 3 segundos haga un cambio
de estado.
- El triángulo inicialmente se encontrará en su forma inicial (sin ningún cambio).
Ejecución:
Estado inicial:
Primer estado (escalado):
Segundo estado (rotado):
Tercer estado (traslado):
from [Link] import *
from [Link] import *
from [Link] import *
import sys
estado = 0 # Controla qué transformación se aplica
def init():
glClearColor(1.0, 1.0, 1.0, 1.0) # Fondo blanco
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0.0, 400.0, 0.0, 300.0) # Área de dibujo
def DibujaCuadrado():
# Cuadrado azul centrado en (0,0)
glColor3f(0.0, 0.0, 1.0)
glBegin(GL_QUADS)
glVertex2f(-25.0, -25.0)
glVertex2f(25.0, -25.0)
glVertex2f(25.0, 25.0)
glVertex2f(-25.0, 25.0)
glEnd()
def display():
global estado
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glPushMatrix()
if estado == 0:
# Estado 0: Cuadrado original centrado
glTranslatef(200.0, 150.0, 0.0)
elif estado == 1:
# Estado 1: Solo traslación
glTranslatef(150.0, 100.0, 0.0)
elif estado == 2:
# Estado 2: Traslación + Rotación alrededor del centro del
cuadrado
glTranslatef(150.0, 100.0, 0.0)
glTranslatef(25.0, 25.0, 0.0) # mover al centro del cuadrado
glRotatef(45.0, 0.0, 0.0, 1.0)
glTranslatef(-25.0, -25.0, 0.0) # regresar a la posición original
DibujaCuadrado()
glPopMatrix()
glFlush()
def timer(value):
global estado
if estado < 2:
estado += 1
glutPostRedisplay()
glutTimerFunc(3000, timer, 0) # Cada 3 segundos cambia
def main():
glutInit([Link])
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(400, 300)
glutInitWindowPosition(100, 100)
glutCreateWindow(b"Transformaciones por pasos - Cuadrado")
init()
glutDisplayFunc(display)
glutTimerFunc(3000, timer, 0)
glutMainLoop()
if __name__ == "__main__":
main()
Consideraciones:
- El cuadrado se muestra en un estadio inicial (sin ningún cambio).
- Posteriormente se hace los 2 cambios de estado (traslación y rotación).
- Se incluye la librería time para que el cambio de estado sea cada 3 segundos.
Ejecución
Estadio inicial (sin cambios):
Primer estado (traslación):
Segundo estado (rotación):
from [Link] import *
from [Link] import *
from [Link] import *
import sys
# Ángulo global de rotación
angle = 0.0
def initGL():
glClearColor(0.0, 0.0, 0.0, 1.0) # Fondo negro
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-300, 300, -300, 300, -1.0, 1.0) # Vista ortográfica 2D
glMatrixMode(GL_MODELVIEW)
def drawE():
# Cuerpo vertical de la E
glBegin(GL_QUADS)
glColor3f(0.7, 0.7, 0.7)
glVertex2f(-100, -150)
glVertex2f(-50, -150)
glVertex2f(-50, 150)
glVertex2f(-100, 150)
glEnd()
# Barra superior
glBegin(GL_QUADS)
glVertex2f(-50, 100)
glVertex2f(100, 100)
glVertex2f(100, 150)
glVertex2f(-50, 150)
glEnd()
# Barra del medio
glBegin(GL_QUADS)
glVertex2f(-50, -25)
glVertex2f(75, -25)
glVertex2f(75, 25)
glVertex2f(-50, 25)
glEnd()
# Barra inferior
glBegin(GL_QUADS)
glVertex2f(-50, -150)
glVertex2f(100, -150)
glVertex2f(100, -100)
glVertex2f(-50, -100)
glEnd()
def display():
global angle
glClear(GL_COLOR_BUFFER_BIT)
glLoadIdentity()
# Rotar toda la figura "E"
glPushMatrix()
glTranslatef(0.0, 0.0, 0.0) # Centro de rotación
glRotatef(angle, 0.0, 0.0, 1.0) # Rotar sobre el eje Z
drawE()
glPopMatrix()
glutSwapBuffers()
angle += 0.1 # Incremento de ángulo para animación
def idle():
glutPostRedisplay()
def main():
glutInit([Link])
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(600, 600)
glutInitWindowPosition(100, 100)
glutCreateWindow(b"Rotacion animada de la letra E")
glutDisplayFunc(display)
glutIdleFunc(idle)
initGL()
glutMainLoop()
if __name__ == "__main__":
main()
Consideraciones:
- En primer lugar se dibuja la E formado por rectángulos.
- Aplica una rotación animada en torno al centro de la figura.
- Usa glutIdleFunc para animar constantemente.
Ejecución:
Varias tomas de la animación: