Esempio n. 1
0
        //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);
        }
Esempio n. 4
0
        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();
        }