Ejemplo n.º 1
0
        public override void FillSerisCollection(SeriesCollection dataSRC)
        {
            int iC = 0;

            foreach (IDataRecorder <int, CarTrack> itemEntity in ISC.DataRecorder.Values)
            {
                foreach (KeyValuePair <int, CarTrack> item in itemEntity)//carinfo Queue
                {
                    if (iC++ == 2)
                    {
                        break;
                    }
                    Series dataI = dataSRC.FindByName(item.Key.ToString());

                    //同一辆车在不同的位置
                    if (dataI == null)
                    {
                        dataI             = new Series(item.Key.ToString());
                        dataI.MarkerStyle = MarkerStyle.Diamond;
                        dataI.ChartType   = SeriesChartType.Line;
                        dataSRC.Add(dataI);
                    }

                    foreach (var itemCarInfo in item.Value)//车辆信息
                    {
                        OxyzPointF p = this.CalcChartData(itemCarInfo);
                        dataI.Points.AddXY((double)p._X, (double)p._Y);
                    }
                }
                break;
            }
        }
Ejemplo n.º 2
0
        public OxyzPointF ProjectTest(OxyzPointF mp, int iScaleFactor)
        {
            OxyzPointF result = Coordinates.Project(mp, iScaleFactor);

            return(result);
            // TODO: 将断言添加到 方法 CoordinatesTest.ProjectTest(OxyzPointF, Int32)
        }
Ejemplo n.º 3
0
        //private Dictionary<int, MobileEntity> hashMat = new Dictionary<int, MobileEntity>();
        /// <summary>
        /// 判断元胞是否被占用了
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        internal bool IsOccupied(OxyzPointF opP)
        {
//			var mobileNode = base.First;
//			//update mobile on a lane one by one
//			while(mobileNode!=null) {
//				var mobile = mobileNode.Value;
//				//mobile is possibaly be deleted
//
//				if (mobile.IsMoved==true) {
//					//switch off
//					mobile.IsMoved = false;
//
//					foreach (var prevShap in mobile.PrevShape) {
//						int iKey = prevShap.GetHashCode();
//						if (this.hashMat.ContainsKey(iKey)==true) {
//							this.hashMat.Remove(iKey);
//						}
//
//					}
//
//					foreach (var Shap in mobile.Shape) {
//						int iKey = Shap.GetHashCode();
//						if (this.hashMat.ContainsKey(iKey)==false) {
//							this.hashMat.Add(iKey,mobile);
//						}
//					}
//
//				}
//				mobileNode = mobileNode.Next;
//			}
//
//			return this.hashMat.ContainsKey(opP.GetHashCode());

            //-----------------------------------------------------------
            var mobileNode = base.First;

            //update mobile on a lane one by one
            while (mobileNode != null)
            {
                var mobile = mobileNode.Value;
                //	mobile is possibaly deleted
                foreach (var Shap in mobile.Shape)
                {
                    if (Shap.Equals(opP))
                    {
                        return(true);
                    }
                }
                mobileNode = mobileNode.Next;
            }

            return(false);
            //-----------------------------------------------------------
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 用图形界面坐标系,转化为元胞坐标系,create a shape of a lane
        /// </summary>
        /// <param name="eShape"></param>
        internal void CreateShape()
        {
            EntityShape prant = this.Container.Shape;
            var         pNorm = VectorTool.GetNormal(this.Container.ToVector());

            foreach (var point in prant)
            {
                int iScaler  = this.Rank;
                var newPoint = Coordinates.Offset(point, OxyzPointF.Muilt(pNorm, iScaler));
                this.Shape.Add(newPoint);
            }
        }
Ejemplo n.º 5
0
        private void PanScreen_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle)
            {
                //界面重绘 要不然,两次绘制的界面叠加到了一起了。
                this.Invalidate();
                // 向量的坐标等于终点坐标
                var offsetVector = new OxyzPointF(e.X - pStart.X, e.Y - pStart.Y);
                Coordinates.GraphicsOffset = offsetVector;

                //this.tsslMsgTip.Text = string.Empty;// "退出了平移模式";
                this.Cursor = Cursors.Arrow;
            }
        }
