-
Notifications
You must be signed in to change notification settings - Fork 0
/
CC3501Utils.py
executable file
·152 lines (108 loc) · 3.68 KB
/
CC3501Utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#####################################################################
# CC3501-1 : funciones y clases para usar pygame y opengl
#####################################################################
from math import *
import pygame
from OpenGL.GL import *
from OpenGL.GLU import *
from pygame.locals import *
# funcion para inicializar pygame y opengl en 2D
def init(ancho, alto, titulo):
# inicializar pygame
pygame.init()
pygame.display.set_mode((ancho, alto), OPENGL | DOUBLEBUF)
pygame.display.set_caption(titulo)
# inicializar opengl
glViewport(0, 0, ancho, alto)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0.0, ancho, 0.0, alto)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# definir variables de opengl
glClearColor(0.0, 0.0, 0.0, 0.0) # color del fondo
glShadeModel(GL_SMOOTH)
glClearDepth(1.0)
# glDisable(GL_DEPTH_TEST)
return
# Clase para representar vectores en un espacio 2D
class Vector:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
# angulo con respecto al eje X
def angulo(self):
if self.x != 0:
return atan2(self.y, self.x)
else:
if self.y > 0:
return pi / 2.0
else:
return -pi / 2.0
def modulo(self):
return (self.x ** 2 + self.y ** 2) ** 0.5
def polares(self):
return self.modulo(), self.angulo()
def cartesianas(self):
return self.x, self.y
# ------------------------ definicion de operaciones primitivas +-*/ -----------------------------
# suma vectores
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
# resta vectores
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
# multiplicacion por numero, pondera
def __mul__(self, a: (float, int)):
return Vector(self.x * a, self.y * a)
# division por numero, pondera
def __truediv__(self, a: (float, int)):
return Vector(self.x / a, self.y / a)
def __str__(self):
return "Vector(" + str(self.x) + "," + str(self.y) + ")"
# vector en coordenadas polares
class VectorPolar(Vector):
def __init__(self, radio, ang):
super().__init__(radio * cos(ang), radio * sin(ang))
def sumar(v1: Vector, v2: Vector):
return v1 + v2
def restar(v1: Vector, v2: Vector):
return v1 - v2
def ponderar(a: float, v: Vector):
return v * a
def normalizar(v: Vector):
m = v.modulo()
if m > 0:
return v / m
else:
return v
def angulo(v1: Vector, v2: Vector):
return v1.angulo() - v2.angulo()
def rotar(v: Vector, a: float):
return VectorPolar(v.modulo(), v.angulo() + a)
def distancia(v1: Vector, v2: Vector):
return (v1 - v2).modulo()
def punto(v1: Vector, v2: Vector):
return v1.x * v2.x + v1.y * v2.y
# Clase generica para crear figuras de openGL con posicion y color.
# se usa self.dibujar() para dibujar en la escena.
# self.figura define las primitivas que tiene.
class Figura:
def __init__(self, pos: Vector, rgb=(1.0, 1.0, 1.0)):
self.pos = pos
self.color = rgb
self.lista = 0
self.crear()
def crear(self):
self.lista = glGenLists(1)
glNewList(self.lista, GL_COMPILE)
self.figura()
glEndList()
def dibujar(self):
glPushMatrix()
glColor3fv(self.color)
glTranslatef(self.pos.x, self.pos.y, 0.0)
glCallList(self.lista)
glPopMatrix()
def figura(self):
pass