def getCoords(self): x, y = self.state.position x0 = x - self.DRAW_SIZE y0 = y - self.DRAW_SIZE x1 = x + self.DRAW_SIZE y1 = y + self.DRAW_SIZE return util.toScreen([x0, y0, x1, y1], CELL_RESOLUTION)
def up(self, pos): if not self.enabled: return for e in self.elements.itervalues(): e.state = "inactive" if (pos[0] > e.x and pos[0] < e.x + e.w and pos[1] > e.y and pos[1] < e.y + e.h) and e.event: event.pub(e.event, None) centered = False for b in self.uni.bodies.itervalues(): sp = util.toScreen(b.position, self.camera) if (sp[0] - pos[0])**2 + (sp[1] - pos[1])**2 < (b.r*self.camera.zoom)**2: self.camera.center(b) centered = True if not centered: self.camera.release()
def setupGraphics(self, canvas): core_corners = util.toScreen(util.circleCorners(self.position, self.radius), CELL_RESOLUTION) outer_corners = util.toScreen(util.circleCorners(self.position, self.maxDistance()), CELL_RESOLUTION) canvas.create_oval(*outer_corners, fill="red") canvas.create_oval(*core_corners, fill="black")
def render(self, uni, ui, draw_orbits = False): draw_orbits = draw_orbits or self.draw_orbits if self.camera.centered: self.camera.position.x = self.camera.centered.position.x self.camera.position.y = self.camera.centered.position.y self.screen.fill(self.colors["black"]) for body in uni.bodies.itervalues(): pygame.draw.circle(self.screen, self.colors[body.color], util.toScreen(body.position, self.camera), int(body.r*self.scale*self.camera.zoom)) if ui.enabled: if draw_orbits: for body in uni.bodies.itervalues(): if not len(body.previous_positions): break positions = [] for pos in body.previous_positions: sp = util.toScreenXy([pos[0], pos[1]], self.camera) positions.append(sp) while len(positions) < 2: positions.append(util.toScreenXy([body.previous_positions[-1][0], body.previous_positions[-1][1]], self.camera)) pygame.draw.lines(self.screen, self.colors["white"], False, positions) for e in ui.elements.itervalues(): if not e.display: continue if isinstance(e, uim.Button): self.screen.blit(e.images[e.state], (e.x, e.y)) elif isinstance(e, uim.Text): self.screen.blit(e.text, (e.x, e.y)) if ui.namesEnabled: for body in uni.bodies.itervalues(): name = self.fonts["names"].render(body.name, 1, (240, 240, 240)) pos = util.toScreen(body.position, self.camera) size = self.fonts["names"].size(body.name) pos[0] -= size[0]/2 pos[1] -= size[1] + body.r*self.camera.zoom*2 self.screen.blit(name, pos) if ui.vectorsEnabled: for body in uni.bodies.itervalues(): pos = util.toScreen(body.position, self.camera) vel = body.velocity.tl() r = 0.003 end = [int(pos[0] + vel[0]*r), int(pos[1] + vel[1]*r)] text = "v = " + str(int(body.velocity.l())) + "m/s" v = self.fonts["names"].render((text), 1, (240, 240, 240)) pos_text = [end[0] - 10, end[1] - 50] pygame.draw.line(self.screen, self.colors["white"], pos, end) pygame.draw.circle(self.screen, self.colors["white"], end, 1) self.screen.blit(v, pos_text) pygame.display.flip()