//public IPositionSet GetRamSet(int wRank, int hRank) //{ // List<IPosition> lst = new List<IPosition>(); // Position_Point ipos = null; // for (int i = 0; i < 100; i++) // { // ipos = new Position_Point(); // ipos.SetX(RandomMakerAlgorithm.RandomMaker.RapidBetween(0, wRank)); // ipos.SetY(RandomMakerAlgorithm.RandomMaker.RapidBetween(0, hRank)); // lst.Add(ipos); // } // PositionSetEdit_ImplementByICollectionTemplate pSet = new PositionSetEdit_ImplementByICollectionTemplate(lst); // return pSet; //} //public IPositionSet GetRamSet2() //{ // List<IPosition> lst = new List<IPosition>(); // Position_Point ipos = null; // ipos = new Position_Point(); // ipos.SetX(10); // ipos.SetY(20); // lst.Add(ipos); // ipos = new Position_Point(); // ipos.SetX(50); // ipos.SetY(70); // lst.Add(ipos); // ipos = new Position_Point(); // ipos.SetX(50); // ipos.SetY(90); // lst.Add(ipos); // ipos = new Position_Point(); // ipos.SetX(25); // ipos.SetY(30); // lst.Add(ipos); // PositionSetEdit_ImplementByICollectionTemplate pSet = new PositionSetEdit_ImplementByICollectionTemplate(lst); // return pSet; //} private void button1_Click(object sender, EventArgs e) { //painterDialog.Reset(); painterDialog.HoldOnMode(); // RandomPositionSet_InFixedDistribution randomPositionSet1 = new RandomPositionSet_InFixedDistribution //(10000, distributionStyle.GaussianDistribution); // new ConfiguratedByForm(randomPositionSet1); // randomPositionSet1.Produce(); // RandomPositionSet_InFixedDistribution randomPositionSet2 = new RandomPositionSet_InFixedDistribution // (10000, distributionStyle.LaplaceDistribution); // new ConfiguratedByForm(randomPositionSet2); // randomPositionSet2.Produce(); // M2MSCreater_ForGeneralM2MStruture m2m_Creater_ForGeneralM2MStruture = new M2MSCreater_ForGeneralM2MStruture(); // IM2MStructure m2mStructure = m2m_Creater_ForGeneralM2MStruture.Create(randomPositionSet2); // m2mStructure.Preprocessing(randomPositionSet2); painterDialog.Clear(); //painterDialog.DrawPositionSet(randomPositionSet1); //painterDialog.DrawPositionSet(randomPositionSet2); //painterDialog.DrawM2MLevel(m2mStructure.GetLevel(m2mStructure.GetLevelNum() - 1)); //painterDialog.DrawM2MStructure(m2mStructure); //Layer_PositionSet layer = new Layer_PositionSet_Point(GetRamSet2()); //layer.SetPositionSetTransformByM2MLevel(m2mStructure.GetLevel(m2mStructure.GetLevelNum() - 1)); PositionSet_Connected_Config config = new PositionSet_Connected_Config(); new ConfiguratedByForm(config); List <IPosition_Connected_Edit> list = RandomPositionList.generateRandomFloatPositions(config); IPositionSet_Connected pSet = new PositionSet_Connected(list); painterDialog.DrawPositionSet_Connected(pSet); painterDialog.Show(); //painterDialog.Clear(); //painterDialog.DrawPath(GetRamSet(1000, 800)); //painterDialog.DrawPositionSet(GetRamSet(500, 400)); //painterDialog.DrawConvexHull(GetRamSet2()); //painterDialog.DrawSquareFrame(GetRamSet(500, 400)); //painterDialog.Show(); //painterDialog.Reset(); }
private void pathFindingToolStripMenuItem_Click(object sender, EventArgs e) { IPositionSet_Connected positionSet_Connected = (IPositionSet_Connected)positionSetContainer.GetPositionSet(); Dijkstra dijkstra = new Dijkstra(); AStar astar = new AStar(); M2M_PF m2m_PF = new M2M_PF(); IM2MStructure m2mStructure = null; List <IPosition_Connected> m2mPath = null; List <IPosition_Connected> path = null; //计算算法运行时间用 //IPosition_Connected start = null; //IPosition_Connected end = null; ISearchPathEngine searchPathEngine1 = m2m_PF; ISearchPathEngine searchPathEngine2 = dijkstra; m2m_PF.GetM2MStructure += delegate(IM2MStructure m2mS) { m2mStructure = m2mS; }; m2m_PF.GetM2MStructureInPreprocess += delegate(IM2MStructure m2mS) { m2mStructure = m2mS; }; List <ushort> timeStampList = new List <ushort>(); m2m_PF.GetTimeStamp += delegate(ushort timeStamp) { timeStampList.Add(timeStamp); }; searchPathEngine1.InitEngineForMap(positionSet_Connected); searchPathEngine2.InitEngineForMap(positionSet_Connected); //以下代码必须在UI线程中调用,即不能在另开的线程中调用 LayersExOptDlg layers = new LayersExOptDlg(); LayersPainterForm layersPainterForm = new LayersPainterForm(layers); LayersPaintedControl layersPaintedControl = layersPainterForm.LayersPaintedControl; LayersEditedControl layersEditedControl = new LayersEditedControl(); layersEditedControl.Dock = DockStyle.Top; layersEditedControl.LayersPaintedControl = layersPaintedControl; layersPainterForm.Controls.Add(layersEditedControl); layersPainterForm.Show(); //打开一个Worker线程来进行算法流程的演示(否则会阻塞UI线程以至于演示不能进行) IAsyncResult result = new dDemoProcess(delegate { Layer_PositionSet_Connected layer_PositionSet_Connected = new Layer_PositionSet_Connected(positionSet_Connected); layer_PositionSet_Connected.Point.PointColor = Color.Yellow; layer_PositionSet_Connected.Connection.LineColor = Color.Blue; layer_PositionSet_Connected.Connection.LineWidth = 0.6f; layer_PositionSet_Connected.Point.PointRadius = 1.2f; layers.Add(layer_PositionSet_Connected); layer_PositionSet_Connected.SpringLayerRepresentationChangedEvent(layer_PositionSet_Connected); for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++) { Layer_PartSet_Connected layer_PartSet_Connected = new Layer_PartSet_Connected(m2mStructure, levelSequence); layer_PartSet_Connected.Visible = false; layers.Add(layer_PartSet_Connected); } while (true) { IPosition_Connected start = (IPosition_Connected)layersEditedControl.GetMouseDoubleChickedNearestPositionInCurrentPositionSet(positionSet_Connected); PositionSet_ConnectedEdit startPointSet = new PositionSet_ConnectedEdit(); startPointSet.AddPosition_Connected(start); Layer_PositionSet_Point layerStartPoint = new Layer_PositionSet_Point(startPointSet); layerStartPoint.Active = true; layerStartPoint.Point.IsDrawPointBorder = true; layerStartPoint.Point.PointRadius = 5; layerStartPoint.Point.PointColor = Color.PaleGreen; layers.Add(layerStartPoint); layerStartPoint.SpringLayerRepresentationChangedEvent(layerStartPoint); IPosition_Connected end = (IPosition_Connected)layersEditedControl.GetMouseDoubleChickedNearestPositionInCurrentPositionSet(positionSet_Connected); PositionSet_ConnectedEdit endPointSet = new PositionSet_ConnectedEdit(); endPointSet.AddPosition_Connected(end); Layer_PositionSet_Point layerEndPoint = new Layer_PositionSet_Point(endPointSet); layerEndPoint.Active = true; layerEndPoint.Point.IsDrawPointBorder = true; layerEndPoint.Point.PointRadius = 5; layerEndPoint.Point.PointColor = Color.Cyan; layers.Add(layerEndPoint); layerEndPoint.SpringLayerRepresentationChangedEvent(layerEndPoint); CountTimeTool.TimeCounter timeCounter = new CountTimeTool.TimeCounter(); searchPathEngine2.InitEngineForMap(positionSet_Connected); double time2 = timeCounter.CountTimeForRepeatableMethod(delegate { searchPathEngine2.SearchPath(start, end); }); path = searchPathEngine2.SearchPath(start, end); float pathLength2 = ((Dijkstra)searchPathEngine2).GetPathLength(); Console.WriteLine("Dijkstra consume time: " + time2 + " path Length = " + pathLength2); searchPathEngine1.InitEngineForMap(positionSet_Connected); //清空timeStampList以记录寻径过程各层的timeStamp double time1 = timeCounter.CountTimeForRepeatableMethod(delegate { searchPathEngine1.SearchPath(start, end); }); timeStampList.Clear(); m2mPath = searchPathEngine1.SearchPath(start, end); float pathLength1 = ((M2M_PF)searchPathEngine1).GetPathLength(); Console.WriteLine("M2M_PF consume time: " + time1 + " path Length = " + pathLength1); //searchPathEngine1.SearchPath(start, end); if (searchPathEngine1 is M2M_PF && m2mStructure != null) { for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++) { ILevel level = m2mStructure.GetLevel(levelSequence); IPart rootPart = m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0); IPositionSet positionSet = m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0); List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>(); positionSet.InitToTraverseSet(); while (positionSet.NextPosition()) { if (positionSet.GetPosition() is IPart_Multi) { IPart_Multi partMulti = (IPart_Multi)positionSet.GetPosition(); IEnumerable <IPart_Connected> part_ConnectedEnumerable = partMulti.GetSubPartSet(); foreach (IPart_Connected part in part_ConnectedEnumerable) { IPosition_Connected tempPartConnected = (IPosition_Connected)part; if (((Tag_M2M_Part)tempPartConnected.GetAttachment()).isNeedToSearch == true) { if (timeStampList[levelSequence - 1] == ((Tag_M2M_Part)tempPartConnected.GetAttachment()).timeStamp) { position_ConnectedList.Add(tempPartConnected); } } } } else { IPosition_Connected tempPartConnected = (IPosition_Connected)positionSet.GetPosition(); if (((Tag_M2M_Part)tempPartConnected.GetAttachment()).isNeedToSearch == true) { if (timeStampList[levelSequence - 1] == ((Tag_M2M_Part)tempPartConnected.GetAttachment()).timeStamp) { position_ConnectedList.Add(tempPartConnected); } } } } IPositionSet partSet = new PositionSet_Connected(position_ConnectedList); Layer_M2MPartSetInSpecificLevel layer_M2MPartSetInSpecificLevel = new Layer_M2MPartSetInSpecificLevel(m2mStructure.GetLevel(levelSequence), partSet); layer_M2MPartSetInSpecificLevel.Active = true; layer_M2MPartSetInSpecificLevel.Alpha = 100; //layer_M2MPartSetInSpecificLevel. layers.Add(layer_M2MPartSetInSpecificLevel); //PositionSet_Connected partSet_Connected = new PositionSet_Connected(position_ConnectedList); //Layer_PositionSet_Connected layer_PartSet_Connected = new Layer_PositionSet_Connected(partSet_Connected); ////layer_PartSet_Connected.MainColor ////layer_PartSet_Connected.Active = true; //layer_PartSet_Connected.SetPositionSetTransformByM2MLevel(level); //layers.Add(layer_PartSet_Connected); } } if (path != null) { Layer_PositionSet_Path layer = new Layer_PositionSet_Path(new PositionSet_Connected(path)); layer.Active = true; layer.PathLine.LineColor = Color.Black; layer.PathLine.LineWidth = 2; layer.PathPoint.PointRadius = 2; layer.PathPoint.IsDrawPointBorder = true; //layer.EditAble = true; //layer.Point.PointColor = Color.Yellow; //layer.Point.PointRadius = 2; //layer.Point.IsDrawPointBorder = true; layers.Add(layer); layer.SpringLayerRepresentationChangedEvent(layer); } else { this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "There is no path between two node" }); } if (m2mPath != null) { Layer_PositionSet_Path layer = new Layer_PositionSet_Path(new PositionSet_Connected(m2mPath)); layer.Active = true; layer.PathLine.LineColor = Color.Red; layer.PathLine.LineWidth = 2; layer.PathPoint.PointRadius = 2; layer.PathPoint.IsDrawPointBorder = true; //layer.EditAble = true; //layer.Point.PointColor = Color.Yellow; //layer.Point.PointRadius = 2; //layer.Point.IsDrawPointBorder = true; layers.Add(layer); layer.SpringLayerRepresentationChangedEvent(layer); } else { this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "There is no path between two node by M2M_PF" }); } } }).BeginInvoke(null, null); }
private static IPositionSet_Connected ConvertDBFToPositionSet_Connected(string fileFolder) { Dictionary <string, Position_Connected_Edit> boundaryPointDictioinary = new Dictionary <string, Position_Connected_Edit>(); List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>(); int a1 = Create(new StringBuilder("J50F001019\\")); int a2 = Create(new StringBuilder("J50F002020\\")); int a3 = Create(new StringBuilder("J50F001020\\")); int a4 = Create(new StringBuilder("J50F002019\\")); for (int currentDBFIndex = a1; currentDBFIndex <= a4; currentDBFIndex++) { SetCurrentIndex(currentDBFIndex); if ((OpenNodeDBF() == 1) && (OpenRoadDBF() == 1) && (OpenS_ATTDBF() == 1)) { int aTTRecordCount = GetS_ATTRecordCount(); int roadRecordCount = GetRoadRecordCount(); int nodeRecordCount = GetNodeRecordCount(); Position_Connected_Edit[] aryPosition_Connected_Edit = new Position_Connected_Edit[nodeRecordCount]; for (int i = 0; i < nodeRecordCount; i++) { Position_Connected_Edit point = aryPosition_Connected_Edit[i]; //如果之前没有被创建 if (point == null) { //如果是边界点 if (ReadNodeBOUNDARY(i) != 0) { string str = ReadNodeX_COORD(i).ToString() + ReadNodeY_COORD(i).ToString(); //如果没添加进hash表 if (!boundaryPointDictioinary.TryGetValue(str, out point)) { point = new Position_Connected_Edit((float)ReadNodeX_COORD(i), (float)ReadNodeY_COORD(i)); aryPosition_Connected_Edit[i] = point; boundaryPointDictioinary.Add(str, point); } } else { double x = ReadNodeX_COORD(i); double y = ReadNodeY_COORD(i); point = new Position_Connected_Edit((float)x, (float)y); aryPosition_Connected_Edit[i] = point; } } int beginId = ReadNodeBEGS_ID(i); int endId = ReadNodeENDS_ID(i); //if (endId < GetS_ATTRecordCount()) { for (int j = beginId; j < endId; j++) { int roadId = ReadAdjacentRoadID(j) - 1; int FNodeId = ReadRoadFNODE(roadId) - 1; int TNodeId = ReadRoadTNODE(roadId) - 1; int aNodeId = (FNodeId == i) ? TNodeId : FNodeId; bool isConnectToAdjacent = false; bool isAdjacentConnectToCurrentPoint = false; if (FNodeId == i) { if (ReadRoadDIRECTION(roadId) == 1) { isConnectToAdjacent = true; isAdjacentConnectToCurrentPoint = true; } else if (ReadRoadDIRECTION(roadId) == 2) { isConnectToAdjacent = true; } else if (ReadRoadDIRECTION(roadId) == 3) { isAdjacentConnectToCurrentPoint = true; } } else if (TNodeId == i) { if (ReadRoadDIRECTION(roadId) == 1) { isConnectToAdjacent = true; isAdjacentConnectToCurrentPoint = true; } else if (ReadRoadDIRECTION(roadId) == 2) { isAdjacentConnectToCurrentPoint = true; } else if (ReadRoadDIRECTION(roadId) == 3) { isConnectToAdjacent = true; } } //如果存在当前点到邻接点的路径 if (isConnectToAdjacent || isAdjacentConnectToCurrentPoint) { Position_Connected_Edit aNode = aryPosition_Connected_Edit[aNodeId]; //如果该节点未被创建 if (aNode == null) { //如果是边界点 if (ReadNodeBOUNDARY(aNodeId) != 0) { string str = ReadNodeX_COORD(aNodeId).ToString() + ReadNodeY_COORD(aNodeId).ToString(); //如果没添加进hash表 if (!boundaryPointDictioinary.TryGetValue(str, out aNode)) { aNode = new Position_Connected_Edit((float)ReadNodeX_COORD(aNodeId), (float)ReadNodeY_COORD(aNodeId)); aryPosition_Connected_Edit[aNodeId] = aNode; boundaryPointDictioinary.Add(str, aNode); } } else { aNode = new Position_Connected_Edit((float)ReadNodeX_COORD(aNodeId), (float)ReadNodeY_COORD(aNodeId)); aryPosition_Connected_Edit[aNodeId] = aNode; } } if (isConnectToAdjacent) { point.GetAdjacencyPositionSetEdit().AddAdjacency(aNode, (float)ReadRoadLENGTH(roadId)); } if (isAdjacentConnectToCurrentPoint) { aNode.GetAdjacencyPositionSetEdit().AddAdjacency(point, (float)ReadRoadLENGTH(roadId)); } } } } position_ConnectedList.Add(point); } CloseNodeDBF(); CloseRoadDBF(); CloseS_ATTDBF(); } } IPositionSet_Connected positionSet_Connected = new PositionSet_Connected(position_ConnectedList); return(positionSet_Connected); }
private void TestBotton_Click(object sender, EventArgs e) { PainterDialog painterDialog = new PainterDialog(); RandomPositionSet_Connected_Config config = new RandomPositionSet_Connected_Config(); new ConfiguratedByForm(config); IPositionSet_ConnectedEdit pSet = config.Produce(); painterDialog.DrawPositionSet_Connected(pSet); M2MSCreater_ForGeneralM2MStruture m2m_Creater_ForGeneralM2MStruture = new M2MSCreater_ForGeneralM2MStruture(); m2m_Creater_ForGeneralM2MStruture.PartType = typeof(Part_Multi); m2m_Creater_ForGeneralM2MStruture.SetPointInPartFactor(10); m2m_Creater_ForGeneralM2MStruture.SetUnitNumInGridLength(4); IM2MStructure m2mStructure = m2m_Creater_ForGeneralM2MStruture.CreateAutomatically(pSet); m2mStructure.Preprocessing(pSet); painterDialog.DrawM2MStructure(m2mStructure); BuildPartSetConnectionForM2MStructure buildPartSetConnectionForM2MStructure = new BuildPartSetConnectionForM2MStructure(); buildPartSetConnectionForM2MStructure.GetPartSetInSpecificLevel += delegate(ILevel level, int levelSequence, IPositionSet positionSet) { List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>(); positionSet.InitToTraverseSet(); while (positionSet.NextPosition()) { IPart_Multi partMulti = (IPart_Multi)positionSet.GetPosition(); IEnumerable <IPart_Connected> part_ConnectedEnumerable = partMulti.GetSubPartSet(); foreach (IPart_Connected part in part_ConnectedEnumerable) { position_ConnectedList.Add((IPosition_Connected)part); } } PositionSet_Connected positionSet_Connected = new PositionSet_Connected(position_ConnectedList); Layer_PositionSet_Connected layer_PositionSet_Connected = new Layer_PositionSet_Connected(positionSet_Connected); layer_PositionSet_Connected.SetPositionSetTransformByM2MLevel(level); painterDialog.Layers.Add(layer_PositionSet_Connected); painterDialog.Show(); }; buildPartSetConnectionForM2MStructure.TraversalEveryLevelAndBuild(m2mStructure); for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++) { ILevel level = m2mStructure.GetLevel(levelSequence); IPart rootPart = m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0); IPositionSet positionSet = m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0); List <IPosition_Connected> position_ConnectedList = new List <IPosition_Connected>(); positionSet.InitToTraverseSet(); while (positionSet.NextPosition()) { if (positionSet.GetPosition() is IPart_Multi) { IPart_Multi partMulti = (IPart_Multi)positionSet.GetPosition(); IEnumerable <IPart_Connected> part_ConnectedEnumerable = partMulti.GetSubPartSet(); foreach (IPart_Connected part in part_ConnectedEnumerable) { position_ConnectedList.Add((IPosition_Connected)part); } } else { position_ConnectedList.Add((IPosition_Connected)positionSet.GetPosition()); } } PositionSet_Connected positionSet_Connected = new PositionSet_Connected(position_ConnectedList); Layer_PositionSet_Connected layer_PartSet_Connected = new Layer_PositionSet_Connected(positionSet_Connected); //layer_PartSet_Connected.MainColor //layer_PartSet_Connected.Active = true; layer_PartSet_Connected.SetPositionSetTransformByM2MLevel(level); painterDialog.Layers.Add(layer_PartSet_Connected); } painterDialog.Show(); //painterDialog.Show(); }