diff --git a/couzin.py b/couzin.py index 03fb28e63f8db9d941927e6a177d51e1dce360c0..6faddeaacca1c35dfe47dfcd268f75db5df319b3 100644 --- a/couzin.py +++ b/couzin.py @@ -32,6 +32,21 @@ def absvec(a, b): if m == 0: m = 0.001 return m +def calc_angle(x1, y1, x2, y2): + skalar = x1*x2 + y1*y2 + abs1 = absvec(x1, y1) + abs2 = absvec(x2, y2) + + erg = skalar/(abs1* abs2) + if erg > 1: + #print erg + erg=1 + + elif erg < -1: + #print erg + erg=-1 + return math.degrees(math.acos(erg)) + def neigbour_in_zones(a, aas, zor_r, zoo_r, zoa_r): zor = [] zoo = [] @@ -41,14 +56,16 @@ def neigbour_in_zones(a, aas, zor_r, zoo_r, zoa_r): if (a == agent): True else: - dis = distance(a[0].getX(), a[0].getY(), agent[0].getX(), agent[0].getY()) + dis = absvec(agent[0].getX() - a[0].getX() , agent[0].getY() - a[0].getY() ) if dis <= zor_r: zor.append(agent) elif dis <= zoo_r: zoo.append(agent) elif dis <= zoa_r: zoa.append(agent) - return [zor, zoo, zoa] + + #print len(zoo)+len(zor)+len(zoa) + return [zor, zoo, zoa] # updateVelociy @@ -136,19 +153,8 @@ def updateV_couzin(a, matrix, maxV): dx = a[1] dy = a[2] - if abs(dx) < maxV : - True - elif dx <= -maxV : - dx = -maxV - else: - dx = maxV - - if abs(dy) < maxV : - True - elif dy <= -maxV : - dy = -maxV - else: - dy = maxV + dx += random.uniform(-1, 1) + dy += random.uniform(-1, 1) return [dx, dy] @@ -176,16 +182,22 @@ def main(): winWidth = 500 winHeight = 500 - zor_r = 50 + zor_r = 20 zoo_r = 100 - zoa_r = 200 + zoa_r = 120 window = GraphWin("Window", winWidth, winHeight) - maxTime = 20 + maxTime = 4000 maxV = 8 - agentNum = 20 - agents2 = [[0 for x in range(5)] for y in range(agentNum)] + speed = 8 + + maxTurn = 80 + radTurn = math.radians(maxTurn) + negRadTurn = math.radians(360-maxTurn) + + agentNum = 50 + agents = [[0 for x in range(5)] for y in range(agentNum)] #directions = [[0 for x in range(2)] for y in range(agentNum)] #generate point # 0 Point @@ -193,7 +205,8 @@ def main(): # 2 YVelocity # 3 Line # 4 temp. VelocityPoint - for agent in agents2: + + for agent in agents: agent[0] = Point(random.uniform(0,winWidth), random.uniform(0,winHeight)) agent[1] = random.uniform(-2,2) @@ -202,11 +215,16 @@ def main(): agent[0].draw(window) agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2])) agent[3].setArrow("last") - #agent[3].draw(window) + agent[3].draw(window) - agentA = [Point(200, 200) , 0, 0,None,[0,0]] + """agentA = [Point(200, 200) , 0, 0,None,[0,0]] agentB = [Point(205, 200) , 0, 0,None,[0,0]] - agents = [agentA, agentB] + agentC = [Point(210, 200) , 0, 0,None,[0,0]] + agentA[0].draw(window) + agentB[0].draw(window) + agentC[0].draw(window) """ + + #agents = [agentA, agentB, agentC] #update points for i in range(maxTime): # Velocity update @@ -214,20 +232,34 @@ def main(): neigh_matrix = neigbour_in_zones(agent, agents, zor_r, zoo_r, zoa_r) agent[4] = updateV_couzin(agent, neigh_matrix, maxV) - print (i ++ " zor: " ++ len(neigh_matrix[0])) + #print str(i) + " zor: " + str(len(neigh_matrix[0])) + #print str(i) + " zoo: " + str(len(neigh_matrix[1])) + #print str(i) + " zoa: " + str(len(neigh_matrix[2])) # move, draw for agent in agents: - agent[1] = agent[4][0] - agent[2] = agent[4][1] + alpha = calc_angle(agent[1], agent[2],agent[4][0],agent[4][1]) + + if alpha < maxTurn or alpha > 360-maxTurn: + agent[1] = agent[4][0] + agent[2] = agent[4][1] + elif alpha < 180: + agent[1] = agent[1] * math.cos(radTurn) - agent[2] * math.sin(radTurn) + agent[2] = agent[1] * math.sin(radTurn) + agent[2] * math.cos(radTurn) + else: + agent[1] = agent[1] * math.cos(negRadTurn) - agent[2] * math.sin(negRadTurn) + agent[2] = agent[1] * math.sin(negRadTurn) + agent[2] * math.cos(negRadTurn) + + agent[1] = 1/absvec(agent[1], agent[2]) * agent[1] * speed + agent[2] = 1/absvec(agent[1], agent[2]) * agent[2] * speed agent = checkBoundary(agent, winWidth, winHeight) - #agent[3].undraw() - #agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2])) - #agent[3].setArrow("last") - #agent[3].draw(window) + agent[3].undraw() + agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2])) + agent[3].setArrow("last") + agent[3].draw(window) time.sleep(0.01) window.getMouse()