45 #define DEBUG1 "disabled"
46 #define DEBUG2 "disabled"
47 #define DEBUGCOND(PEDID) (PEDID == DEBUG1 || PEDID == DEBUG2)
51 for (
int i = 0; i < (int)obs.size(); ++i) {
53 <<
"(" << obs[i].description
55 <<
" s=" << obs[i].speed
67 #define BLOCKED_STRIPE -10000
68 #define FAR_AWAY 10000
69 #define ONCOMING_CONFLICT -1000
99 myNumActivePedestrians(0) {
132 for (Pedestrians::const_iterator it_ped = pedestrians.begin(); it_ped != pedestrians.end(); ++it_ped) {
133 const PState& ped = **it_ped;
134 const SUMOReal halfVehicleWidth = 1.0;
142 if (collectBlockers == 0) {
145 collectBlockers->push_back(ped.
myPerson);
149 if (collectBlockers == 0) {
152 return collectBlockers->size() > 0;
184 if (from == 0 || to == 0) {
207 std::vector<MSLane*> lanes;
209 for (
int j = 0; j < (int)incoming.size(); ++j) {
213 for (
int j = 0; j < (int)outgoing.size(); ++j) {
217 for (
int j = 0; j < (int)lanes.size(); ++j) {
218 for (
int k = 0; k < (int)lanes.size(); ++k) {
221 const MSLane* from = lanes[j];
222 const MSLane* to = lanes[k];
241 if (shape.size() < 2) {
245 assert(shape.size() == 2);
267 const MSLane* nextLane = nextRouteLane;
271 if (nextRouteLane != 0) {
276 std::cout <<
" internal\n";
281 nextLane = currentLane->
getLinkCont()[0]->getLane();
286 std::cout <<
" crossing\n";
297 prohibited.push_back(&prevLane->
getEdge());
301 <<
" nre=" << nextRouteEdge->
getID()
302 <<
" nreDir=" << nextRouteEdgeDir
303 <<
" aPos=" << arrivalPos
304 <<
" crossingRoute=" <<
toString(crossingRoute)
307 if (crossingRoute.size() > 1) {
308 const MSEdge* nextEdge = crossingRoute[1];
311 assert(nextLane != prevLane);
314 std::cout <<
" nextDir=" << nextDir <<
"\n";
329 <<
" no route from '" << (currentEdge == 0 ?
"NULL" : currentEdge->
getID())
330 <<
"' to '" << (nextRouteEdge == 0 ?
"NULL" : nextRouteEdge->
getID())
335 }
else if (currentEdge == nextRouteEdge) {
337 nextDir = -ped.
myDir;
345 std::cout <<
" next walkingArea " << (nextDir ==
FORWARD ?
"forward" :
"backward") <<
"\n";
354 #ifdef HAVE_INTERNAL_LANES
357 std::cout <<
" direct forward\n";
359 nextLane = MSLinkContHelper::getInternalFollowingLane(currentLane, nextRouteLane);
364 #ifdef HAVE_INTERNAL_LANES
367 std::cout <<
" direct backward\n";
369 nextLane = MSLinkContHelper::getInternalFollowingLane(nextRouteLane, currentLane);
376 nextLane = nextRouteLane;
378 std::cout <<
SIMTIME <<
" no next lane found for " << currentLane->
getID() <<
" dir=" << ped.
myDir <<
"\n";
382 nextLane = nextRouteLane;
389 <<
" l=" << currentLane->
getID()
390 <<
" nl=" << (nextLane == 0 ?
"NULL" : nextLane->
getID())
391 <<
" nrl=" << (nextRouteLane == 0 ?
"NULL" : nextRouteLane->
getID())
394 <<
" pedDir=" << ped.
myDir
405 for (MSLinkCont::const_iterator it = links.begin(); it != links.end(); ++it) {
406 if ((*it)->getLane()->getEdge().isWalkingArea()) {
412 const std::vector<MSLane::IncomingLaneInfo>& laneInfos = currentLane->
getIncomingLanes();
413 for (std::vector<MSLane::IncomingLaneInfo>::const_iterator it = laneInfos.begin(); it != laneInfos.end(); ++it) {
414 if ((*it).lane->getEdge().isWalkingArea()) {
415 link = (*it).viaLink;
426 Obstacles result(obs1.begin(), obs1.end());
427 for (
int i = 0; i < (int)obs1.size(); ++i) {
428 if ((obs2[i].x - obs1[i].x) * dir < 0) {
438 const PState& ego = *pedestrians[egoIndex];
440 int index = egoIndex + 1;
442 while (index < (
int)pedestrians.size() && ego.
myDir * (pedestrians[index]->myRelX - egoBack) > 0) {
443 const PState& p = *pedestrians[index];
462 SUMOReal currentLength,
int currentDir) {
463 if (nextLanesObs.count(nextLane) == 0) {
474 const int offset = (stripes - nextStripes) / 2;
476 if (nextStripes < stripes) {
478 for (
int ii = 0; ii < stripes; ++ii) {
479 if (ii < offset || ii >= nextStripes + offset) {
480 obs[ii] =
Obstacle(nextDir ==
FORWARD ? 0 : nextLength, 0,
"stripeEnd");
491 nextDir = currentDir;
493 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
494 PState& p = *pedestrians[ii];
496 const SUMOReal newY = relPos.
y() + lateral_offset;
497 if (newY >= minY && newY <= maxY) {
506 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(nextDir));
507 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
508 const PState& p = *pedestrians[ii];
515 for (
int ii = 0; ii < stripes; ++ii) {
518 o.
x = nextLength - o.
x;
521 o.
x += currentLength;
527 nextLanesObs[nextLane] = obs;
529 return nextLanesObs[nextLane];
535 const int mappedStripe = (nextDir == currentDir
537 : nextStripes - 1 - stripe + offset);
538 if (mappedStripe >= 0 && mappedStripe < stripes) {
539 obs[mappedStripe] =
Obstacle(p, nextDir);
546 if (stripe < stripes && obs[stripe].x * dir > x * dir) {
554 const MSLane* lane = it_lane->first;
564 std::set<const WalkingAreaPath*, walkingarea_path_sorter> paths;
565 for (Pedestrians::iterator it = pedestrians.begin(); it != pedestrians.end(); ++it) {
568 if (p->
myDir == dir) {
572 std::cout <<
SIMTIME <<
" debugging WalkingAreaPath from=" << debugPath->
from->
getID() <<
" to=" << debugPath->
to->
getID() <<
"\n";
576 for (std::set<const WalkingAreaPath*, walkingarea_path_sorter>::iterator it = paths.begin(); it != paths.end(); ++it) {
580 transformedPeds.reserve(pedestrians.size());
581 for (Pedestrians::iterator it_p = pedestrians.begin(); it_p != pedestrians.end(); ++it_p) {
586 transformedPeds.push_back(p);
587 if (path == debugPath) std::cout <<
" ped=" << p->
myPerson->
getID() <<
" relX=" << p->
myRelX <<
" relY=" << p->
myRelY <<
" (untransformed), vecCoord="
591 const SUMOReal newY = relPos.
y() + lateral_offset;
599 toDelete.push_back(tp);
600 transformedPeds.push_back(tp);
601 if (path == debugPath) {
602 std::cout <<
" ped=" << p->
myPerson->
getID() <<
" relX=" << relPos.
x() <<
" relY=" << newY <<
" (transformed), vecCoord=" << relPos <<
"\n";
605 if (path == debugPath) {
606 std::cout <<
" ped=" << p->
myPerson->
getID() <<
" relX=" << relPos.
x() <<
" relY=" << newY <<
" (invalid), vecCoord=" << relPos <<
"\n";
613 for (Pedestrians::iterator it_p = toDelete.begin(); it_p != toDelete.end(); ++it_p) {
622 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(dir));
623 for (Pedestrians::iterator it = pedestrians.begin(); it != pedestrians.end();) {
625 if (p->
myDir != dir) {
630 it = pedestrians.erase(it);
652 sort(pedestrians.begin(), pedestrians.end(),
by_xpos_sorter(dir));
653 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
654 PState& p = *pedestrians[ii];
677 nextLanesObs, lane, nextLane, stripes,
715 p.
walk(currentObs, currentTime);
737 description(ped.myPerson->getID()) {
739 if (dir == ped.
myDir) {
758 myRelX(stage->getDepartPos()),
762 myWaitingToEnter(true),
764 myWalkingAreaPath(0),
769 if (route.size() == 1) {
776 std::cout <<
" initialize dir for " <<
myPerson->
getID() <<
" forward=" << mayStartForward <<
" backward=" << mayStartBackward <<
"\n";
778 if (mayStartForward && mayStartBackward) {
782 if (crossingRoute.size() > 1) {
784 const MSEdge* nextEdge = crossingRoute[1];
790 std::cout <<
" crossingRoute=" <<
toString(crossingRoute) <<
"\n";
810 return myPerson->getVehicleType().getLength();
824 const int s = stripe();
828 if (offset > threshold) {
830 }
else if (offset < -threshold) {
835 std::cout.setf(std::ios::fixed , std::ios::floatfield);
836 std::cout << std::setprecision(5);
843 return stripe(myRelY);
849 return otherStripe(myRelY);
855 if (myStage->getNextRouteEdge() == 0) {
856 return myDir * (myStage->getArrivalPos() - myRelX);
858 const SUMOReal length = myWalkingAreaPath == 0 ? myLane->getLength() : myWalkingAreaPath->length;
859 return myDir ==
FORWARD ? length - myRelX : myRelX;
866 const SUMOReal dist = distToLaneEnd();
867 if (myPerson->getID() ==
DEBUG1) {
868 std::cout <<
SIMTIME <<
" myRelX=" << myRelX <<
" dist=" << dist <<
"\n";
876 const int oldDir = myDir;
877 const MSLane* oldLane = myLane;
883 <<
" ped=" << myPerson->getID()
884 <<
" moveToNextLane old=" << oldLane->
getID()
885 <<
" new=" << (myLane == 0 ?
"NULL" : myLane->getID())
886 <<
" oldDir=" << oldDir
887 <<
" newDir=" << myDir
890 myStage->moveToNextEdge(myPerson, currentTime, normalLane ? 0 : &myLane->getEdge());
894 assert(myNLI.lane != oldLane);
896 std::cout <<
" nextLane=" << (myNLI.lane == 0 ?
"NULL" : myNLI.lane->getID()) <<
"\n";
898 if (myLane->getEdge().isWalkingArea()) {
901 assert(myWalkingAreaPath->from != 0);
902 assert(myWalkingAreaPath->to != 0);
903 assert(myWalkingAreaPath->shape.size() >= 2);
905 std::cout <<
" mWAPath shape=" << myWalkingAreaPath->shape <<
" length=" << myWalkingAreaPath->length <<
"\n";
910 myStage->moveToNextEdge(myPerson, currentTime, 0);
915 myWalkingAreaPath = 0;
917 throw ProcessError(
"Disconnected walk for person '" + myPerson->getID() +
"'.");
921 myWalkingAreaPath = 0;
925 const SUMOReal newLength = (myWalkingAreaPath == 0 ? myLane->getLength() : myWalkingAreaPath->length);
926 myRelX = newLength + dist;
931 if (myDir != oldDir) {
935 myRelY += 0.5 * (myLane->getWidth() - oldLane->
getWidth());
946 const int stripes = (int)obs.size();
947 const int sMax = stripes - 1;
949 const SUMOReal vMax = myStage->getMaxSpeed();
951 const int current = stripe();
952 const int other = otherStripe();
953 int chosen = current;
955 std::vector<SUMOReal> utility(stripes);
957 for (
int i = 0; i < stripes; ++i) {
961 std::vector<SUMOReal> distance(stripes);
962 for (
int i = 0; i < stripes; ++i) {
963 distance[i] = myDir * (obs[i].x - myRelX);
966 for (
int i = 0; i < stripes; ++i) {
967 if (distance[i] <= 0) {
969 for (
int j = 0; j <= i; ++j) {
973 for (
int j = i; j < stripes; ++j) {
984 for (
int i = 0; i < reserved; ++i) {
988 for (
int i = sMax; i > sMax - reserved; --i) {
993 for (
int i = 0; i < stripes; ++i) {
994 if (obs[i].speed < 0) {
996 if (myDir ==
FORWARD && i > 0) {
997 utility[i - 1] -= 0.5;
998 }
else if (myDir ==
BACKWARD && i < sMax) {
999 utility[i + 1] -= 0.5;
1006 std::cout <<
" util=" << utility[i] <<
" exp=" << expectedDist <<
"\n";
1008 if (expectedDist >= 0) {
1009 utility[i] += expectedDist;
1017 if (((myDir ==
FORWARD && current == sMax)
1018 || (myDir ==
BACKWARD && current == 0))
1019 && obs[current].speed < 0) {
1024 if (((myDir ==
BACKWARD && current == sMax)
1025 || (myDir ==
FORWARD && current == 0))
1026 && obs[current].speed < 0) {
1031 for (
int i = 0; i < stripes; ++i) {
1032 if (utility[chosen] < utility[i]) {
1037 const int next = (chosen == current ? current : (chosen < current ? current - 1 : current + 1));
1038 const SUMOReal xDist =
MIN3(distance[current], distance[other], distance[next]);
1040 const SUMOReal preferredGap = myPerson->getVehicleType().getMinGap() + xDist * 0.5;
1043 std::cout <<
" xSpeedPotential=" << xSpeed <<
"\n";
1051 if (myWaitingTime >
jamTime || myAmJammed) {
1078 ySpeed = (yDist > 0 ?
1085 <<
" ped=" << myPerson->getID()
1086 <<
" edge=" << myStage->getEdge()->getID()
1090 <<
" pvx=" << mySpeed
1091 <<
" cur=" << current
1092 <<
" cho=" << chosen
1096 <<
" dawdle=" << dawdle
1100 <<
" vMax=" << myStage->getMaxSpeed()
1101 <<
" wTime=" << myStage->getWaitingTime(currentTime)
1102 <<
" jammed=" << myAmJammed
1103 <<
"\n distance=" <<
toString(distance)
1104 <<
" utility=" <<
toString(utility)
1112 myWaitingToEnter =
false;
1123 myPerson->getVehicleType().getImpatience()
1141 if (myWalkingAreaPath == 0) {
1144 return myWalkingAreaPath->shape.positionAtOffset(myRelX, lateral_offset);
1155 const PositionVector& shp = myWalkingAreaPath == 0 ? myLane->getShape() : myWalkingAreaPath->shape;
1166 return myWaitingTime;
1178 return myNLI.lane == 0 ? 0 : &myNLI.lane->getEdge();
1189 std::set<MSPerson*> changedLane;
1194 for (ActiveLanes::const_iterator it_lane =
myModel->getActiveLanes().begin(); it_lane !=
myModel->getActiveLanes().end(); ++it_lane) {
1195 const MSLane* lane = it_lane->first;
1197 if (pedestrians.size() == 0) {
1202 for (
int ii = 0; ii < (int)pedestrians.size(); ++ii) {
1203 const PState& p = *pedestrians[ii];
const Obstacles & getNextLaneObstacles(NextLanesObstacles &nextLanesObs, const MSLane *lane, const MSLane *nextLane, int stripes, SUMOReal nextLength, int nextDir, SUMOReal currentLength, int currentDir)
static NextLaneInfo getNextLane(const PState &ped, const MSLane *currentLane, const MSLane *prevLane)
computes the successor lane for the given pedestrian and sets the link as well as the direction to us...
bool blockedAtDist(const MSLane *lane, SUMOReal distToCrossing, std::vector< const MSPerson * > *collectBlockers)
whether a pedestrian is blocking the crossing of lane at offset distToCrossing
MSEdge & getEdge() const
Returns the lane's edge.
static const SUMOReal SAFETY_GAP
const MSEdge * getNextRouteEdge() const
SUMOReal distToLaneEnd() const
the absolute distance to the end of the lane in walking direction (or to the arrivalPos) ...
MSPerson::MSPersonStage_Walking * myStage
static SUMOReal stripeWidth
model parameters
static int numStripes(const MSLane *lane)
return the maximum number of pedestrians walking side by side
static Obstacles getNeighboringObstacles(const Pedestrians &pedestrians, int egoIndex, int stripes)
SUMOReal mySpeed
the current walking speed
static const MSLane * getNextWalkingArea(const MSLane *currentLane, const int dir, MSLink *&link)
return the next walkingArea in the given direction
static int connectedDirection(const MSLane *from, const MSLane *to)
returns the direction in which these lanes are connectioned or 0 if they are not
WalkingAreaPath * myWalkingAreaPath
the current walkingAreaPath or 0
information regarding surround Pedestrians (and potentially other things)
SUMOReal getLength() const
Returns the lane's length.
The base class for an intersection.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
bool isWalkingArea() const
return whether this edge is walking area
PState(MSPerson *person, MSPerson::MSPersonStage_Walking *stage, const MSLane *lane)
#define ONCOMING_CONFLICT
static SUMOReal rand()
Returns a random real number in [0, 1)
MSPedestrianRouterDijkstra & getPedestrianRouter(const MSEdgeVector &prohibited=MSEdgeVector()) const
SUMOReal getWidth() const
Returns the lane's width.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static MSLane * getSidewalk(const MSEdge *edge)
return the appropriate lane to walk on
const std::string & getID() const
returns the id of the transportable
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary...
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
std::vector< const MSEdge * > ConstMSEdgeVector
std::map< std::pair< const MSLane *, const MSLane * >, WalkingAreaPath > WalkingAreaPaths
bool moveToNextLane(SUMOTime currentTime)
return whether this pedestrian has passed the end of the current lane and update myRelX if so ...
const MSEdgeVector & getIncomingEdges() const
Returns the list of edges from which this edge may be reached.
static MSPModel * myModel
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
static WalkingAreaPaths myWalkingAreaPaths
store for walkinArea elements
SUMOReal x() const
Returns the x-position.
The simulated network and simulation perfomer.
static OptionsCont & getOptions()
Retrieves the options.
static Pedestrians noPedestrians
empty pedestrian vector
static const SUMOReal RESERVE_FOR_ONCOMING_FACTOR
PositionVector reverse() const
void moveInDirection(SUMOTime currentTime, std::set< MSPerson * > &changedLane, int dir)
move all pedestrians forward and advance to the next lane if applicable
NextLaneInfo myNLI
information about the upcoming lane
static const SUMOReal SQUEEZE
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
const std::string & getID() const
Returns the id.
A road/street connecting two junctions.
Pedestrians & getPedestrians(const MSLane *lane)
retrieves the pedestian vector for the given lane (may be empty)
Position getLanePosition(const MSLane *lane, SUMOReal at, SUMOReal offset) const
get position on lane at length at with orthogonal offset
static const SUMOReal LOOKAHEAD_SAMEDIR
void compute(const E *from, const E *to, SUMOReal departPos, SUMOReal arrivalPos, SUMOReal speed, SUMOTime msTime, const N *onlyNode, std::vector< const E * > &into, bool allEdges=false)
Builds the route between the given edges using the minimum effort at the given time The definition of...
static const int UNDEFINED_DIRECTION
SUMOReal getLength() const
return the length of the edge
MSLane * getLogicalPredecessorLane() const
get the most likely precedecessor lane (sorted using by_connections_to_sorter). The result is cached ...
const MSEdge * getEdge() const
Returns the current edge.
static const SUMOReal LATERAL_SPEED_FACTOR
SUMOTime execute(SUMOTime currentTime)
Executes the command.
void walk(const Obstacles &obs, SUMOTime currentTime)
perform position update
A point in 2D or 3D with translation and scaling methods.
static const SUMOReal LOOKAHEAD_ONCOMING
const ConstMSEdgeVector & getRoute() const
MSLane * getLane() const
Returns the connected lane.
StageType getCurrentStageType() const
the current stage type of the container
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
SUMOReal getLength() const
return the length of the pedestrian
SUMOTime getWaitingTime(const MSPerson::MSPersonStage_Walking &stage, SUMOTime now) const
return the time the person spent standing
static Obstacles mergeObstacles(const Obstacles &obs1, const Obstacles &obs2, int dir)
SUMOTime string2time(const std::string &r)
Position getPosition(const MSPerson::MSPersonStage_Walking &stage, SUMOTime now) const
return the network coordinate of the person
std::map< const MSLane *, Obstacles, lane_by_numid_sorter > NextLanesObstacles
SUMOReal getAngle(const MSPerson::MSPersonStage_Walking &stage, SUMOTime now) const
return the direction in which the person faces in degrees
SUMOReal x
position on the current lane
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
bool isInternal() const
return whether this edge is an internal edge
int myDir
the walking direction on the current lane (1 forward, -1 backward)
virtual SUMOTime addEvent(Command *operation, SUMOTime execTimeStep, AdaptType type)
Adds an Event.
SUMOReal getEdgePos(const MSPerson::MSPersonStage_Walking &stage, SUMOTime now) const
abstract methods inherited from PedestrianState
SUMOReal getSpeed(const MSPerson::MSPersonStage_Walking &stage) const
return the current speed of the person
void cleanupHelper()
remove state at simulation end
PedestrianState * add(MSPerson *person, MSPerson::MSPersonStage_Walking *stage, SUMOTime now)
register the given person as a pedestrian
abstract base class for managing callbacks to retrieve various state information from the model ...
void extrapolate(SUMOReal val)
SUMOReal getArrivalPos() const
SUMOReal rotationDegreeAtOffset(SUMOReal pos) const
Returns the rotation at the given length.
void push_back(const PositionVector &p)
Appends all positions from the given vector.
SUMOReal getImpatience(SUMOTime now) const
returns the impatience
std::vector< PState * > Pedestrians
bool myWaitingToEnter
whether the pedestrian is waiting to start its walk
static MSLink * getConnectingLink(const MSLane &from, const MSLane &to)
Returns the link connecting both lanes Both lanes have to be non-internal; 0 may be returned if no co...
The edge is a normal street.
MSLane * getViaLaneOrLane() const
return the via lane if it exists and the lane otherwise
SUMOReal y() const
Returns the y-position.
static size_t dictSize()
Returns the number of edges.
A storage for options typed value containers)
Container for pedestrian state and individual position update function.
std::vector< Obstacle > Obstacles
static const SUMOReal BLOCKER_LOOKAHEAD
static const int BACKWARD
const PositionVector & getShape() const
Returns this lane's shape.
SUMOReal distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
static void addMappedObstacle(Obstacles &obs, const PState &p, int stripe, int currentDir, int nextDir, int offset, int stripes, int nextStripes)
Patch the time in a way that it is at least as high as the simulation begin time. ...
const MSEdge * getNextEdge(const MSPerson::MSPersonStage_Walking &stage) const
return the list of internal edges if the pedestrian is on an intersection
SUMOReal myRelY
the orthogonal shift on the current lane
static const SUMOReal MAX_WAIT_TOLERANCE
bool isCrossing() const
return whether this edge is a pedestrian crossing
SUMOReal myRelX
the advancement along the current lane
const MSJunction * getFromJunction() const
const MSEdgeVector & getSuccessors() const
Returns the following edges.
MovePedestrians * myCommand
the MovePedestrians command that is registered
void push_back_noDoublePos(const Position &p)
static void DEBUG_PRINT(const Obstacles &obs)
const MSLinkCont & getLinkCont() const
returns the container with all links !!!
std::vector< MSEdge * > MSEdgeVector
int myNumActivePedestrians
the total number of active pedestrians
SUMOReal speed
speed relative to ego direction (positive means in the same direction)
const std::vector< IncomingLaneInfo > & getIncomingLanes() const
SUMOReal getMaxSpeed() const
accessors to be used by MSPModel
static void initWalkingAreaPaths(const MSNet *net)
MSPModel_Striping(const OptionsCont &oc, MSNet *net)
Constructor (it should not be necessary to construct more than one instance)
Representation of a lane in the micro simulation.
ActiveLanes myActiveLanes
store of all lanes which have pedestrians on them
static const SUMOReal MIN_STARTUP_SPEED
const MSLane * myLane
the current lane of this pedestrian
bool opened(SUMOTime arrivalTime, SUMOReal arrivalSpeed, SUMOReal leaveSpeed, SUMOReal vehicleLength, SUMOReal impatience, SUMOReal decel, SUMOTime waitingTime, std::vector< const SUMOVehicle * > *collectFoes=0) const
Returns the information whether the link may be passed.
static const SUMOReal LATERAL_PENALTY
static void addCloserObstacle(Obstacles &obs, SUMOReal x, int stripe, const std::string &id, int stripes, int dir)
Obstacle(int dir)
create No-Obstacle
void moveInDirectionOnLane(Pedestrians &pedestrians, const MSLane *lane, SUMOTime currentTime, std::set< MSPerson * > &changedLane, int dir)
move pedestrians forward on one lane
static const Position INVALID
Position transformToVectorCoordinates(const Position &p, bool extend=false) const
return position p within the length-wise coordinate system defined by this position vector...
const MSJunction * getToJunction() const
static bool canTraverse(int dir, const ConstMSEdgeVector &route)
return whether the route may traversed with the given starting direction