import sys, random, time, math from OpenGL.GLUT import * from OpenGL.GL import * from OpenGL.GLU import * class Triangle: def __init__(self, x, y): self.x = x self.y = y self.rgb = [random.uniform(0,1), random.uniform(0,1), random.uniform(0,1)] self.angle = 0 def update(self, t, dt): self.angle = self.angle + 360 * dt def draw(self): glPushMatrix() glTranslatef(self.x,self.y,0) glRotatef(self.angle, 0, 0, 1) glColor3fv(self.rgb) glBegin(GL_TRIANGLES) glVertex2f(-0.1, -0.1) glVertex2f(0.1, -0.1) glVertex2f(0, 0.1) glEnd() glPopMatrix() triangles = [] def draw(): glClearColor(0,0,0,0) glClear(GL_COLOR_BUFFER_BIT) for t in triangles: t.draw() glutSwapBuffers() def keyboard(key, x, y): if key == chr(27): sys.exit(0) prevTime = 0 def update(v): global prevTime glutTimerFunc(16, update, 0) currentTime = time.time() if prevTime == 0: dt = 0 else: dt = currentTime - prevTime prevTime = currentTime for t in triangles: t.update(currentTime, dt) glutPostRedisplay() def mouseFunc(button, state, mx, my): if state == GLUT_DOWN: makeTriangle(mx,my) def mouseMotion(mx,my): makeTriangle(mx,my) def makeTriangle(mx,my): global triangles x = mx / float(glutGet(GLUT_WINDOW_WIDTH)) * 2.0 - 1.0 y = -(my / float(glutGet(GLUT_WINDOW_HEIGHT)) * 2.0 - 1.0) triangles.append(Triangle(x,y)) if len(triangles) > 20: triangles.remove(triangles[0]) glutInit([]) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutInitWindowSize(1000, 700) glutInitWindowPosition(0,0) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutMouseFunc(mouseFunc) glutMotionFunc(mouseMotion) glutKeyboardFunc(keyboard) glutTimerFunc(0, update, 0) glutMainLoop()