diff --git a/Car.py b/Car.py index 88b4be8..ee3d231 100644 --- a/Car.py +++ b/Car.py @@ -4,6 +4,7 @@ from random import randint, uniform from PySide6.QtGui import QPainter, QColor from PySide6.QtCore import QPointF, Signal, QObject, Qt from itertools import islice +import time class updateSignals(QObject): updateDisp = Signal(tuple) @@ -59,7 +60,7 @@ class Car(): self.v=0 self.a=10 self.b=20 - self.minSpace=5 + self.minSpace=10 self.interMinSpace=20 self.leaderBefore=False self.distToInter=0 @@ -76,6 +77,7 @@ class Car(): self.nu = 0 self.gamma = 10 self.delta = 0 + #self.T = uniform(0.9,1.6) if not self.IA else 0.01 self.T = uniform(0.9,1.6) if not self.IA else 0.01 self.size = 3 @@ -136,6 +138,8 @@ class Car(): 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 - 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] + else: if l == 0: l+=dist(self.pos, closest.pos) else: l+=dist(laneShape[shapeInd], closest.pos) if l <= maxDist: - self.leaderDist = l - return closest + if closestToReturn is None: + self.leaderDist = l + closestToReturn = closest + if l > self.interMinSpace and closestToReturn is not None: + return closestToReturn 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): @@ -274,7 +285,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(): + 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 cars.append(closest) for incEdge in prevNode.getIncoming(): @@ -291,7 +302,8 @@ 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(): + 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) + cars.append(closest) if(len(cars) == 0): @@ -469,7 +481,7 @@ class Car(): self.v = min(vmax, self.v + self.a*dt) return - if self.leaderStopped > 1: + if False and self.leaderStopped > 1: self.v = min(vmax, self.v + self.a*dt) return @@ -478,7 +490,7 @@ class Car(): # ou si on as le temps d'arriver à l'intersection avant le leader (plus un marge pour garder un distance de sécu) # alors on accelere pour s'inserer #print(tti, leader.T, marg, ltti) - if self.distToInter > self.interMinSpace + dts or self.distToInter < 3 or (tti + leader.T + marg) < ltti: + if self.distToInter > self.interMinSpace + dts or (tti + leader.T + marg) < ltti: self.v = min(vmax, self.v + self.a*dt) #print(self.id, "ca passe") else:# sinon on freine @@ -537,7 +549,7 @@ class Car(): self.leader.isLeader += 1 if self.leader.v == 0: self.leaderStopped += dt - print(self.leaderStopped) + #print(self.leaderStopped) diff --git a/CarController.py b/CarController.py index f24fcce..16facc2 100644 --- a/CarController.py +++ b/CarController.py @@ -216,6 +216,7 @@ class CarController: #selectedId = self.infoWidget.currentIndex() colorOverride = False if len(selectedCar) == 0: + painter.setPen(Qt.white) pass elif car.id == self.selectedId: painter.setPen(Qt.green)