Ejemplo n.º 6
0
        internal XNode(OxyzPointF pointCenter)
        {
            this._entityID   = ++iXNodeID;
            this.EntityType  = EntityType.XNode;
            this.SpatialGrid = pointCenter;


            Random rd = new Random();

            this.GISGrid = new OxyzPointF(rd.Next(65535), rd.Next(65535));
            // 直接使用上下文的数据结构,bug不应当使用上下文结构
            if (this.GISGrid._X == 0.0f && this.GISGrid._Y == 0.0f)
            {
                ThrowHelper.ThrowArgumentNullException("RoadNode产生了零坐标!");
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// create xnode way road and lane.
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="et"></param>
        /// <returns></returns>
        public StaticOBJ Build(OxyzPointF start, OxyzPointF end, EntityType et)
        {
            var net = RoadNet.GetInstance();

            switch (et)
            {
            case EntityType.Road:
                var road = new Road();

                road.Way       = this.Build(start, end, EntityType.Way) as Way;
                road.CtrWay    = this.Build(end, start, EntityType.Way) as Way;
                road.Container = net;

                //register
                net.roads.Add(road.GetHashCode(), road);                       //register
                return(road);

            ///avoid to create a xnode
            case EntityType.XNode:
                var node = new XNode(start);

                node.Container = net;
                net.xnodes.Add(node.GetHashCode(), node);                       //register
                return(node);

            case EntityType.Way:
                var way = new Way(start, end);
                //way.AddLane(LaneType.Straight);
                //way.Container = net;
                net.ways.Add(way.GetHashCode(), way);                       //register

                return(way);

            //break;
            case EntityType.Lane:

                throw new Exception("lane should be builded by way");
                break;

            default:
                break;
            }
            throw new  ArgumentException("无法创建参数指定的构造型");
        }
Ejemplo n.º 8
0
        public void test1()
        {
            OxyzPointF of    = new OxyzPointF(0, 0, 0.00001);
            OxyzPointF two   = new OxyzPointF(0, 0, 1);
            OxyzPointF three = new OxyzPointF(0, 0, 2);

            if (of == two)
            {
                Assert.Fail();
            }
            if (of == three)
            {
                Assert.Fail();
            }
            if (of != OxyzPointF.Default)
            {
                Assert.Fail();
            }

            //Assert.AreEqual(of, three);
        }
Ejemplo n.º 9
0
        /// <summary>
        ///画一个矩形表示交叉口
        /// </summary>
        private void DrawXnode(IEntity te)
        {
            XNode rN = te as XNode;

            //计算交叉口矩形
            int iPixels = GraphicsSetter.iPixels;

            //计算左上角的屏幕坐标
            int        iOffset = rN.Length / 2;
            OxyzPointF pStart  = new OxyzPointF(rN.SpatialGrid._X - iOffset, rN.SpatialGrid._Y - iOffset);

            int        iHO = iOffset / 2;
            OxyzPointF pA  = new OxyzPointF(pStart._X + iHO, pStart._Y);
            OxyzPointF pB  = new OxyzPointF(pStart._X + iHO * 3, pStart._Y);

            OxyzPointF pC = new OxyzPointF(pStart._X, pStart._Y + iHO);
            OxyzPointF pD = new OxyzPointF(pStart._X, pStart._Y + iHO * 3);

            OxyzPointF pE = new OxyzPointF(pStart._X + iHO, pStart._Y + iHO * 4);
            OxyzPointF pF = new OxyzPointF(pStart._X + iHO * 3, pStart._Y + iHO * 4);

            OxyzPointF pG = new OxyzPointF(pStart._X + iHO * 4, pStart._Y + iHO);
            OxyzPointF pI = new OxyzPointF(pStart._X + iHO * 4, pStart._Y + iHO * 3);

            var pA1 = Coordinates.Project(pA, iPixels).ToPointF();
            var pB1 = Coordinates.Project(pB, iPixels).ToPointF();

            var pC1 = Coordinates.Project(pC, iPixels).ToPointF();
            var pD1 = Coordinates.Project(pD, iPixels).ToPointF();

            var pE1 = Coordinates.Project(pE, iPixels).ToPointF();
            var pF1 = Coordinates.Project(pF, iPixels).ToPointF();

            var pG1 = Coordinates.Project(pG, iPixels).ToPointF();
            var pI1 = Coordinates.Project(pI, iPixels).ToPointF();

            PointF[] pits = { pD1, pC1, pA1, pB1, pG1, pI1, pF1, pE1 };
            _graphic.FillPolygon(new SolidBrush(GraphicsSetter.roadColor), pits);
        }
Ejemplo n.º 10
0
        //private Track(){}

        public OxyzPointF NextPoint(OxyzPointF iCurrPoint)
        {
            OxyzPointF iNew = iCurrPoint;
            //算法保证每一个时间步长内都向目标终点接近,就是为了让其到终点的距离变小
            int iX = (int)(iCurrPoint._X - this.To._X);            //当前位置减去目的位置
            int iY = (int)(iCurrPoint._Y - this.To._Y);

            ///////////////////////////////
//			int iX = iCurrPoint._X - op._X;//当前位置减去目的位置
//			int iY = iCurrPoint._Y - op._Y;
            if (iX != 0)            //等于0的情况什么也不做
            {
                iNew._X = iX > 0 ? --iNew._X : ++iNew._X;
            }
            if (iY != 0)            //等于0的情况什么也不做
            {
                iNew._Y = iY > 0 ? --iNew._Y : ++iNew._Y;
            }
            if (iX == 0 && iY == 0)      ///已经到达了目标地点,两个点的坐标差值为0
            {
                iNew = new OxyzPointF(0, 0);
            }
            return(iNew);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 计算mobile在交叉口内部可以走多少步
        /// </summary>
        /// <param name="rN"></param>
        /// <param name="pCurrent">current position</param>
        /// <param name="Gap">return value</param>
        /// <returns></returns>
        private bool GetXNodeGap(XNode node, OxyzPointF opCurr, out int iGap, MobileOBJ mobile)
        {
            //indicator to tell whether or not  a mobile is blocked
            //bool bReachEnd = false;
            bool bOccupied = false;
            int  iCount    = 0;

            OxyzPointF p = mobile.Track.NextPoint(opCurr);

            while ((bOccupied = node.IsOccupied(p)) == false)
            {
                if (p._X == 0 && p._Y == 0)
                {
//					bReachEnd = true;
                    break;
                }
                p = mobile.Track.NextPoint(p);

                iCount++;
            }
            iGap = iCount;
            //return bReachEnd
            return(bOccupied);
        }
Ejemplo n.º 12
0
        internal static void Paint(LinkedList <MobileOBJ> mobiles, Graphics _graphic)
        {
            int iWidth = GraphicsSetter.iPixels;

            foreach (var mobile in mobiles)
            {
                for (int i = 0; i < mobile.Shape.Count; i++)
                {
                    var mobilePrev  = mobile.PrevShape[i];
                    var mobileShape = mobile.Shape[i];

                    OxyzPointF opCurr = Coordinates.Project(mobileShape, iWidth);
                    OxyzPointF opPrev = Coordinates.Project(mobilePrev, iWidth);

                    //up left offset under screen coordinates
                    PointF pfPrev = Coordinates.Offset(opPrev, iWidth / 2).ToPointF(); //move upleft for a step.
                    PointF pfCurr = Coordinates.Offset(opCurr, iWidth / 2).ToPointF(); //move upleft for a step.

                    //PointF pfPrev = Coordinates.Offset(ofPrev, GraphicsSetter.baseOffset).ToPointF();//move upleft for a step.
                    //PointF pfCurr = Coordinates.Offset(ofCurr, GraphicsSetter.baseOffset).ToPointF();//move upleft for a step.

                    if (!mobilePrev.Equals(mobileShape))  //cover old track
                    {
                        _graphic.FillEllipse(new SolidBrush(GraphicsSetter.roadColor), pfPrev.X, pfPrev.Y, iWidth, iWidth);
                    }
                    //_graphic.draw
                    _graphic.FillEllipse(new SolidBrush(mobile.Color), pfCurr.X, pfCurr.Y, iWidth, iWidth);
                    //for debug
//					string strMsg="CurrX:"+opCurr._X.ToString()+":PrevX"+opPrev._X.ToString();
//					strMsg+="Mxy:"+mobile.Track.Current._X.ToString()+mobile.Track.Current._Y.ToString();
//					//	strMsg+="CtnerX:"+mobile.Container.Shape.Start._X.ToString();
//					PointF pF=  Coordinates.Project(mobileShape, iWidth);
//					_graphic.DrawString(strMsg,new Font("Arial",6),new SolidBrush(Color.Red),pfCurr.X+30f,pfCurr.Y);
                }
            }
        }
Ejemplo n.º 13
0
 /// <summary>
 /// 判断指定车道前部第Ahead个位置处是否有元胞占据
 /// </summary>
 public bool IsOccupied(OxyzPointF opPoint)
 {
     //if this point is not added to dictionary ,add it then
     //return this._occupiedPoints.;
     return(this.Mobiles.IsOccupied(opPoint));
 }
Ejemplo n.º 14
0
        /// <summary>
        /// 在转弯的时候调用,根据车辆路径,寻找车辆要进入的下一条车道(左右转、直行)。从起始位置出发,前进iAheadSpace个间距时距
        /// </summary>
        internal virtual void Update()
        {
            if (this.mobile == null)
            {
                ThrowHelper.ThrowArgumentException("a track has no mobile before updating ,assigned one to it through constructor  internal Track(MobileEntity me) ");
            }
            if (mobile.Container.EntityType == EntityType.XNode)
            {
                return;
            }

            Lane currLane = mobile.Container as Lane;
            //get its tolane
            var currWay = currLane.Container as Way;
            var nextWay = this.mobile.Route.FindNext(currWay);

            //shape end means a point on a narrow like "---->"
            //a signal light is playing at a lane's shape end
            this.FromLane = currLane;
            this.opFrom   = currLane.Shape.End;


            if (nextWay == null)              //a moblie is reaching its destination
            {
                this.ToLane = null;
                //	this.opTo = OxyzPointF.Default;
                this.opTo = currLane.Shape.End;
                return;
            }

            int iTurn = mobile.Route.GetDirection(currWay);

            //车辆直行
            switch (iTurn)
            {
            case 0:
                //go straight foword
                if (nextWay.Lanes.Count < currLane.Rank)                          //next way has less lanes than a mobiles'current one

                {
                    int iIdx = new Random(1).Next(nextWay.Lanes.Count) - 1;
                    iIdx        = iIdx < 0?0:iIdx;
                    this.ToLane = nextWay.Lanes[iIdx];
                }
                else                               //otherwise 目标车道数大于于本车道数
                {
                    this.ToLane = nextWay.Lanes[currLane.Rank - 1];
                }

                break;

            case 1:                    //turn right
                //the outside lane is rightful for a mobile obeying traffic  regulations
                this.ToLane = nextWay.Lanes[nextWay.Lanes.Count - 1];
                break;

            case -1:                    //turn left
                                        //	int iIndex = new Random(1).Next(nextWay.Lanes.Count) - 1;
                this.ToLane = nextWay.Lanes[0];
                break;

            case 2:                    //turn back
                //while truning backward a inside lane is rightful
                this.ToLane = nextWay.Lanes[0];
                break;
            }

            //shape start means a point at the end of a narrow like "---->"
            this.opTo = this.ToLane.Shape.Start;
        }
Ejemplo n.º 15
0
        public StaticOBJ BulidEntity(OxyzPointF start, OxyzPointF end, EntityType et)
        {
            IStaticFactory IFacotry = new StaticFactory();

            return(IFacotry.Build(start, end, et));
        }
Ejemplo n.º 16
0
 public Way BulidWay(OxyzPointF start, OxyzPointF end)
 {
     return(RoadNet.GetInstance().BulidEntity(start, end, EntityType.Way) as Way);
 }