Skip to content
Snippets Groups Projects
Commit d6c8cb99 authored by phwitte's avatar phwitte
Browse files

Update couzin.py

parent 1f140779
Branches dev
No related tags found
Loading
...@@ -32,6 +32,21 @@ def absvec(a, b): ...@@ -32,6 +32,21 @@ def absvec(a, b):
if m == 0: m = 0.001 if m == 0: m = 0.001
return m 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): def neigbour_in_zones(a, aas, zor_r, zoo_r, zoa_r):
zor = [] zor = []
zoo = [] zoo = []
...@@ -41,13 +56,15 @@ def neigbour_in_zones(a, aas, zor_r, zoo_r, zoa_r): ...@@ -41,13 +56,15 @@ def neigbour_in_zones(a, aas, zor_r, zoo_r, zoa_r):
if (a == agent): if (a == agent):
True True
else: 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: if dis <= zor_r:
zor.append(agent) zor.append(agent)
elif dis <= zoo_r: elif dis <= zoo_r:
zoo.append(agent) zoo.append(agent)
elif dis <= zoa_r: elif dis <= zoa_r:
zoa.append(agent) zoa.append(agent)
#print len(zoo)+len(zor)+len(zoa)
return [zor, zoo, zoa] return [zor, zoo, zoa]
...@@ -136,19 +153,8 @@ def updateV_couzin(a, matrix, maxV): ...@@ -136,19 +153,8 @@ def updateV_couzin(a, matrix, maxV):
dx = a[1] dx = a[1]
dy = a[2] dy = a[2]
if abs(dx) < maxV : dx += random.uniform(-1, 1)
True dy += random.uniform(-1, 1)
elif dx <= -maxV :
dx = -maxV
else:
dx = maxV
if abs(dy) < maxV :
True
elif dy <= -maxV :
dy = -maxV
else:
dy = maxV
return [dx, dy] return [dx, dy]
...@@ -176,16 +182,22 @@ def main(): ...@@ -176,16 +182,22 @@ def main():
winWidth = 500 winWidth = 500
winHeight = 500 winHeight = 500
zor_r = 50 zor_r = 20
zoo_r = 100 zoo_r = 100
zoa_r = 200 zoa_r = 120
window = GraphWin("Window", winWidth, winHeight) window = GraphWin("Window", winWidth, winHeight)
maxTime = 20 maxTime = 4000
maxV = 8 maxV = 8
agentNum = 20 speed = 8
agents2 = [[0 for x in range(5)] for y in range(agentNum)]
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)] #directions = [[0 for x in range(2)] for y in range(agentNum)]
#generate point #generate point
# 0 Point # 0 Point
...@@ -193,7 +205,8 @@ def main(): ...@@ -193,7 +205,8 @@ def main():
# 2 YVelocity # 2 YVelocity
# 3 Line # 3 Line
# 4 temp. VelocityPoint # 4 temp. VelocityPoint
for agent in agents2:
for agent in agents:
agent[0] = Point(random.uniform(0,winWidth), random.uniform(0,winHeight)) agent[0] = Point(random.uniform(0,winWidth), random.uniform(0,winHeight))
agent[1] = random.uniform(-2,2) agent[1] = random.uniform(-2,2)
...@@ -202,11 +215,16 @@ def main(): ...@@ -202,11 +215,16 @@ def main():
agent[0].draw(window) agent[0].draw(window)
agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2])) agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2]))
agent[3].setArrow("last") 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]] 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 #update points
for i in range(maxTime): for i in range(maxTime):
# Velocity update # Velocity update
...@@ -214,20 +232,34 @@ def main(): ...@@ -214,20 +232,34 @@ def main():
neigh_matrix = neigbour_in_zones(agent, agents, zor_r, zoo_r, zoa_r) neigh_matrix = neigbour_in_zones(agent, agents, zor_r, zoo_r, zoa_r)
agent[4] = updateV_couzin(agent, neigh_matrix, maxV) 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 # move, draw
for agent in agents: for agent in agents:
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[1] = agent[4][0]
agent[2] = agent[4][1] 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 = checkBoundary(agent, winWidth, winHeight)
#agent[3].undraw() agent[3].undraw()
#agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2])) agent[3] = Line(agent[0], Point(agent[0].getX() + agent[1], agent[0].getY() + agent[2]))
#agent[3].setArrow("last") agent[3].setArrow("last")
#agent[3].draw(window) agent[3].draw(window)
time.sleep(0.01) time.sleep(0.01)
window.getMouse() window.getMouse()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment