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); }
public void TraversalEveryLevelAndBuild(IM2MStructure m2mStructure) { IPart rootPart = m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0); IPositionSet bottonLevelPositionSet = m2mStructure.GetBottonLevelPositionSetByAncestorPart(rootPart, 0); bottonLevelPositionSet.InitToTraverseSet(); while (bottonLevelPositionSet.NextPosition()) { ((IPosition_Connected)(bottonLevelPositionSet.GetPosition())).SetAttachment(new Tag_M2M_Position()); } //遍历每一层 for (int levelSequence = m2mStructure.GetLevelNum() - 1; levelSequence >= 0; levelSequence--) { Queue <PositionAndPositon> partAndPositonQueue = new Queue <PositionAndPositon>(); bool isPart = true; ILevel currentLevel = m2mStructure.GetLevel(levelSequence); IPositionSet currrentLevelPositionSet = null; //如果处于最底层 if (levelSequence == m2mStructure.GetLevelNum() - 1) { isPart = false; } if (levelSequence == 0) { IPositionSetEdit temp = new Position_Implement.PositionSetEdit_ImplementByICollectionTemplate(); temp.AddPosition(rootPart); currrentLevelPositionSet = temp; } else { currrentLevelPositionSet = m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0); } currrentLevelPositionSet.InitToTraverseSet(); //遍历每一个分块 while (currrentLevelPositionSet.NextPosition()) { List <IPart_Connected> SubPartList = new List <IPart_Connected>(); IPart_Multi currentMultiPart = (IPart_Multi)(currrentLevelPositionSet.GetPosition()); //计算part的边界 float minSequenceX; float maxSequenceX; float minSequenceY; float maxSequenceY; if (isPart) { float unitNumInLength = (int)(m2mStructure.GetLevel(levelSequence + 1).GetUnitNumInHeight() / currentLevel.GetUnitNumInHeight()); minSequenceX = currentMultiPart.GetX() * unitNumInLength; maxSequenceX = minSequenceX + unitNumInLength; minSequenceY = currentMultiPart.GetY() * unitNumInLength; maxSequenceY = minSequenceY + unitNumInLength; } else { minSequenceX = currentLevel.ConvertPartSequenceXToRealValue(currentMultiPart.GetX()); maxSequenceX = minSequenceX + currentLevel.GetGridWidth(); minSequenceY = currentLevel.ConvertPartSequenceYToRealValue(currentMultiPart.GetY()); maxSequenceY = minSequenceY + currentLevel.GetGridHeight(); } IPositionSet childPositionSetOfCurrentPart = m2mStructure.GetChildPositionSetByParentPart(levelSequence, currentMultiPart); childPositionSetOfCurrentPart.InitToTraverseSet(); //遍历每一个子分块或点 while (childPositionSetOfCurrentPart.NextPosition()) { if (isPart) { IPart_Multi childPartMulti = (IPart_Multi)childPositionSetOfCurrentPart.GetPosition(); foreach (IPosition_Connected currentPosition_Connected in childPartMulti.GetSubPartSet()) { BFSInOnePoint(partAndPositonQueue, isPart, SubPartList, currentMultiPart, minSequenceX, maxSequenceX, minSequenceY, maxSequenceY, currentPosition_Connected); } } else { IPosition_Connected currentPosition_Connected = (IPosition_Connected)childPositionSetOfCurrentPart.GetPosition(); BFSInOnePoint(partAndPositonQueue, isPart, SubPartList, currentMultiPart, minSequenceX, maxSequenceX, minSequenceY, maxSequenceY, currentPosition_Connected); } } //遍历每一个子分块结束 currentMultiPart.SetSubPartSet(SubPartList); } //遍历完某层的每个分块 //处理还没建立链接的点和分块对 foreach (PositionAndPositon pap in partAndPositonQueue) { IPosition_Connected position_Connected = pap.position; IPart_Connected currentParentPart = GetParentPart(position_Connected, isPart); IPart_Connected currentParentPart2 = GetParentPart(pap.positionInExistPart, isPart); float distance = CalculateTheDistanceBetweenTwoPosition(currentParentPart2, currentParentPart); IPositionSet_Connected_AdjacencyEdit positionSet_Connected_Adjacency = currentParentPart2.GetAdjacencyPositionSetEdit(); bool isContain = false; positionSet_Connected_Adjacency.InitToTraverseSet(); while (positionSet_Connected_Adjacency.NextPosition()) { if (positionSet_Connected_Adjacency.GetPosition() == currentParentPart) { isContain = true; break; } } if (isContain) { continue; } else { positionSet_Connected_Adjacency.AddAdjacency(currentParentPart, distance); } positionSet_Connected_Adjacency = currentParentPart.GetAdjacencyPositionSetEdit(); isContain = false; positionSet_Connected_Adjacency.InitToTraverseSet(); while (positionSet_Connected_Adjacency.NextPosition()) { if (positionSet_Connected_Adjacency.GetPosition() == currentParentPart2) { isContain = true; break; } } if (isContain) { continue; } else { positionSet_Connected_Adjacency.AddAdjacency(currentParentPart2, distance); } } #region code for algorithm demo if (GetPartSetInSpecificLevel != null) { GetPartSetInSpecificLevel(m2mStructure.GetLevel(levelSequence), levelSequence, m2mStructure.GetDescendentPositionSetByAncestorPart(levelSequence, rootPart, 0)); } #endregion } //遍历每一层结束 }
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(); }
private void BFSInOnePoint(Queue <PositionAndPositon> PositionAndPositonQueue, bool isPart, List <IPart_Connected> SubPartList, IPart_Multi currentMultiPart, float minSequenceX, float maxSequenceX, float minSequenceY, float maxSequenceY, IPosition_Connected currentPosition_Connected) { //如果没有被搜索 if (GetParentPart(currentPosition_Connected, isPart) == null) { IPart_Connected currentPart_Connected = currentMultiPart.CreateSubPart(); currentPart_Connected.SetAttachment(new Tag_M2M_Part()); currentPart_Connected.SetX(currentMultiPart.GetX()); currentPart_Connected.SetY(currentMultiPart.GetY()); bool isNeedToAddToSubPartList;// = true; SubPartList.Add(currentPart_Connected); currentPart_Connected.AddToSubPositionList(currentPosition_Connected); SetParentPart(currentPosition_Connected, currentPart_Connected, isPart); //以当前点为起始点做墨滴搜索 Queue <IPosition_Connected> OpenTable = new Queue <IPosition_Connected>(); OpenTable.Enqueue(currentPosition_Connected); //如果Open表还有元素则继续取出 while (OpenTable.Count > 0) { IPosition_Connected currentCenterPosition_Connected = OpenTable.Dequeue(); IPositionSet_Connected_Adjacency currentPositionAdjacencyPositionSet = currentCenterPosition_Connected.GetAdjacencyPositionSet(); currentPositionAdjacencyPositionSet.InitToTraverseSet(); while (currentPositionAdjacencyPositionSet.NextPosition()) { IPosition_Connected adjPosition_Connected = currentPositionAdjacencyPositionSet.GetPosition_Connected(); float pX = adjPosition_Connected.GetX(); float pY = adjPosition_Connected.GetY(); //如果分块在当前分块之内 if (pX >= minSequenceX && pX < maxSequenceX && pY >= minSequenceY && pY < maxSequenceY) { IPart_Connected parentPart = GetParentPart(adjPosition_Connected, isPart); //如果该分块还没被搜索 if (parentPart == null) { currentPart_Connected.AddToSubPositionList(adjPosition_Connected); SetParentPart(adjPosition_Connected, currentPart_Connected, isPart); //放进Open表 OpenTable.Enqueue(adjPosition_Connected); } //如果父分块不为null,则表明该分块之前已经被搜索过,刚搜索到的分块与原分块连通 else if (parentPart != currentPart_Connected) { isNeedToAddToSubPartList = false; //把原来的父分块设为新的父分块 IPositionSet tempPositionSet = parentPart.GetTrueChildPositionSet(); tempPositionSet.InitToTraverseSet(); while (tempPositionSet.NextPosition()) { IPosition_Connected temp = (IPosition_Connected)tempPositionSet.GetPosition(); SetParentPart(temp, currentPart_Connected, isPart); currentPart_Connected.AddToSubPositionList(temp); } SubPartList.Remove(parentPart); } } //如果不在当前分块里面 else { //如果在当前分块外的点还没被搜索(即还没被制定其父分块)则把其放进partAndPositonQueue IPart_Connected currentParentPart = GetParentPart(adjPosition_Connected, isPart); PositionAndPositonQueue.Enqueue(new PositionAndPositon(currentCenterPosition_Connected, adjPosition_Connected)); //if (currentParentPart == null) //{ // PositionAndPositonQueue.Enqueue(new PositionAndPositon(currentCenterPosition_Connected, adjPosition_Connected)); //} ////如果在当前分块外的点已经分配父分块,则建立两父分块间的链接关系。 //else //{ // currentPart_Connected.GetAdjacencyPositionSetEdit().AddAdjacency(currentParentPart, CalculateTheDistanceBetweenTwoPosition(currentPart_Connected, currentParentPart)); //} } } } } }