/// <summary> /// 由负责添加的类进行仿真上下文同步,内部进行了RoadLane注册 /// </summary> /// <param name="rl"></param> internal void AddLane(Lane rl) { if (rl != null) { //防止添加了较多的车道 if (this.Lanes.Count == SimSettings.iMaxLanes) { throw new ArgumentOutOfRangeException("无法添加超过" + SimSettings.iMaxLanes + "个车道"); } rl.Container = this; //两行代码一定不要高反了 RoadNet.GetInstance().lanes.Add(rl.GetHashCode(), rl); // rl.Register();// //同步仿真上下文的数据记录 //按照laneRanking 和laneType排序,插入到合适的位置并且给予恰当的 //laneRanking便于进行坐标索引 int i = this._lanes.Count; if (i == 0) //第一个要添加的车道 { this._lanes.Add(rl); rl.Rank = 1; } while (i-- >= 1) //个数超过一个车道进行插入操作 { Lane rLane = this._lanes[i]; //i已经变小了一个数 if (rLane.laneType > rl.laneType) { //将后续大的laneRanking的值增1 rLane.Rank += 1; if (i == 0) { this.Lanes.Insert(0, rl); //插入最右边的车道 rl.Rank = 1; } } //rank最大的一个相同车道 if (rLane.laneType <= rl.laneType) { //插入新的lane,当前索引是i,要插入之后,索引应当是i+1 this._lanes.Insert(i + 1, rl); //rl.Rank = i+2;//rank 比索引大1 rl.Rank = i + 2; // this.Lanes.Count; break; } } //this.ilength =端点的长度//端点坐标之间的距离 } else { throw new ArgumentNullException(); } }
/// <summary> /// 由负责删除的类进行仿真上下文同步 /// </summary> /// <param name="rl"></param> //[System.Obsolete("应当根据实际的情况确定删除车道需要的函数类型")] internal void RemoveLane(Lane rl) { if (rl != null) { for (int i = rl.Rank; i < this.Lanes.Count; i++) { this.Lanes[i].Rank -= 1; } this._lanes.Remove(rl); //第rank个车道是第rank-1个类型 //同步仿真上下文的数据记录 RoadNet.GetInstance().lanes.Remove(rl.GetHashCode()); //进行反注册 } else { throw new ArgumentNullException(); } }