private void TestForViewer(object sender, EventArgs e) { painterDialog.Show(); 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.CreateAutomatically(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)); //painterDialog.Painter.Layers.Add(layer); 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(); }
public Layer_M2MStructure(IM2MStructure m2mStructure) { this.m2mStructure = m2mStructure; layerList = new Layer_M2MLevel[m2mStructure.GetLevelNum()]; for (int i = 0; i < layerList.Length; i++) { layerList[i] = new Layer_M2MLevel(m2mStructure.GetLevel(i)); } UpdateLayerListTransform(); maxRect = layerList[0].MaxRect; }
public override void Draw(Graphics graphics) { if (Visible) { Color tempColor = GridColor; for (int i = m2mStructure.GetLevelNum() - 1; i > 0; i--) { layer_Grid = new Layer_Grid(m2mStructure.GetLevel(i)); layer_Grid.ScreenScaleX = this.ScreenScaleX; layer_Grid.ScreenScaleY = this.ScreenScaleY; layer_Grid.ScreenTranslationX = this.ScreenTranslationX; layer_Grid.ScreenTranslationY = this.ScreenTranslationY; layer_Grid.Visible = true; tempColor = GenerateColor.GetSimilarColor(tempColor); layer_Grid.GridLine.LineColor = Color.FromArgb(alpha, tempColor); layer_Grid.GridLine.LineWidth = (float)((m2mStructure.GetLevelNum() - i)); layer_Grid.Draw(graphics); } } }
private int SearchTheTargetPart2(IPosition targetPoint, ref IPart targetPart) { int levelSequence; int BottonlevelSequence = m2mStructure.GetLevelNum() - 1; IPart currentPart = m2mStructure.GetLevel(1).GetPartRefByPoint(targetPoint); if (currentPart == null) { targetPart = null; return(1); } for (levelSequence = 2; levelSequence < BottonlevelSequence; levelSequence++) { currentPart = m2mStructure.GetLevel(levelSequence).GetPartRefByPoint(targetPoint); if ((currentPart == null) || (currentPart.GetBottomLevelPointNum() <= set_MaxCheckPointNum)) { targetPart = currentPart; return(levelSequence); } } if (targetPart == null) { targetPart = m2mStructure.GetLevel(BottonlevelSequence).GetPartRefByPoint(targetPoint); return(BottonlevelSequence); } throw new Exception("不应该到达这里!"); //return 1; }
public override void Draw(Graphics graphics) { if (Visible) { for (int i = 0; i < layerList.Length; i++) { if (showLayerSequence < 0 || i == showLayerSequence) { layerList[i].Alpha = this.Alpha; layerList[i].PartColor = this.PartColor; layerList[i].GridColor = this.GridColor; layerList[i].GridLineWidth = (m2mStructure.GetLevelNum() - i); if (transformIsChanged) { UpdateLayerListTransform(); } layerList[i].Draw(graphics); } } } }
public IPositionSet QueryConvexHull() { #region code for algorithm demo if (GetChildPositionSetInSpecificLevelOfConvexHull != null) { GetChildPositionSetInSpecificLevelOfConvexHull(m2mStructure.GetLevel(1), 1, m2mStructure.GetChildPositionSetByParentPart(0, m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0))); } #endregion IPositionSet PositionSetInConvexHull = convexHullEngine.ConvexHull( m2mStructure.GetChildPositionSetByParentPart(0, m2mStructure.GetLevel(0).GetPartRefByPartIndex(0, 0))); for (int i = 1; i < m2mStructure.GetLevelNum(); i++) { ILevel currentLevel = m2mStructure.GetLevel(i); #region code for algorithm demo if (GetConvexHullPositionSetInSpecificLevel != null) { GetConvexHullPositionSetInSpecificLevel(currentLevel, i, PositionSetInConvexHull); } #endregion tempChildPositionList = new List <IPosition>(); tempChildPositionList.Capacity = 4 * PositionSetInConvexHull.GetNum(); PositionSetInConvexHull.InitToTraverseSet(); IPosition hullStartPoint = null; IPosition temp1 = null; IPosition temp2 = null; if (PositionSetInConvexHull.NextPosition()) { temp1 = PositionSetInConvexHull.GetPosition(); hullStartPoint = temp1; AddChildPositionSetToList(i, temp1); #region code for algorithm demo if (GetLinePositionSetInSpecificLevel != null) { linePositionSetInSpecificLevel = new PositionSetEdit_ImplementByICollectionTemplate(); linePositionSetInSpecificLevel.AddPosition(new Position_Point(temp1.GetX(), temp1.GetY())); } #endregion } #region code for algorithm demo if (GetRepresentativeHullInSpecificLevel != null) { representativeHull = new PositionSetEdit_ImplementByICollectionTemplate(); } #endregion bool isWaitingLastPoint = true; //遍历该层凸包的每个分块,以确定下一层的候选分块 while (true) { if (isWaitingLastPoint) { if (PositionSetInConvexHull.NextPosition() == false) { isWaitingLastPoint = false; temp2 = hullStartPoint; } else { temp2 = PositionSetInConvexHull.GetPosition(); AddChildPositionSetToList(i, temp2); } } else { break; } IPosition start = new Position_Point(currentLevel.ConvertRealValueToRelativeValueX(((IPart)temp1).GetRandomOneFormDescendantPoint().GetX()), currentLevel.ConvertRealValueToRelativeValueY(((IPart)temp1).GetRandomOneFormDescendantPoint().GetY())); IPosition end = new Position_Point(currentLevel.ConvertRealValueToRelativeValueX(((IPart)temp2).GetRandomOneFormDescendantPoint().GetX()), currentLevel.ConvertRealValueToRelativeValueY(((IPart)temp2).GetRandomOneFormDescendantPoint().GetY())); IPositionSet tempPositionSet = writeLineInGridEngine.WriteLineInGrid(currentLevel.GetGridWidth(), currentLevel.GetGridHeight(), start, end); #region code for algorithm demo if (GetRepresentativeHullInSpecificLevel != null) { representativeHull.AddPosition(start); representativeHull.AddPosition(end); GetRepresentativeHullInSpecificLevel(m2mStructure.GetLevel(i), i, representativeHull); } #endregion tempPositionSet.InitToTraverseSet(); while (tempPositionSet.NextPosition()) { IPosition tempPosition = tempPositionSet.GetPosition(); IPart tempPart = currentLevel.GetPartRefByPartIndex(currentLevel.ConvertRelativeValueToPartSequenceX(tempPosition.GetX()), currentLevel.ConvertRelativeValueToPartSequenceY(tempPosition.GetY())); #region code for algorithm demo if (GetLinePositionSetInSpecificLevel != null) { linePositionSetInSpecificLevel.AddPosition(new Position_Point(currentLevel.ConvertRelativeValueToPartSequenceX(tempPosition.GetX()) , currentLevel.ConvertRelativeValueToPartSequenceY(tempPosition.GetY()))); } #endregion if (tempPart != null) { AddChildPositionSetToList(i, tempPart); } } #region code for algorithm demo if (GetLinePositionSetInSpecificLevel != null) { if (isWaitingLastPoint) { linePositionSetInSpecificLevel.AddPosition(new Position_Point(temp2.GetX(), temp2.GetY())); } } #endregion #region code for algorithm demo if (GetLinePositionSetInSpecificLevel != null) { GetLinePositionSetInSpecificLevel(m2mStructure.GetLevel(i), i, linePositionSetInSpecificLevel); } #endregion temp1 = temp2; } IPositionSet ChildPositionSetInConvexHull = new PositionSetEdit_ImplementByICollectionTemplate(tempChildPositionList); #region code for algorithm demo if (GetChildPositionSetInSpecificLevelOfConvexHull != null) { if (i < m2mStructure.GetLevelNum() - 1) { GetChildPositionSetInSpecificLevelOfConvexHull(m2mStructure.GetLevel(i + 1), i + 1, ChildPositionSetInConvexHull); } } #endregion PositionSetInConvexHull = convexHullEngine.ConvexHull(ChildPositionSetInConvexHull); } #region code for algorithm demo if (GetRealConvexHull != null) { GetRealConvexHull(PositionSetInConvexHull); } #endregion return(PositionSetInConvexHull); }
//没有路径则返回null public List <IPosition_Connected> SearchPath(IPosition_Connected start, IPosition_Connected end) { IPart_Connected startParentPart = ((Tag_M2M_Position)(start.GetAttachment())).parentPart; IPart_Connected endParentPart = ((Tag_M2M_Position)(end.GetAttachment())).parentPart; ushort lastLevelTimeStamp = TimeStamp.getRandomTimeStamp(); ushort endTime_stamp = TimeStamp.getRandomTimeStamp(); ushort startTime_stamp = TimeStamp.getRandomTimeStamp(); //从最上层的下一层开始进行搜索空间收缩 for (int levelSequence = 1; levelSequence < m2mStructure.GetLevelNum(); levelSequence++) { IPart_Connected currentLevelAncestorPartOfStartPosition = startParentPart; IPart_Connected currentLevelAncestorPartOfEndPosition = endParentPart; for (int i = 0; i < m2mStructure.GetLevelNum() - levelSequence - 1; i++) { currentLevelAncestorPartOfStartPosition = (IPart_Connected)currentLevelAncestorPartOfStartPosition.GetParentPart(); currentLevelAncestorPartOfEndPosition = (IPart_Connected)currentLevelAncestorPartOfEndPosition.GetParentPart(); } Tag_M2M_Part StartPartTag = (Tag_M2M_Part)currentLevelAncestorPartOfStartPosition.GetAttachment(); StartPartTag.isNeedToSearch = true; Tag_M2M_Part EndPartTag = (Tag_M2M_Part)currentLevelAncestorPartOfEndPosition.GetAttachment(); EndPartTag.isNeedToSearch = true; bool isTopLevel = false; if (levelSequence == 1) { isTopLevel = true; } //在该层中标记需要搜索的分块 { //归入搜索空间的路径的最长长度 float PathLengthBound = float.MaxValue; endTime_stamp = TimeStamp.getNextTimeStamp(startTime_stamp); EndPartTag.timeStamp = endTime_stamp; EndPartTag.ge = 0; open.clear(); ((M2M_Part_TagComparer)com).state = 0; //将起点加入open表 open.add(currentLevelAncestorPartOfEndPosition); //当open表非空时 while (open.getSize() > 0) { //获得下一个最近的点 IPart_Connected currentPosition_Connected = (IPart_Connected)open.removeFirst(); Tag_M2M_Part TagOfCurrentPart_Connected = (Tag_M2M_Part)currentPosition_Connected.GetAttachment(); //当open表里面所有的点的g值都超出路径最大长度范围,则结束循环 if (TagOfCurrentPart_Connected.ge >= PathLengthBound) { break; } //到达终点则记录路径的长度,并计算出搜索范围 if (currentPosition_Connected == currentLevelAncestorPartOfStartPosition) { if (PathLengthBound == float.MaxValue) { PathLengthBound = CalculatePathLengthBound(m2mStructure.GetLevelNum(), levelSequence, TagOfCurrentPart_Connected.ge); } } TagOfCurrentPart_Connected.isClose = true; IPositionSet_Connected_Adjacency CurrentPartAdjSet = currentPosition_Connected.GetAdjacencyPositionSet(); CurrentPartAdjSet.InitToTraverseSet(); while (CurrentPartAdjSet.NextPosition()) { IPart_Connected adjPosition = (IPart_Connected)CurrentPartAdjSet.GetPosition_Connected(); Tag_M2M_Part tagOfAdjPosition = (Tag_M2M_Part)adjPosition.GetAttachment(); bool isInSearchingBound = false; if (isTopLevel) { isInSearchingBound = true; } else { Tag_M2M_Part parenPartTag = (Tag_M2M_Part)adjPosition.GetParentPart().GetAttachment(); if ((parenPartTag.timeStamp == lastLevelTimeStamp) && (parenPartTag.isNeedToSearch == true)) { isInSearchingBound = true; } } //如果属于搜索空间 if (isInSearchingBound) { //如果未被搜索 if (tagOfAdjPosition.timeStamp != endTime_stamp) { float newG = TagOfCurrentPart_Connected.ge + CurrentPartAdjSet.GetDistanceToAdjacency(); if (newG < PathLengthBound) { tagOfAdjPosition.ge = newG; tagOfAdjPosition.isClose = false; tagOfAdjPosition.timeStamp = endTime_stamp; open.add(adjPosition); } } else { if (!tagOfAdjPosition.isClose) { float newG = TagOfCurrentPart_Connected.ge + CurrentPartAdjSet.GetDistanceToAdjacency(); if (newG < tagOfAdjPosition.ge) { tagOfAdjPosition.ge = newG; open.update(adjPosition); } } } } } } startTime_stamp = TimeStamp.getNextTimeStamp(endTime_stamp); StartPartTag.timeStamp = startTime_stamp; StartPartTag.gs = 0; open.clear(); ((M2M_Part_TagComparer)com).state = 1; //将起点加入open表 open.add(currentLevelAncestorPartOfStartPosition); //当open表非空时 while (open.getSize() > 0) { //获得下一个最近的点 IPart_Connected currentPosition_Connected = (IPart_Connected)open.removeFirst(); Tag_M2M_Part TagOfCurrentPart_Connected = (Tag_M2M_Part)currentPosition_Connected.GetAttachment(); //当open表里面所有的点的g值都超出路径最大长度范围,则结束循环 if (TagOfCurrentPart_Connected.gs >= PathLengthBound) { break; } TagOfCurrentPart_Connected.isClose = true; IPositionSet_Connected_Adjacency CurrentPartAdjSet = currentPosition_Connected.GetAdjacencyPositionSet(); CurrentPartAdjSet.InitToTraverseSet(); while (CurrentPartAdjSet.NextPosition()) { IPart_Connected adjPosition = (IPart_Connected)CurrentPartAdjSet.GetPosition_Connected(); Tag_M2M_Part tagOfAdjPosition = (Tag_M2M_Part)adjPosition.GetAttachment(); bool isInSearchingBound = false; if (isTopLevel) { isInSearchingBound = true; } else { Tag_M2M_Part parenPartTag = (Tag_M2M_Part)adjPosition.GetParentPart().GetAttachment(); if ((parenPartTag.timeStamp == lastLevelTimeStamp) && (parenPartTag.isNeedToSearch == true)) { isInSearchingBound = true; } } //如果属于搜索空间 if (isInSearchingBound) { //如果未被搜索 if (tagOfAdjPosition.timeStamp != startTime_stamp) { float newG = TagOfCurrentPart_Connected.gs + CurrentPartAdjSet.GetDistanceToAdjacency(); if (newG < PathLengthBound) { tagOfAdjPosition.gs = newG; tagOfAdjPosition.isClose = false; //如果在上面的搜索过程中被搜索过 if (tagOfAdjPosition.timeStamp == endTime_stamp) { //如果两次搜索的g值之和小于路径的最大长度则标记该分块为下一层的待搜索空间 if (tagOfAdjPosition.ge + newG < PathLengthBound) { tagOfAdjPosition.isNeedToSearch = true; } else { tagOfAdjPosition.isNeedToSearch = false; } } else { //如果在上面的搜索过程中没有被搜索过,则把它的ge值设大,使得以后改变g值的时候不会因为两个g值之和小于PathLengthBound而把该点标记为待搜索点 tagOfAdjPosition.ge = PathLengthBound + 1; tagOfAdjPosition.isNeedToSearch = false; } tagOfAdjPosition.timeStamp = startTime_stamp; open.add(adjPosition); } } else { if (!tagOfAdjPosition.isClose) { float newG = TagOfCurrentPart_Connected.gs + CurrentPartAdjSet.GetDistanceToAdjacency(); if (newG < tagOfAdjPosition.gs) { if (tagOfAdjPosition.isNeedToSearch == false) { //如果两次搜索的g值之和小于路径的最大长度则标记该分块为下一层的待搜索空间 if (tagOfAdjPosition.ge + newG < PathLengthBound) { tagOfAdjPosition.isNeedToSearch = true; } } tagOfAdjPosition.gs = newG; open.update(adjPosition); } } } } } } lastLevelTimeStamp = startTime_stamp; if (GetTimeStamp != null) { GetTimeStamp(lastLevelTimeStamp); } } } if (GetM2MStructure != null) { GetM2MStructure(m2mStructure); } //最底层寻找真实路径 path.Clear(); ((M2M_Part_TagComparer)com).state = 2; if (end == start) { path.Add(end); return(path); } //判断起点和终点是否在地图上,并初始化起点的标签 Tag_M2M_Position tag = (Tag_M2M_Position)end.GetAttachment(); //生成这次寻径使用的time stamp time_stamp = TimeStamp.getNextTimeStamp(lastLevelTimeStamp); if (tag != null) { tag.g = 0; tag.parent = null; tag.isClose = false; tag.timeStamp = time_stamp; } IPosition_Connected p = null, p_adj; IPositionSet_Connected_Adjacency adj_set; Tag_M2M_Position p_tag, p_adj_tag; open.clear(); //将起点加入open表 open.add(end); //当open表非空时 while (open.getSize() > 0) { float newG; //获得下一个最近的点 p = open.removeFirst(); //到达终点则结束 if (p == start) { pathLength = ((Tag_M2M_Position)start.GetAttachment()).g; break; } p_tag = (Tag_M2M_Position)p.GetAttachment(); p_tag.isClose = true; adj_set = p.GetAdjacencyPositionSet(); adj_set.InitToTraverseSet(); while (adj_set.NextPosition()) { p_adj = adj_set.GetPosition_Connected(); p_adj_tag = (Tag_M2M_Position)p_adj.GetAttachment(); //如果需要搜索 Tag_M2M_Part parentPartTag = (Tag_M2M_Part)p_adj_tag.parentPart.GetAttachment(); if (parentPartTag.isNeedToSearch && parentPartTag.timeStamp == lastLevelTimeStamp) { //如果未被搜索 if (p_adj_tag.timeStamp != time_stamp) { newG = p_tag.g + adj_set.GetDistanceToAdjacency(); p_adj_tag.parent = p; p_adj_tag.g = newG; p_adj_tag.isClose = false; p_adj_tag.timeStamp = time_stamp; open.add(p_adj); } else { if (!p_adj_tag.isClose) { newG = p_tag.g + adj_set.GetDistanceToAdjacency(); if (newG < p_adj_tag.g) { p_adj_tag.parent = p; p_adj_tag.g = newG; open.update(p_adj); } } } } } } //从终点根据标签中记录的父节点找到起点,生成路径 if (p == start) { path.Add(start); p_tag = (Tag_M2M_Position)start.GetAttachment(); while (p_tag.parent != null) { path.Add(p_tag.parent); p_tag = (Tag_M2M_Position)p_tag.parent.GetAttachment(); } //path.Reverse(); return(path); } else { return(null); } }
public void PreProcess(PositionSetEditSet pointList) { #region code for algorithm demo if (GetPositionSetToGetConvexHull != null) { GetPositionSetToGetConvexHull(pointList); } #endregion //请在这里改变不同的m2mStructure实现。 M2MSCreater_ForGeneralM2MStruture m2m_Creater_ForGeneralM2MStruture = new M2MSCreater_ForGeneralM2MStruture(); m2mStructure = m2m_Creater_ForGeneralM2MStruture.CreateAutomatically(pointList, levelNum); PositionSetEdit_ImplementByICollectionTemplate positionSet = new PositionSetEdit_ImplementByICollectionTemplate(); ILevel bottomLevel = m2mStructure.GetLevel(m2mStructure.GetLevelNum() - 1); for (int i = 0; i < pointList.GetPositionSetNum(); i++) { IPosition start = new Position_Point(); IPosition end = new Position_Point(); IPosition first = new Position_Point(); IPositionSet positionListTemp = pointList.GetNthPositionSet(i); positionListTemp.InitToTraverseSet(); if (positionListTemp.NextPosition()) { start = new Position_Point(bottomLevel.ConvertRealValueToRelativeValueX(positionListTemp.GetPosition().GetX()), bottomLevel.ConvertRealValueToRelativeValueY(positionListTemp.GetPosition().GetY())); first = start; positionSet.AddPosition(start); } while (positionListTemp.NextPosition()) { end = new Position_Point(bottomLevel.ConvertRealValueToRelativeValueX(positionListTemp.GetPosition().GetX()), bottomLevel.ConvertRealValueToRelativeValueY(positionListTemp.GetPosition().GetY())); IPositionSet positionSetTemp = writeLineInGridEngine.WriteLineInGrid(bottomLevel.GetGridWidth(), bottomLevel.GetGridHeight(), start, end); if (positionSetTemp != null) { positionSetTemp.InitToTraverseSet(); while (positionSetTemp.NextPosition()) { positionSet.AddPosition(positionSetTemp.GetPosition()); } } start = end; positionSet.AddPosition(start); } IPositionSet positionSetTemp2 = writeLineInGridEngine.WriteLineInGrid(bottomLevel.GetGridWidth(), bottomLevel.GetGridHeight(), end, first); if (positionSetTemp2 != null) { positionSetTemp2.InitToTraverseSet(); while (positionSetTemp2.NextPosition()) { positionSet.AddPosition(positionSetTemp2.GetPosition()); } } } m2mStructure.Preprocessing(positionSet); #region code for algorithm demo if (GetM2MStructure != null) { GetM2MStructure(m2mStructure); } #endregion }
public bool Collide(IPositionSet objPositionSet) { IPosition start = new Position_Point(); IPosition end = new Position_Point(); IPosition first = new Position_Point(); ILevel currentLevel = new Level(); for (int i = 1; i < m2mStructure.GetLevelNum(); i++) { currentLevel = m2mStructure.GetLevel(i); objPositionSet.InitToTraverseSet(); //判断第一点所在的分块是否相交 if (objPositionSet.NextPosition()) { start = new Position_Point(currentLevel.ConvertRealValueToRelativeValueX(objPositionSet.GetPosition().GetX()), currentLevel.ConvertRealValueToRelativeValueY(objPositionSet.GetPosition().GetY())); first = start; if (currentLevel.GetPartRefByPoint(start) != null) { if (i < m2mStructure.GetLevelNum() - 1) { goto NextLevel; } else { tempIntersectPositionSet.AddPosition(new Position_Point(currentLevel.ConvertRelativeValueToPartSequenceX(start.GetX()), currentLevel.ConvertRelativeValueToPartSequenceY(start.GetY()))); } } } while (objPositionSet.NextPosition()) { //判断每条边所在的分块是否相交 end = new Position_Point(currentLevel.ConvertRealValueToRelativeValueX(objPositionSet.GetPosition().GetX()), currentLevel.ConvertRealValueToRelativeValueY(objPositionSet.GetPosition().GetY())); IPositionSet positionSetTemp = writeLineInGridEngine.WriteLineInGrid(currentLevel.GetGridWidth(), currentLevel.GetGridHeight(), start, end); if (positionSetTemp != null) { positionSetTemp.InitToTraverseSet(); while (positionSetTemp.NextPosition()) { if (currentLevel.GetPartRefByPoint(positionSetTemp.GetPosition()) != null) { if (i < m2mStructure.GetLevelNum() - 1) { goto NextLevel; } else { tempIntersectPositionSet.AddPosition(new Position_Point(currentLevel.ConvertRelativeValueToPartSequenceX(positionSetTemp.GetPosition().GetX()), currentLevel.ConvertRelativeValueToPartSequenceY(positionSetTemp.GetPosition().GetY()))); } } } } //判断每条边的终点所在的分块是否相交 start = end; if (currentLevel.GetPartRefByPoint(start) != null) { if (i < m2mStructure.GetLevelNum() - 1) { goto NextLevel; } else { tempIntersectPositionSet.AddPosition(new Position_Point(currentLevel.ConvertRelativeValueToPartSequenceX(start.GetX()), currentLevel.ConvertRelativeValueToPartSequenceY(start.GetY()))); } } } //判断最后一条边所在的分块是否相交 IPositionSet positionSetTemp2 = writeLineInGridEngine.WriteLineInGrid(currentLevel.GetGridWidth(), currentLevel.GetGridHeight(), end, first); if (positionSetTemp2 != null) { positionSetTemp2.InitToTraverseSet(); while (positionSetTemp2.NextPosition()) { if (currentLevel.GetPartRefByPoint(positionSetTemp2.GetPosition()) != null) { if (i < m2mStructure.GetLevelNum() - 1) { goto NextLevel; } else { tempIntersectPositionSet.AddPosition(new Position_Point(currentLevel.ConvertRelativeValueToPartSequenceX(positionSetTemp2.GetPosition().GetX()), currentLevel.ConvertRelativeValueToPartSequenceY(positionSetTemp2.GetPosition().GetY()))); } } } } if (i == m2mStructure.GetLevelNum() - 1 && tempIntersectPositionSet.GetNum() > 0) { goto NextLevel; } #region code for algorithm demo if (GetNoCollision != null) { GetNoCollision(objPositionSet); Debug.WriteLine(i); } #endregion return(false);//free of collision NextLevel :; } #region code for algorithm demo if (GetCollision != null) { GetCollision(objPositionSet); } if (GetIntersectPart != null) { GetIntersectPart(currentLevel, tempIntersectPositionSet); } #endregion tempIntersectPositionSet.Clear(); return(true); }
private void preProcessForPositionSetConnectedToolStripMenuItem_Click(object sender, EventArgs e) { IPositionSet_Connected pSet = (IPositionSet_Connected)positionSetContainer.GetPositionSet(); 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); Layer_PositionSet_Connected layer_PositionSet_Connected = new Layer_PositionSet_Connected(pSet); 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); M2MSCreater_ForGeneralM2MStruture m2m_Creater_ForGeneralM2MStruture = new M2MSCreater_ForGeneralM2MStruture(); m2m_Creater_ForGeneralM2MStruture.PartType = typeof(Part_Multi); m2m_Creater_ForGeneralM2MStruture.SetPointInPartFactor(50); m2m_Creater_ForGeneralM2MStruture.SetUnitNumInGridLength(3); IM2MStructure m2mStructure = m2m_Creater_ForGeneralM2MStruture.CreateAutomatically(pSet); m2mStructure.Preprocessing(pSet); BuildPartSetConnectionForM2MStructure buildPartSetConnectionForM2MStructure = new BuildPartSetConnectionForM2MStructure(); buildPartSetConnectionForM2MStructure.TraversalEveryLevelAndBuild(m2mStructure); layers.Add(new Layer_M2MStructure(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()) //{ // position_ConnectedList.Add((IPosition_Connected)positionSet.GetPosition()); //} //PositionSet_Connected positionSet_Connected = new PositionSet_Connected(position_ConnectedList); Layer_PartSet_Connected layer_PartSet_Connected = new Layer_PartSet_Connected(m2mStructure, levelSequence); //layer_PartSet_Connected.MainColor //layer_PartSet_Connected.Active = true; //layer_PartSet_Connected.SetPositionSetTransformByM2MLevel(level); layers.Add(layer_PartSet_Connected); } layersPainterForm.ShowDialog(); }
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 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(); }
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 } //遍历每一层结束 }