This commit is contained in:
leo 2022-05-14 00:47:40 +02:00
parent 32496cd12c
commit 2b86d269b9
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 42 additions and 29 deletions

44
Car.py
View File

@ -4,6 +4,7 @@ from random import randint, uniform
from PySide6.QtGui import QPainter, QColor from PySide6.QtGui import QPainter, QColor
from PySide6.QtCore import QPointF, Signal, QObject, Qt from PySide6.QtCore import QPointF, Signal, QObject, Qt
from itertools import islice from itertools import islice
import time
class updateSignals(QObject): class updateSignals(QObject):
updateDisp = Signal(tuple) updateDisp = Signal(tuple)
@ -59,7 +60,7 @@ class Car():
self.v=0 self.v=0
self.a=10 self.a=10
self.b=20 self.b=20
self.minSpace=5 self.minSpace=10
self.interMinSpace=20 self.interMinSpace=20
self.leaderBefore=False self.leaderBefore=False
self.distToInter=0 self.distToInter=0
@ -76,6 +77,7 @@ class Car():
self.nu = 0 self.nu = 0
self.gamma = 10 self.gamma = 10
self.delta = 0 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.T = uniform(0.9,1.6) if not self.IA else 0.01
self.size = 3 self.size = 3
@ -136,6 +138,8 @@ class Car():
carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId) carsHere = self.controller.getCarsOnLane(self.route[edgeInd].getID(), laneId)
carsHere = list(filter(lambda c: c.id != self.id, carsHere)) carsHere = list(filter(lambda c: c.id != self.id, carsHere))
self.leaderBefore = False self.leaderBefore = False
self.distToInter = 0
closestToReturn = None
while(l<maxDist): while(l<maxDist):
endPos = laneShape[shapeInd+1] endPos = laneShape[shapeInd+1]
@ -154,10 +158,27 @@ class Car():
l+=dist(self.pos,endPos) l+=dist(self.pos,endPos)
else: else:
l+=dist(laneShape[shapeInd],endPos) l+=dist(laneShape[shapeInd],endPos)
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
else:
return
shapeInd+=1 shapeInd+=1
if(shapeInd>=len(laneShape)-1): if(shapeInd>=len(laneShape)-1):
shapeInd = 0 shapeInd = 0
edgeInd+=1 edgeInd+=1
if l > self.interMinSpace and closestToReturn is not None:
return closestToReturn
carComing = self.getLeaderAtIntersection(prevInd,edgeInd) carComing = self.getLeaderAtIntersection(prevInd,edgeInd)
if(carComing is not None): 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 self.distToInter = l # y as un bug qqu part dans le calcul de la distance, ça saute quand on change d'edge
@ -175,16 +196,6 @@ class Car():
newLane = self.getShape(edgeInd) newLane = self.getShape(edgeInd)
laneShape = newLane[0] laneShape = newLane[0]
laneId = newLane[2] 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
else:
return
return return
def getCurrentEdge(self): def getCurrentEdge(self):
@ -274,7 +285,7 @@ class Car():
carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge) carsInEdge = zip([self.getCarDist(c, intEdge, intLane.getIndex())+prevLanesLgt for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) closest = min(carsInEdge, key=lambda c: c[0])
cl = closest[1] 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) cars.append(closest)
for incEdge in prevNode.getIncoming(): 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) carsInEdge = zip([self.getCarDist(c, incEdge, incLane.getIndex())+prevLanesLgt+intLaneLgt for c in carsInEdge], carsInEdge)
closest = min(carsInEdge, key=lambda c: c[0]) closest = min(carsInEdge, key=lambda c: c[0])
cl = closest[1] 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) cars.append(closest)
if(len(cars) == 0): if(len(cars) == 0):
@ -469,7 +481,7 @@ class Car():
self.v = min(vmax, self.v + self.a*dt) self.v = min(vmax, self.v + self.a*dt)
return return
if self.leaderStopped > 1: if False and self.leaderStopped > 1:
self.v = min(vmax, self.v + self.a*dt) self.v = min(vmax, self.v + self.a*dt)
return 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) # 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 # alors on accelere pour s'inserer
#print(tti, leader.T, marg, ltti) #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) self.v = min(vmax, self.v + self.a*dt)
#print(self.id, "ca passe") #print(self.id, "ca passe")
else:# sinon on freine else:# sinon on freine
@ -537,7 +549,7 @@ class Car():
self.leader.isLeader += 1 self.leader.isLeader += 1
if self.leader.v == 0: if self.leader.v == 0:
self.leaderStopped += dt self.leaderStopped += dt
print(self.leaderStopped) #print(self.leaderStopped)

View File

@ -216,6 +216,7 @@ class CarController:
#selectedId = self.infoWidget.currentIndex() #selectedId = self.infoWidget.currentIndex()
colorOverride = False colorOverride = False
if len(selectedCar) == 0: if len(selectedCar) == 0:
painter.setPen(Qt.white)
pass pass
elif car.id == self.selectedId: elif car.id == self.selectedId:
painter.setPen(Qt.green) painter.setPen(Qt.green)