Hi There.
I am using processing.py to model some fairly rudimentary evacuation simulations. I am using Fisica as the physics engine to handle the collisions, however, it does not seem to be working. The collision detection only works consistently after a couple of seconds. collisions between the agents (circles seems to be working, but not between the agents and the large black polygons. The smaller polygons seem to be working
Any help would be appreciated.
add_library('fisica')
import copy
import os
global timekeeper
timekeeper = 0
def setup():
size(1800, 1000) #6
size(900, 500)
smooth()
init(275)
def init(n):
Fisica.init(this)
global world, SCL, pop, p, E1, E2, stg, _frames
world = FWorld()
world.setGravity(0, 0)
SCL = 6
_frames = copy.copy(frameCount)
E1 = PVector(103.374*SCL, 88.616*SCL)
E2 = PVector(56.002*SCL, 47.393*SCL)
addPolyData(SCL)
addColumnsData(SCL)
pop = definePoints(300, SCL)
p = makeAgents(pop)
for i in p:
i.render()
global timekeeper
timekeeper += 1
if timekeeper == n+1:
exit()
def draw():
background(255)
frameRate(30)
world.draw()
world.step()
for i in p:
i.agentWalk()
i.death()
renderStats()
fr = frameCount - _frames
if len(pop) == 0 or (fr > 1 and fr%9000 == 0):
noLoop()
redraw()
init(275)
framecount = 0
loop()
def renderStats():
seconds = str(frameCount/30)
startFrames = str(_frames)
endFrames = str(frameCount)
startPop = str(len(p))
endPop = str(len(pop))
t = str(timekeeper)
fr = frameCount - _frames
textSize(32)
fill(0, 0, 0)
text("start/end frames: " + startFrames + "/" + endFrames + " diff: " + str(fr) + " Iteration: " + t, 10, 30)
text("time(s): " + seconds, 10, 60)
text("start pop: " + startPop + " End pop:" + endPop, 10, 90)
text("Stage Coorrds: " + stgX + ", " + stgY, 10, 120)
class Agent(object):
def __init__(self, i, x, y, evac1, evac2):
self.x = x
self.y = y
self.i = i
self.l = PVector(self.x, self.y)
self.s = random(40, 60)
self.mf = 100
self.r = 255
self.g = 255
self.b = 255
self.see = FCircle(SCL)
self.see.setBullet(True)
self.see.setPosition(self.x, self.y)
self.q = FCircle(SCL)
self.q.setPosition(self.x + SCL, self.y + SCL)
self.q.setFill(self.r, self.g, self.b)
self.q.setRestitution(0.01)
self.q.setBullet(True)
self.dest = PVector(102.374*SCL, 87.616*SCL)
self.dest2 = PVector(76.002*SCL, 67.393*SCL)
def render(self):
world.add(self.q)
def agentWalk(self):
if frameCount > 150:
x = self.q.getX()
y = self.q.getY()
self.l = PVector(x, y)
dirsub = PVector.sub(self.dest, self.l)
if dirsub.mag() < 3 * SCL:
self.dest = PVector(E2.x, E2.y)
dirsub = PVector.sub(self.dest, self.l)
dirsub.normalize()
dirsub.mult(self.s)
vel = PVector(self.q.getVelocityX(), self.q.getVelocityY())
steer = PVector.sub(dirsub, vel)
steer.limit(self.mf)
self.q.addForce(steer.x, steer.y)
def death(self):
d = PVector.sub(E2, self.l)
if d.mag() < 10:
self.q.removeFromWorld()
for x, j in enumerate(pop):
if j == self.i:
del pop[x]
break
self.q.setDrawable(False)
def definePoints(n, scl):
class Triangle(object):
def __init__(self, tp):
self.a = PVector(tp[0][0], tp[0][1])
self.b = PVector(tp[1][0], tp[1][1])
self.c = PVector(tp[2][0], tp[2][1])
self.ba = PVector.sub(self.b, self.a)
self.ca = PVector.sub(self.c, self.a)
cy1a = [[75.204, 129.069], [143.143, 49.110], [94.454, 159.742]]
cy2a = [[143.143, 49.110], [220.295, 82.03], [94.454, 159.742]]
threshold = 0.2769
cy1 = Triangle(cy1a)
cy2 = Triangle(cy2a)
print(cy2)
t = []
while len(t) < n:
r = random(0, 1)
if r < threshold:
#cy1
q = makePoint(cy1, SCL)
t.append(q)
else:
#cy2
s = makePoint(cy2, SCL)
t.append(s)
return t
def makePoint(t, scl):
x = random(0, 0.999)
y = random(0, 0.999 - x)
rx = (x * t.ba.x) + (y * t.ca.x)
ry = (x * t.ba.y) + (y * t.ca.y)
r = PVector(rx, ry)
r.add(t.a)
r.mult(scl)
return r
def makeAgents(p):
t = []
for i in p:
a = Agent(i, i.x, i.y, E1, E2)
t.append(a)
return t
def addCWPoly(v, scl):
p = FPoly()
p.vertex(v[0][1]*scl, v[0][2]*scl)
p.vertex(v[1][1]*scl, v[1][2]*scl)
p.vertex(v[2][1]*scl, v[2][2]*scl)
p.vertex(v[3][1]*scl, v[3][2]*scl)
p.vertex(v[4][1]*scl, v[4][2]*scl)
if len(v) > 5:
p.vertex(v[5][1]*scl, v[5][2]*scl)
p.setStatic(True)
p.setNoStroke()
p.setRestitution(0.01)
p.setFill(0)
world.add(p)
def addColumnsData(scl):
v = [[131.455, 60.953, 129], [128.882, 64.004, 129], [136.71, 54.889, 129], [134.101, 57.976, 129], [100.95, 96.419, 129], [103.45, 93.516, 129], [95.658, 102.483, 129], [98.267, 99.469, 129], [110.561, 85.191, 129], [108.044, 88.15, 129], [115.798, 79.017, 129], [113.171, 82.086, 129], [121.127, 72.971, 129], [118.426, 75.985, 129], [126.346, 66.87, 129], [123.774, 69.884, 129], [90.081, 109.071, 129], [92.902, 105.782, 129], [84.844, 115.126, 129], [87.481, 112.112, 129], [79.643, 121.245, 129], [82.262, 118.213, 129], [76.997, 124.351, 129]]
addColumns(v, scl)
def addColumns(v, scl):
for i in v:
x = i[0]*scl
y = i[1]*scl
rt = i[2]
t = FBox(6, 6)
t.setPosition(x, y)
t.setRotation(radians(rt))
t.setFill(0)
t.setStatic(True)
world.add(t)
def addPolyData(scl):
aw = [["aw", 71.614, 123.348], ["aw", 50.151, 123.735], ["aw", 87.991, 78.374], ["aw", 100.977, 89.266], ["aw", 71.614, 123.348]]
f = [["f", 94.454, 159.742], ["f", 220.295, 82.03], ["f", 231.718, 86.904], ["f", 230.43, 102.263], ["f", 106.474, 178.896], ["f", 94.454, 159.742]]
e = [["e", 231.718, 86.904], ["e", 137.749, 46.809], ["e", 133.749, 29.189], ["e", 233.411, 71.039], ["e", 231.718, 86.904]]
ae = [["ae", 137.749, 46.809], ["ae", 103.598, 86.222], ["ae", 90.389, 75.52], ["ae", 133.749, 29.189], ["ae", 137.749, 46.809]]
b = [["b", 50.151, 123.735], ["b", 71.614, 123.348], ["b", 106.474, 178.896], ["b", 90.295, 188.013], ["b", 50.151, 123.735]]
addCWPoly(aw, scl)
addCWPoly(f, scl)
addCWPoly(e, scl)
addCWPoly(ae, scl)
addCWPoly(b, scl)