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

70
Car.py
View File

@ -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<maxDist):
endPos = laneShape[shapeInd+1]
@ -154,37 +158,44 @@ class Car():
l+=dist(self.pos,endPos)
else:
l+=dist(laneShape[shapeInd],endPos)
shapeInd+=1
if(shapeInd>=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)

View File

@ -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)