internal virtual void DriveMobile(MobileEntity mobile, DriveCtx dctx)
        {
            var currLane = mobile.Container as Lane;
            var currWay  = currLane.Container as Way;

            if (dctx.IsReachEnd == true)
            {
                currLane.Mobiles.RemoveFirst();
                return;
            }

            //Before updating mobiles status,update that on roadNode
            //the following four funtions are in charge of making decisions,not executing
            this.LaneChanging(dctx);         //换道
            this.Accelerate(dctx);           //符合条件就加速
            this.Decelerate(dctx);           //否则减速
            this.NormalRun(dctx);            //更新位置

            //To execute params setted hereinbefore

            // if a mobile stops ,it must be blocked by traffic light or a mobile ahead
            if (dctx.Params.iMoveY == 0)
            {
                return;
            }
            //还在路段内部
            if (dctx.Params.iMoveY <= dctx.iLaneGap)
            {
                mobile.Move(dctx.Params.iMoveY);
                mobile.iSpeed        = dctx.Params.iSpeed;
                mobile.iAcceleration = dctx.Params.iAcceleration;
            }
            else              //进入了交叉口
            {
                //原有的车道删除该车辆
                currLane.Mobiles.RemoveFirst();

                //进入交叉口
                mobile.Container = currWay.XNodeTo;
                //calculate steps  to move in a xnode
                int iXNodeMoveStep = dctx.Params.iMoveY - dctx.iLaneGap;

                //recalculate moblie shape position
                mobile.Move(iXNodeMoveStep);
                //进入交叉口的等待队列
                currWay.XNodeTo.MobilesInn.Enqueue(mobile);
            }

            mobile.iAcceleration = Math.Max(dctx.Params.iAcceleration, 1);
            mobile.iSpeed        = dctx.Params.iSpeed;
        }
        internal virtual void DriveMobile(MobileEntity mobile, DriveCtx dctx)
        {
            var currNode = mobile.Container as XNode;

            //控制权转移出去了
            this.LaneChanging(dctx);         //换道
            this.Accelerate(dctx);           //符合条件就加速

            this.Decelerate(dctx);           //否则减速
            this.NormalRun(dctx);            //更新位置

//			if (mobile.ID ==2) {
//				;
//			}
            //still runing within a xnode
            if (dctx.Params.iMoveY <= dctx.iXNodeGap && dctx.iXNodeGap > 0)
            {
                //modify a mobiles's position
                mobile.Move(dctx.Params.iMoveY);
            }
            else             //enter a lane from its container xnode
            {
                if (dctx.Params.iMoveY > dctx.iFrontHeadWay)
                {
                    ThrowHelper.ThrowArgumentException("前进距离大于车头时距会导致撞车");
                }

                currNode.Mobiles.Remove(mobile);

                int iXNodeStep = dctx.Params.iMoveY - dctx.iXNodeGap;

                var toLane = mobile.Track.ToLane;
                if (toLane != null)
                {
                    toLane.MobilesInn.Enqueue(mobile);

                    //tempraryly modify mobile to get prepareed for moving
                    //mobile.Shape.Start = toLane.Shape.Start;//bug here to modified in the future
                    mobile.Container = toLane;                  //a moible cross a lane and a xnode since it has a ilength

                    mobile.Move(iXNodeStep);
                }
            }

            mobile.iAcceleration = Math.Max(dctx.Params.iAcceleration, 1);
            mobile.iSpeed        = dctx.Params.iSpeed;
        }