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; } }
public OxyzPointF ProjectTest(OxyzPointF mp, int iScaleFactor) { OxyzPointF result = Coordinates.Project(mp, iScaleFactor); return(result); // TODO: 将断言添加到 方法 CoordinatesTest.ProjectTest(OxyzPointF, Int32) }
//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); //----------------------------------------------------------- }
/// <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); } }
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; } }
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产生了零坐标!"); } }
/// <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("无法创建参数指定的构造型"); }
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); }
/// <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); }
//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); }
/// <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); }
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); } } }
/// <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)); }
/// <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; }
public StaticOBJ BulidEntity(OxyzPointF start, OxyzPointF end, EntityType et) { IStaticFactory IFacotry = new StaticFactory(); return(IFacotry.Build(start, end, et)); }
public Way BulidWay(OxyzPointF start, OxyzPointF end) { return(RoadNet.GetInstance().BulidEntity(start, end, EntityType.Way) as Way); }