def draw_paths(self): if self.path: # copied from the box_world egi.set_stroke(2) # Show open edges route = self.path.route egi.set_pen_color(name='GREEN') for i in self.path.open: egi.circle(self.world.boxes[i]._vc, 10) # show the partial paths considered egi.set_pen_color(name='ORANGE') egi.set_stroke(2) for i, j in route.items(): egi.line_by_pos(self.world.boxes[i]._vc, self.world.boxes[j]._vc) egi.set_stroke(1) # show the final path delivered egi.set_pen_color(name='RED') egi.set_stroke(2) path = self.path.path for i in range(1, len(path)): egi.line_by_pos(self.world.boxes[path[i - 1]]._vc, self.world.boxes[path[i]]._vc) egi.set_stroke(1)
def hide(self, hunter): DistToClosest = float('inf') BestHidingSpot = Vector2D() to_target = hunter.pos - self.pos panic_range = 60 dist = to_target.length() if dist < panic_range: self.visible = False for obst in self.world.obstacle: hidingSpot = self.GetHidingPosition(hunter.pos, obst) hidingDist = Vector2D.distance_sq( hidingSpot, self.pos ) #change to self.pos for closest obst search, and change vector to positive egi.cross(hidingSpot, 4) if hidingDist < DistToClosest: DistToClosest = hidingDist BestHidingSpot = hidingSpot if BestHidingSpot: egi.line_by_pos(hunter.pos, BestHidingSpot) return self.arrive(BestHidingSpot, 'fast') return self.flee(hunter.pos)
def drawEye(self, color=None): eyePosition = self.renderPosition + self.side * self.body * -8 - self.heading * 20 eyeRadius = self.body * 0.8 if(self.awake): egi.circle(eyePosition, eyeRadius) else: egi.line_by_pos(eyePosition, eyePosition + self.heading * eyeRadius * 2)
def wallSteer(self, delta): wallForce = self.wallAvoidance(self.world.tank.getWalls('vertical')) * 2 if(self.chosenOne and self.world.drawDebug): egi.red_pen() egi.line_by_pos(self.pos, self.pos + wallForce * 5) return wallForce
def hidingSteer(self, delta, closest=True): hiding = self.hide(hunters=self.world.hunters, obstacles=self.world.obstacles, closest=closest) if(self.chosenOne and self.world.drawDebug): egi.red_pen() egi.line_by_pos(self.pos, self.pos + hiding * 5) return hiding
def render(self): self.drawWaves() self.drawWalls() egi.set_stroke(1) if(self.world.drawDebug): for wall in self.walls: egi.line_by_pos(wall.center, wall.center + wall.normal * 100)
def drawEye(self, color=None): eyePosition = self.renderPosition + self.side * self.body * -8 - self.heading * 20 eyeRadius = self.body * 0.8 if (self.awake): egi.circle(eyePosition, eyeRadius) else: egi.line_by_pos(eyePosition, eyePosition + self.heading * eyeRadius * 2)
def wallSteer(self, delta): wallForce = self.wallAvoidance( self.world.tank.getWalls('vertical')) * 2 if (self.chosenOne and self.world.drawDebug): egi.red_pen() egi.line_by_pos(self.pos, self.pos + wallForce * 5) return wallForce
def render(self): self.drawWaves() self.drawWalls() egi.set_stroke(1) if (self.world.drawDebug): for wall in self.walls: egi.line_by_pos(wall.center, wall.center + wall.normal * 100)
def hidingSteer(self, delta, closest=True): hiding = self.hide(hunters=self.world.hunters, obstacles=self.world.obstacles, closest=closest) if (self.chosenOne and self.world.drawDebug): egi.red_pen() egi.line_by_pos(self.pos, self.pos + hiding * 5) return hiding
def patrolSteer(self, delta): wanderForce = self.wander(delta) * self.state.wanderInfluence netForce = wanderForce if (self.chosenOne and self.world.drawDebug): egi.blue_pen() egi.line_by_pos(self.pos, self.pos + wanderForce * 5) egi.orange_pen() egi.line_by_pos(self.pos, self.pos + netForce * 5) return netForce
def patrolSteer(self, delta): wanderForce = self.wander(delta) * self.state.wanderInfluence netForce = wanderForce if(self.chosenOne and self.world.drawDebug): egi.blue_pen() egi.line_by_pos(self.pos, self.pos + wanderForce * 5) egi.orange_pen() egi.line_by_pos(self.pos, self.pos + netForce * 5) return netForce
def foodSteer(self, delta): steeringForce = Vector2D() bestFood = self.findBestFood(self.food) if (bestFood is not None): steeringForce = self.pursuit(bestFood) # else: # steeringForce = self.idleSteer(delta) if (self.chosenOne and self.world.drawDebug): egi.orange_pen() egi.line_by_pos(self.pos, self.pos + steeringForce) return steeringForce
def foodSteer(self, delta): steeringForce = Vector2D() bestFood = self.findBestFood(self.food) if(bestFood is not None): steeringForce = self.pursuit(bestFood) # else: # steeringForce = self.idleSteer(delta) if(self.chosenOne and self.world.drawDebug): egi.orange_pen() egi.line_by_pos(self.pos, self.pos + steeringForce) return steeringForce
def survivalSteer(self, delta): avoidHunters, hunterDist = self.avoidHuntersSteer(delta) # avoidHunters * hideForce = self.hidingSteer(delta) / (hunterDist / 20000) / ( avoidHunters.length() / 100) steer = avoidHunters + hideForce if (self.chosenOne and self.world.drawHidingSpots): egi.green_pen() egi.line_by_pos(self.pos, self.pos + avoidHunters * 5) # print 'avoidHunters', avoidHunters egi.red_pen() egi.line_by_pos(self.pos, self.pos + hideForce * 5) # print 'hideForce', hideForce egi.orange_pen() # egi.line_by_pos(self.pos, self.pos + steer * 5) return steer
def survivalSteer(self, delta): avoidHunters, hunterDist = self.avoidHuntersSteer(delta) # avoidHunters * hideForce = self.hidingSteer(delta) / (hunterDist / 20000) / (avoidHunters.length() / 100) steer = avoidHunters + hideForce if(self.chosenOne and self.world.drawHidingSpots): egi.green_pen() egi.line_by_pos(self.pos, self.pos + avoidHunters * 5) # print 'avoidHunters', avoidHunters egi.red_pen() egi.line_by_pos(self.pos, self.pos + hideForce * 5) # print 'hideForce', hideForce egi.orange_pen() # egi.line_by_pos(self.pos, self.pos + steer * 5) return steer
def idleSteer(self, delta): wanderForce = self.wander(delta) * self.state['wanderInfluence'] flockForce = self.flock(delta) * self.flockingInfluence # obstaclesForce = self.obstacleAvoidance(self.world.solids) percentFromCenterX = (self.pos.x - self.world.center.x) / self.world.width percentFromCenterY = (self.pos.y - self.world.center.y) / self.world.height # Square the falloff valueX = -Util.sign(percentFromCenterX)*(self.maxCenterForce * percentFromCenterX**2) valueY = -Util.sign(percentFromCenterY)*(self.maxCenterForce * percentFromCenterY**2) centerForce = Vector2D(valueX, valueY) survivalSteer = self.survivalSteer(delta) foodForce = self.foodSteer(delta) * (1 + self.sickness / 10) self.maxSpeed = self.stat('speed') - (self.sickness / 2) netForce = wanderForce + flockForce + centerForce + survivalSteer + foodForce # print 'self.flockingInfluence', self.flockingInfluence if(self.chosenOne and self.world.drawDebug): egi.blue_pen() egi.line_by_pos(self.pos, self.pos + wanderForce * 5) egi.green_pen() egi.line_by_pos(self.pos, self.pos + flockForce * 5) egi.orange_pen() egi.line_by_pos(self.pos, self.pos + netForce * 5) egi.set_pen_color(name='BROWN') egi.line_by_pos(self.pos, self.pos + centerForce * 5) return netForce
def idleSteer(self, delta): wanderForce = self.wander(delta) * self.state['wanderInfluence'] flockForce = self.flock(delta) * self.flockingInfluence # obstaclesForce = self.obstacleAvoidance(self.world.solids) percentFromCenterX = (self.pos.x - self.world.center.x) / self.world.width percentFromCenterY = (self.pos.y - self.world.center.y) / self.world.height # Square the falloff valueX = -Util.sign(percentFromCenterX) * (self.maxCenterForce * percentFromCenterX**2) valueY = -Util.sign(percentFromCenterY) * (self.maxCenterForce * percentFromCenterY**2) centerForce = Vector2D(valueX, valueY) survivalSteer = self.survivalSteer(delta) foodForce = self.foodSteer(delta) * (1 + self.sickness / 10) self.maxSpeed = self.stat('speed') - (self.sickness / 2) netForce = wanderForce + flockForce + centerForce + survivalSteer + foodForce # print 'self.flockingInfluence', self.flockingInfluence if (self.chosenOne and self.world.drawDebug): egi.blue_pen() egi.line_by_pos(self.pos, self.pos + wanderForce * 5) egi.green_pen() egi.line_by_pos(self.pos, self.pos + flockForce * 5) egi.orange_pen() egi.line_by_pos(self.pos, self.pos + netForce * 5) egi.set_pen_color(name='BROWN') egi.line_by_pos(self.pos, self.pos + centerForce * 5) return netForce
def draw(self): for box in self.boxes: box.draw() if cfg['EDGES_ON']: egi.set_pen_color(name='LIGHT_BLUE') for node, edges in self.graph.edgelist.items(): # print node, edges for dest in edges: egi.line_by_pos(self.boxes[node]._vc, self.boxes[dest]._vc) if self.path: if not self.agent: path_pts = [] for i in range(0,len(self.path.path)): path_pts.append(PointToVector2D(self.boxes[self.path.path[i]]._vc)) self.agent = Agent() self.agent.path.set_pts(path_pts) self.agent.update() self.agent.render() # put a circle in the visited boxes? if cfg['BOXUSED_ON']: egi.set_pen_color(name="GREEN") for i in self.path.closed: egi.circle(self.boxes[i]._vc, 10) if cfg['TREE_ON']: egi.set_stroke(3) # Show open edges route = self.path.route egi.set_pen_color(name='GREEN') for i in self.path.open: egi.circle(self.boxes[i]._vc, 10) # show the partial paths considered egi.set_pen_color(name='ORANGE') for i,j in route.items(): egi.line_by_pos(self.boxes[i]._vc, self.boxes[j]._vc) egi.set_stroke(1) if cfg['PATH_ON']: # show the final path delivered egi.set_pen_color(name='RED') egi.set_stroke(2) path = self.path.path for i in range(1,len(path)): egi.line_by_pos(self.boxes[path[i-1]]._vc, self.boxes[path[i]]._vc) egi.set_stroke(1)
def draw(self, agent_pos): for box in self.boxes: box.draw() if cfg['EDGES_ON']: egi.set_pen_color(name='LIGHT_BLUE') for node, edges in self.graph.edgelist.items(): # print node, edges for dest in edges: egi.line_by_pos(self.boxes[node]._vc, self.boxes[dest]._vc) if self.path: # put a circle in the visited boxes? if cfg['BOXUSED_ON']: egi.set_pen_color(name="GREEN") for i in self.path.closed: egi.circle(self.boxes[i]._vc, 10) if cfg['TREE_ON']: egi.set_stroke(3) # Show open edges route = self.path.route egi.set_pen_color(name='GREEN') for i in self.path.open_nodes: egi.circle(self.boxes[i]._vc, 10) # show the partial paths considered egi.set_pen_color(name='ORANGE') for i, j in route.items(): egi.line_by_pos(self.boxes[i]._vc, self.boxes[j]._vc) egi.set_stroke(1) if cfg['PATH_ON']: # show the final path delivered egi.set_pen_color(name='RED') egi.set_stroke(2) path = self.path.path for i in range(1, len(path)): egi.line_by_pos(self.boxes[path[i - 1]]._vc, self.boxes[path[i]]._vc) egi.set_stroke(1) if agent_pos: egi.set_stroke(4) egi.set_pen_color(name="BLUE") egi.circle(agent_pos, 10)
def draw(self): for box in self.boxes: box.draw() if cfg['EDGES_ON']: egi.set_pen_color(name='LIGHT_BLUE') for node, edges in self.graph.edgelist.items(): # print node, edges for dest in edges: egi.line_by_pos(self.boxes[node]._vc, self.boxes[dest]._vc) if self.path: # put a circle in the visited boxes? if cfg['BOXUSED_ON']: egi.set_pen_color(name="GREEN") for i in self.path.closed: egi.circle(self.boxes[i]._vc, 10) if cfg['TREE_ON']: egi.set_stroke(3) # Show open edges route = self.path.route egi.set_pen_color(name='GREEN') for i in self.path.open: egi.circle(self.boxes[i]._vc, 10) # show the partial paths considered egi.set_pen_color(name='ORANGE') for i,j in route.items(): egi.line_by_pos(self.boxes[i]._vc, self.boxes[j]._vc) egi.set_stroke(1) if cfg['PATH_ON']: # show the final path delivered egi.set_pen_color(name='RED') egi.set_stroke(2) path = self.path.path for i in range(1,len(path)): egi.line_by_pos(self.boxes[path[i-1]]._vc, self.boxes[path[i]]._vc) egi.set_stroke(1) if(self.follower): egi.set_pen_color(name='GREEN') egi.set_stroke(5) egi.circle(self.follower, 15)
def createFeelers(self): feelerLength = sqrt(self.boundingRadius) * 20 + 30 feelerLength *= self.feelerPercentage feelerAngle = pi/4 feelerShorter = 0.6 # Main center feeler center = self.pos + self.heading.copy() * feelerLength # Slightly shorter angled feelers left = self.pos + self.heading.copy().rotate(feelerAngle) * feelerLength * feelerShorter right = self.pos + self.heading.copy().rotate(-feelerAngle) * feelerLength * feelerShorter feelers = [center, left, right] if(self.chosenOne and self.world.drawDebug): egi.aqua_pen() egi.line_by_pos(self.pos, center) egi.line_by_pos(self.pos, left) egi.line_by_pos(self.pos, right) return feelers
def render(self, color=None): ''' Draw the triangle agent with color''' color = None shape = None if (self != Agent.world.hunter): color = self.color shape = Agent.vehicle_shape else: color = 'RED' shape = Agent.hunter_shape egi.set_pen_color(name=color) pts = Agent.world.transform_points(shape, self.pos, self.heading, self.side, Agent.scale * Agent.floatScale) # draw it! egi.closed_shape(pts) #cap taget pos to window diameters if ((self.mode == 'pursuit' or self.mode == 'flee') and self == Agent.world.hunter): egi.green_pen() if self.hunterTargVec.y > Agent.world.cy: self.hunterTargVec = Vector2D(self.hunterTargVec.x, Agent.world.cy) elif self.hunterTargVec.y < 0: self.hunterTargVec = Vector2D(self.hunterTargVec.x, 0) if self.hunterTargVec.x > Agent.world.cx: self.hunterTargVec = Vector2D(Agent.world.cx, self.hunterTargVec.y) elif self.hunterTargVec.x < 0: self.hunterTargVec = Vector2D(0, self.hunterTargVec.y) egi.cross(self.hunterTargVec, 10) # add some handy debug drawing info lines - force and velocity if Agent.show_info: #s = 0.5 # <-- scaling factor # force egi.red_pen() egi.line_with_arrow(self.pos, self.pos + self.force, 5) #replaced s with Agent.floatScale # velocity egi.grey_pen() egi.line_with_arrow(self.pos, self.pos + self.vel, 5) #replaced s with Agent.floatScale # draw the path if it exists and the mode is follow if self.mode == 'follow_path': self.path.render() # draw wander info? elif self.mode == 'wander': # calculate the center of the wander circle in front of the agent wnd_pos = Vector2D(Agent.wander_dist * Agent.floatScale, 0) wld_pos = self.world.transform_point(wnd_pos, self.pos, self.heading, self.side) # draw the wander circle egi.green_pen() egi.circle(wld_pos, Agent.wander_radius * Agent.floatScale) # draw the wander target (little circle on the big circle) egi.red_pen() wnd_pos = (self.wander_target + Vector2D(Agent.wander_dist * Agent.floatScale, 0)) wld_pos = Agent.world.transform_point(wnd_pos, self.pos, self.heading, self.side) egi.circle(wld_pos, 3) #draw cohesion range egi.blue_pen() egi.circle(self.pos, Agent.cohesiveRange * Agent.floatScale) egi.red_pen() egi.circle(self.pos, Agent.seperationRange * Agent.floatScale) egi.green_pen() egi.circle(self.pos, Agent.alignmentRange * Agent.floatScale) if self == Agent.world.hunter: #draw panic dist and hide dist egi.aqua_pen() egi.circle(self.pos, Agent.panicDist * Agent.floatScale) egi.circle(self.pos, (Agent.panicDist + Agent.hiderange) * Agent.floatScale) for hidepos in self.hunterHidePositions: egi.aqua_pen() egi.line_by_pos(self.pos, hidepos[0]) #debugging #TODO REMOVE egi.orange_pen() egi.line_by_pos( self.pos, self.pos + self.AvoidEnvironmentRedirect(self.force))