def main(): pygame.init() pygame.display.set_caption("Quad Tree Visualisation - Bit-Sahil04") width, height = RESOLUTION clock = pygame.time.Clock() win.fill(BG_COLOR) quad_tree = Quad.Quad((0, 0, width, height), 1) points = set() lmb = False rmb = False spawn_point_count = 4 while True: win.fill(BG_COLOR) for e in pygame.event.get(): if e.type == pygame.QUIT: exit() if pygame.mouse.get_pressed(3)[0] and not lmb: lmb = True rp = pygame.mouse.get_pos() # generate random velocity of point except 0 for i in range(spawn_point_count): p = Point(3, rp, (random.randint(-1, 2) or 1, random.randint(-1, 2) or 1)) p.quadrant = quad_tree.insert_point(p) points.add(p) else: lmb = False if pygame.mouse.get_pressed(3)[2]: rmb = True for i in points: mx, my = pygame.mouse.get_pos() dx = 0 + ((mx - i.pos[0]) / abs(mx - i.pos[0] or 1)) dy = 0 + ((my - i.pos[1]) / abs(mx - i.pos[0] or 1)) i.dv = (dx, dy) else: rmb = False for num, i in enumerate(points): i.update(quad_tree) pygame.draw.circle(win, POINT_COLOR, i.pos, i.radius) show_text(f"{1000 / clock.tick(60) :.0f}", 100, 20, win, size=15) show_text(f"{(len(points))}", 100, 40, win, size=15) redraw_quads(win, quad_tree) pygame.display.flip()
def updateFunc(pvec, t, dt): acc = lambda x1, x2, m: -G * m * (x1 - x2) / (Vector.magnitude(x1 - x2)**( 3) + Vector.magnitude(x1 - x2) * a**2) pquad = Quad(2 * maxDist(pvec), Vector([0, 0]), pvec) quad = createTree(pquad) quadlist.append(quad) retvec = Vector([pvec[0]] * len(pvec)) for p in pvec: force = Vector([0, 0]) qlist = [] quad.subqlist(qlist) index = 0 while index < len(qlist): acc = lambda x1, x2, m: -G * m * (x1 - x2) / (Vector.magnitude( x1 - x2)**(3) + Vector.magnitude(x1 - x2) * a**2) if len(qlist[index].pList) == 0: index += 1 elif len(qlist[index].pList) == 1: try: force += acc(p.pos, qlist[index].pList[0].pos, qlist[index].mass) except ZeroDivisionError: force += Vector([0, 0]) index += 1 else: if qlist[index].len / Vector.magnitude( p.pos - qlist[index].com) < theta: if p.inQuad(qlist[index]): q = qlist[index] force += acc(p.pos, q.com - p.mass * p.pos / q.mass, q.mass - p.mass) else: force += acc(p.pos, qlist[index].com, qlist[index].mass) index += qlist[index].numQBelow() else: index += 1 retvec[pvec.index(p)] = Particle(p.mass, p.vel + dt * force, force) return retvec
# Instruccion actual, se actualiza al declarar una figura a dibujar. instr_actual = "" # Num args, el numero de argumentos en la llamada de funcion num_args = 0 # Asignacion es expresion o input asig_input = False # Tabla Semantica para Resolver el tipo de una operacion tabla_semantica = tb.TablaSemantica() # Pila de operadores. pila_operadores = [] # Pila de operandos. pila_operandos = [] # Pila de Saltos pila_saltos = [] # Estructura para genera quadruplos quads = q.Quad() # Pila de variables dimensionadas para tener casos A[B[C[1]]] var_dim = [] # Cantidad de direcciones para cada tipo dirBase, entero, flotante, tmp, ptr, cte. mapa = gd.GeneradorDireccion(5000, 1000, 1000, 1000, 500, 500) # Tabla de constantes tabla_constantes = {} # DEFINICION DE LAS REGLAS DE LA GRAMATICA def p_programa(p): '''programa : MODULE CTE_STR creaDirFunc PUNTCOM ajustes var_func tipo_main MAIN actualiza_id crea_func bloque_func''' # Funcion para rellenar el goto del modulo main. def p_tipo_main(p):
def __init__(self, P): sf.Drawable.__init__(self) self.quad = Quad() self.shader = Shader(P) self.states = sf.RenderStates(shader=self.shader)