diff --git a/interactions.py b/interactions.py index e5c8084..0e388d4 100644 --- a/interactions.py +++ b/interactions.py @@ -44,11 +44,7 @@ cyc_edge_adj = [ # === interaction parameters === frame_rate = 24 - inductance = 0.001 - -therm_conduct = 0.001 - drain = False drain_rate = 0.1 @@ -59,39 +55,6 @@ current = 30*[0] # === main loop === -def heat_evolution(): - for e, f in cyc_edge_adj: - flow = therm_conduct*(current[e] - current[f]) - current[e] -= flow - current[f] += flow - if drain: - current[v] *= 1 - drain_rate - -def wave_evolution(): - # use verlet integration, first updating the currents and then using the new - # currents to update the charges. - for e in range(30): - u, v = edges[e] - current[e] += inductance*(charge[u] - charge[v]) - for e in range(30): - u, v = edges[e] - charge[u] -= current[e] - charge[v] += current[e] - if drain: - for v in range(12): - charge[v] *= 1 - drain_rate - -def show_data(screen): - energy = 0.5*(sum(q*q for q in charge) + inductance*sum(i*i for i in current)) - text = font.render('energy', True, (255, 255, 255)) - screen.blit(text, (20, viewsize)) - text = font.render(str(energy), True, (255, 255, 255)) - screen.blit(text, (120, viewsize)) - text = font.render('charge[0]', True, (255, 255, 255)) - screen.blit(text, (20, 30 + viewsize)) - text = font.render(str(charge[0]), True, (255, 255, 255)) - screen.blit(text, (120, 30 + viewsize)) - if __name__ == '__main__': # set up display and clock pygame.init() @@ -103,10 +66,6 @@ if __name__ == '__main__': # set up background background = pygame.Surface(screen.get_size()).convert() background.fill((32, 32, 32)) - text = font.render('press [j] or [k] to pluck', True, (255, 255, 255)) - background.blit(text, (340, viewsize)) - text = font.render('hold [space] to drain', True, (255, 255, 255)) - background.blit(text, (340, 30 + viewsize)) to_light = 0 while True: @@ -114,11 +73,11 @@ if __name__ == '__main__': for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_j: + charge[0] += 10 + charge[11] -= 10 + elif event.key == pygame.K_k: charge[0] += 100 charge[11] -= 100 - elif event.key == pygame.K_k: - charge[5] += 100 - charge[7] -= 100 elif event.key == pygame.K_SPACE: drain = True pygame.draw.aaline(screen, (255, 255, 255), (0, 0), (viewsize, viewsize)) @@ -128,11 +87,17 @@ if __name__ == '__main__': elif event.type == pygame.QUIT: quit() - # clear screen + # print data + energy = 0.5*(sum(q*q for q in charge) + inductance*sum(i*i for i in current)) screen.blit(background, (0, 0)) - - # show data - show_data(screen) + text = font.render('energy', True, (255, 255, 255)) + screen.blit(text, (20, viewsize)) + text = font.render(str(energy), True, (255, 255, 255)) + screen.blit(text, (120, viewsize)) + text = font.render('charge[0]', True, (255, 255, 255)) + screen.blit(text, (20, 30 + viewsize)) + text = font.render(str(charge[0]), True, (255, 255, 255)) + screen.blit(text, (120, 30 + viewsize)) # show state for e in range(30): @@ -146,9 +111,19 @@ if __name__ == '__main__': vertices[edges[e][1]], ) - # evolve state - wave_evolution() - ##heat_evolution() + # evolve state. use verlet integration, first updating the currents and then + # using the new currents to update the charges. + for e in range(30): + u, v = edges[e] + ##current[e] *= 1 - resistance + current[e] += inductance*(charge[u] - charge[v]) + for e in range(30): + u, v = edges[e] + charge[u] -= current[e] + charge[v] += current[e] + if drain: + for v in range(12): + charge[v] *= 1 - drain_rate # step pygame.display.flip()