Esempio n. 1
0
        /// <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();
            }
        }
Esempio n. 2
0
 public static RoadNet GetInstance()
 {
     if (_roadNet == null)
     {
         //防止多线程创建了多个实例
         System.Threading.Mutex mutext = new System.Threading.Mutex();
         mutext.WaitOne();
         _roadNet            = new RoadNet();
         _roadNet.EntityType = EntityType.RoadNet;
         mutext.Close();
         mutext = null;
     }
     return(RoadNet._roadNet);
 }
Esempio n. 3
0
 /// <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();
     }
 }
Esempio n. 4
0
 public Way BulidWay(OxyzPointF start, OxyzPointF end)
 {
     return(RoadNet.GetInstance().BulidEntity(start, end, EntityType.Way) as Way);
 }