Example #1
0
    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)
Example #2
0
    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)
Example #3
0
	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)
Example #4
0
	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
Example #5
0
	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
Example #6
0
	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)
Example #7
0
    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)
Example #8
0
    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
Example #9
0
    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)
Example #10
0
    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
Example #11
0
    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
Example #12
0
	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
Example #13
0
    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
Example #14
0
	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
Example #15
0
    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
Example #16
0
	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
Example #17
0
	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
Example #18
0
    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
Example #19
0
    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)
Example #20
0
    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)
Example #21
0
    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)
Example #22
0
	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))