sim leader
This commit is contained in:
parent
7439e4ca9a
commit
c18d11bc17
103
Car.py
103
Car.py
@ -48,6 +48,9 @@ class Car():
|
||||
self.laneShape=None
|
||||
self.laneId=0
|
||||
self.leader=None
|
||||
self.leaderAtInter=None
|
||||
self.leaderDist=0
|
||||
self.leaderAtInterDist=0
|
||||
self.startTime=float(startTime)
|
||||
self.dynSpeed=(dynSpeed == '1') if isinstance(dynSpeed, str) else dynSpeed
|
||||
self.IA=(IA == '1') if isinstance(IA, str) else IA
|
||||
@ -62,7 +65,6 @@ class Car():
|
||||
self.b=20
|
||||
self.minSpace=10
|
||||
self.interMinSpace=20
|
||||
self.leaderBefore=False
|
||||
self.distToInter=0
|
||||
self.timeStopped=0
|
||||
self.speedPercentage=0
|
||||
@ -137,9 +139,6 @@ class Car():
|
||||
l = 0
|
||||
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
|
||||
carsHere = list(filter(lambda c: c.id != self.id, carsHere))
|
||||
self.leaderBefore = False
|
||||
self.distToInter = 0
|
||||
closestToReturn = None
|
||||
while(l<maxDist):
|
||||
endPos = laneShape[shapeInd+1]
|
||||
|
||||
@ -158,44 +157,29 @@ class Car():
|
||||
l+=dist(self.pos,endPos)
|
||||
else:
|
||||
l+=dist(laneShape[shapeInd],endPos)
|
||||
|
||||
shapeInd+=1
|
||||
if(shapeInd>=len(laneShape)-1):
|
||||
shapeInd = 0
|
||||
edgeInd+=1
|
||||
if(not self.route[edgeInd].isSpecial()):
|
||||
prevInd = edgeInd
|
||||
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
|
||||
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) # me demande pas pourquoi mais si on le convertit pas en liste ici le filter original est modifié
|
||||
if(edgeInd>=len(self.route)-1):
|
||||
return
|
||||
newLane = self.getShape(edgeInd)
|
||||
laneShape = newLane[0]
|
||||
laneId = newLane[2]
|
||||
else:
|
||||
if l == 0:
|
||||
l+=dist(self.pos, closest.pos)
|
||||
else:
|
||||
l+=dist(laneShape[shapeInd], closest.pos)
|
||||
if l <= maxDist:
|
||||
if closestToReturn is None:
|
||||
self.leaderDist = l
|
||||
closestToReturn = closest
|
||||
if l > self.interMinSpace and closestToReturn is not None:
|
||||
return closestToReturn
|
||||
self.leaderDist=l
|
||||
return closest
|
||||
else:
|
||||
return
|
||||
|
||||
shapeInd+=1
|
||||
if(shapeInd>=len(laneShape)-1):
|
||||
shapeInd = 0
|
||||
edgeInd+=1
|
||||
if l > self.interMinSpace and closestToReturn is not None:
|
||||
return closestToReturn
|
||||
carComing = self.getLeaderAtIntersection(prevInd,edgeInd)
|
||||
if(carComing is not None):
|
||||
self.distToInter = l # y as un bug qqu part dans le calcul de la distance, ça saute quand on change d'edge
|
||||
if self.route[edgeInd].isSpecial():
|
||||
self.distToInter += self.route[edgeInd + 1].getLength()
|
||||
self.leaderDist = carComing[0]
|
||||
self.leaderBefore = True
|
||||
return carComing[1]
|
||||
if(not self.route[edgeInd].isSpecial()):
|
||||
prevInd = edgeInd
|
||||
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
|
||||
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) # me demande pas pourquoi mais si on le convertit pas en liste ici le filter original est modifié
|
||||
if(edgeInd>=len(self.route)-1):
|
||||
return
|
||||
newLane = self.getShape(edgeInd)
|
||||
laneShape = newLane[0]
|
||||
laneId = newLane[2]
|
||||
return
|
||||
|
||||
def getCurrentEdge(self):
|
||||
@ -214,6 +198,28 @@ class Car():
|
||||
return cDist
|
||||
return cDist
|
||||
|
||||
def getDistToEndOfEdge(self):
|
||||
lgt = 0
|
||||
lgt += dist(self.pos, self.laneShape[self.laneInd+1])
|
||||
for p,n in zip(self.laneShape[self.laneInd+1:], self.laneShape[self.laneInd+2:]):
|
||||
lgt += dist(p,n)
|
||||
return lgt
|
||||
|
||||
def getLeaderAtIntersections(self, maxDist):
|
||||
l = self.getDistToEndOfEdge()
|
||||
edgeInd = self.index + 1
|
||||
while l < maxDist:
|
||||
carComing = self.getLeaderAtIntersection(edgeInd - 1,edgeInd)
|
||||
l += self.route[edgeInd].getLength()
|
||||
if carComing is not None:
|
||||
self.distToInter = l
|
||||
self.leaderAtInterDist = carComing[0]
|
||||
return carComing[1]
|
||||
edgeInd += 1
|
||||
if edgeInd >= len(self.route):
|
||||
return
|
||||
return
|
||||
|
||||
def getLeaderAtIntersection(self, prevInd, edgeInd):
|
||||
# On récupère les edges juste avant et juste après l'intersection
|
||||
while(self.route[edgeInd].isSpecial()):
|
||||
@ -285,7 +291,7 @@ class Car():
|
||||
carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge)
|
||||
closest = min(carsInEdge, key=lambda c: c[0])
|
||||
cl = closest[1]
|
||||
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo() and not (cl.v == 0 and (cl.leader is not None and cl.leaderBefore and cl.leaderDist > 10)): #TODO: le 10 je l'ai sorti de mon
|
||||
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): #TODO: le 10 je l'ai sorti de mon
|
||||
cars.append(closest)
|
||||
|
||||
for incEdge in prevNode.getIncoming():
|
||||
@ -302,7 +308,7 @@ class Car():
|
||||
carsInEdge = zip([self.getCarDist(c, incEdge, incLane.getIndex())+prevLanesLgt+intLaneLgt for c in carsInEdge], carsInEdge)
|
||||
closest = min(carsInEdge, key=lambda c: c[0])
|
||||
cl = closest[1]
|
||||
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo() and not (cl.v == 0 and (cl.leader is not None and cl.leaderBefore and cl.leaderDist > 10)): #TODO: comme avant (d'ailleurs faudrait les rassembler)
|
||||
if cl.nextNonSpecialEdge() == edge and cl.nextNonSpecialEdge(3) == conn[i].getTo(): #TODO: comme avant (d'ailleurs faudrait les rassembler)
|
||||
|
||||
cars.append(closest)
|
||||
|
||||
@ -433,7 +439,7 @@ class Car():
|
||||
self.v = 0
|
||||
return
|
||||
|
||||
if not self.leaderBefore:
|
||||
if self.leaderAtInter is None:
|
||||
self.forceThrough = False
|
||||
|
||||
if leader is None:
|
||||
@ -445,7 +451,7 @@ class Car():
|
||||
bleader = leader.b
|
||||
|
||||
# si on est à une intersection
|
||||
if(self.leaderBefore):
|
||||
if(self.leaderAtInter is not None):
|
||||
if self.v == 0:
|
||||
self.timeAtInter += dt
|
||||
else:
|
||||
@ -533,25 +539,8 @@ class Car():
|
||||
if self.v < 1 and self.getCurrentEdge().isSpecial():
|
||||
print(f"{self.id} stalled where he souldn't have")
|
||||
"""
|
||||
oldLeaderId = "None"
|
||||
if self.leader is not None:
|
||||
oldLeaderId = self.leader.id
|
||||
if self.leaderBefore:
|
||||
self.leader.isLeader -= 1
|
||||
|
||||
self.leader=self.getLeader(100)
|
||||
|
||||
if self.leader is not None:
|
||||
if self.leader.id != oldLeaderId:
|
||||
self.leaderStopped = 0
|
||||
|
||||
if self.leaderBefore:
|
||||
self.leader.isLeader += 1
|
||||
if self.leader.v == 0:
|
||||
self.leaderStopped += dt
|
||||
#print(self.leaderStopped)
|
||||
|
||||
|
||||
self.leaderAtInter=self.getLeaderAtIntersections(100)
|
||||
|
||||
vmax = self.vmax
|
||||
if self.dynSpeed:
|
||||
@ -598,7 +587,7 @@ class Car():
|
||||
return
|
||||
self.signals.updateDisp.emit(("Position", self.pos))
|
||||
self.signals.updateDisp.emit(("Vitesse", self.v))
|
||||
self.signals.updateDisp.emit(("Leader", self.leader if self.leader is None else f"{self.leader.id} @ {self.leaderDist:.2f}m (inter : {self.leaderBefore})"))
|
||||
self.signals.updateDisp.emit(("Leader", f"{self.leader.id if self.leader is not None else 'None'} @ {self.leaderDist:.2f}m : {self.leaderAtInter.id if self.leaderAtInter is not None else 'None'} @ {self.leaderAtInterDist:.2f})"))
|
||||
|
||||
def __copy__(self):
|
||||
copy = Car(self.id, self.rawRoute, self.startTime, self.dynSpeed, self.IA, self.map, self.controller, self.infoWidg)
|
||||
|
@ -223,10 +223,10 @@ class CarController:
|
||||
painter.setPen(Qt.green)
|
||||
colorOverride = True
|
||||
elif(selectedCar[0].leader is not None and selectedCar[0].leader.id == car.id):
|
||||
if selectedCar[0].leaderBefore:
|
||||
painter.setPen(QColor(100,0,255))
|
||||
else:
|
||||
painter.setPen(Qt.red)
|
||||
painter.setPen(Qt.red)
|
||||
colorOverride = True
|
||||
elif(selectedCar[0].leaderAtInter is not None and selectedCar[0].leaderAtInter.id == car.id):
|
||||
painter.setPen(QColor(100,0,255))
|
||||
colorOverride = True
|
||||
else:
|
||||
painter.setPen(Qt.white)
|
||||
@ -254,3 +254,4 @@ class CarController:
|
||||
return
|
||||
closest = min(self.cars, key=lambda c: dist(c.pos, [pos.x(), pos.y()]))
|
||||
self.selectedId = closest.id
|
||||
self.infoWidget.setCurrentIndex(self.cars.index(closest))
|
||||
|
Loading…
x
Reference in New Issue
Block a user