From c18d11bc17c5965ac3d4155d957850b83ecbae21 Mon Sep 17 00:00:00 2001 From: leo Date: Sat, 14 May 2022 16:10:55 +0200 Subject: [PATCH] sim leader --- Car.py | 103 +++++++++++++++++++++-------------------------- CarController.py | 9 +++-- 2 files changed, 51 insertions(+), 61 deletions(-) diff --git a/Car.py b/Car.py index ee3d231..ebda6c1 100644 --- a/Car.py +++ b/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=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,26 +539,9 @@ 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) + self.leaderAtInter=self.getLeaderAtIntersections(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) - - - vmax = self.vmax if self.dynSpeed: vmax = max(min(self.vmax * self.controller.dynSpeedRat, self.vmax), 8) @@ -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) diff --git a/CarController.py b/CarController.py index cc9969e..4c97cce 100644 --- a/CarController.py +++ b/CarController.py @@ -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))