private void m2MNNToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //以下代码必须在UI线程中调用,即不能在另开的线程中调用
            LayersExOptDlg       layers               = new LayersExOptDlg();
            LayersPainterForm    layersPainterForm    = new LayersPainterForm(layers);
            LayersPaintedControl layersPaintedControl = layersPainterForm.LayersPaintedControl;
            LayersEditedControl  layersEditedControl  = new LayersEditedControl();

            layersEditedControl.LayersPaintedControl = layersPaintedControl;
            layersPainterForm.Controls.Add(layersEditedControl);
            FlowControlerForm flowControlerForm = new FlowControlerForm();

            layersPainterForm.MdiParent    = this;
            layersPainterForm.WindowState  = FormWindowState.Maximized;
            layersPainterForm.FormClosing += delegate { flowControlerForm.Close(); };
            layersPainterForm.Show();
            flowControlerForm.Show(layersPainterForm);

            //打开一个Worker线程来进行算法流程的演示(否则会阻塞UI线程以至于演示不能进行)
            IAsyncResult result = new dDemoProcess(delegate
            {
                M2M_NN m2m_NN = new M2M_NN();

                //为对象的事件添加事件响应,以进行算法演示
                AlgorithmDemo_M2M_NN algorithmDemo_M2M_NN = new AlgorithmDemo_M2M_NN(m2m_NN, layers, flowControlerForm, layersPaintedControl.Invalidate);

                m2m_NN.PreProcess(positionSetContainer.GetPositionSet());
                m2m_NN.NearestNeighbor(layersPaintedControl.GetMouseDoubleChickedRealPosition());

                //结束演示(解除事件响应的绑定)
                algorithmDemo_M2M_NN.EndDemo();
            }).BeginInvoke(null, null);
        }
        private void EditedBotton_Click(object sender, EventArgs e)
        {
            Layer_PositionSet layer = layers.painterOptionDialog.SelectLayer as Layer_PositionSet;

            if (layer != null)
            {
                if (layer.EditAble)
                {
                    selectedPositionSetLayer = layer;
                    selectedPositionSetEdit  = layer.PositionSet;
                    m2m_NN = new M2M_NN();
                    m2m_NN.PreProcess(selectedPositionSetEdit);

                    selectBotton.Enabled              = true;
                    addNodeButton.Enabled             = true;
                    removeNodeButton.Enabled          = true;
                    daggleButton.Enabled              = true;
                    addConnectionButton.Enabled       = true;
                    addDoubleConnectionButton.Enabled = true;
                    newButton.Enabled  = true;
                    openButton.Enabled = true;
                    saveButton.Enabled = true;
                }
            }
        }
        public AlgorithmDemo_M2M_NN(M2M_NN m2m_NN, Layers layers, FlowControlerForm flowControlerForm, dUpdate update)
        {
            this.m2m_NN            = m2m_NN;
            this.layers            = layers;
            this.flowControlerForm = flowControlerForm;
            this.Update            = update;

            m2m_NN.GetQueryPosition += delegate
            {
                SearchPartSetLayer       = null;
                ComparedPointLayer       = null;
                shrinkBoundPointSetLayer = null;
                searchBoundLayer         = null;
            };

            m2m_NN.GetPositionSetOfComparedPoint += OnGetPositionSetOfComparedPoint;
            m2m_NN.GetM2MStructure            += OnGetM2MStructure;
            m2m_NN.GetQueryPosition           += OnGetQueryPosition;
            m2m_NN.GetQueryPart               += OnGetQueryPart;
            m2m_NN.GetSearchPart              += OnGetSearchPart;
            m2m_NN.GetComparedPoint           += OnGetComparedPoint;
            m2m_NN.SearchBoundChanged         += OnSearchBoundChanged;
            m2m_NN.CurrentNearestPointChanged += OnCurrentNearestPointChanged;

            flowControlerForm.SelectConfiguratoinObject(this);
        }
Пример #4
0
        private void button1_Click(object sender, EventArgs e)
        {
            //Point[] nPoints = getPoints((Bitmap)pictureBox1.Image);
            List <IPosition> al = new List <IPosition>();

            al = pointList;
            //for (int i = 0; i < nPoints.Length; i++)
            //{
            //   al.Add(new KD2DPoint(nPoints[i]));
            //   // all.Add(new KD2DPoint(nPoints[i]));
            //}
            // KDTree Ktree = KDTree.CreateKDTree(all);
            INearestNeighbor M2Mnn = new M2M_NN();
            INearestNeighbor KDTnn = new KDT_NN();
            //M2Mnn.Init(400, 400, 100, 5, 5);
            int runTimes = 10000;

            M2Mnn.PreProcess(al);

            KDTnn.PreProcess(al);
            Graphics g = Graphics.FromImage(pictureBox1.Image);

            int       px = int.Parse(textBox1.Text);
            int       py = int.Parse(textBox2.Text);
            KD2DPoint AskPoint = new KD2DPoint(px, py);
            long      timeMM, timeKD;
            Stopwatch sW       = new Stopwatch();
            KD2DPoint nearest  = null;
            KD2DPoint nearest2 = null;

            sW.Start();
            for (int i = 0; i < runTimes; i++)
            {
                nearest = (KD2DPoint)M2Mnn.NearestNeighbor(AskPoint);
            }
            sW.Stop();
            timeMM = sW.ElapsedTicks / runTimes;
            sW.Reset();
            sW.Start();
            for (int i = 0; i < runTimes; i++)
            {
                nearest2 = (KD2DPoint)KDTnn.NearestNeighbor(AskPoint);
            }
            if (!nearest.Equals(nearest2))
            {
                MessageBox.Show("结果不符!");
            }
            sW.Stop();
            timeKD = sW.ElapsedTicks / runTimes;
            sW.Reset();
            M2Mlabel.Text = timeMM.ToString();
            KDTlabel.Text = timeKD.ToString();

            //   label4.Text = "最近距离:" + dis.ToString();
            g.DrawLine(new Pen(Color.SteelBlue), new PointF(AskPoint.X, AskPoint.Y), new PointF(nearest.X, nearest.Y));


            pictureBox1.Refresh();
        }
        public static List <IPosition_Connected_Edit> generateRandomPositionSet_Connected(List <IPosition_Connected_Edit> all, int amount1, int amount2, int amount3, double probability1, double probability2, double probability3)
        {
            if (all.Count > 0)
            {
                IPositionSet_Connected   positionSet = new PositionSet_Connected(all);
                IPositionSet             nearSet;
                IPosition_Connected_Edit near_p;
                float distance;
                bool  unconnected;
                IPositionSet_Connected_AdjacencyEdit adjSet;

                //存储计算好的点数量和概率以备重复使用
                int[]    amount      = new int[3];    //获得周围amount个点来建立连接
                double[] probability = new double[3]; //建立连接的概率为probability
                amount[0]      = amount1;
                amount[1]      = amount2;
                amount[2]      = amount3;
                probability[0] = probability1;
                probability[1] = probability2;
                probability[2] = probability3;

                M2M_NN m2m = new M2M_NN();
                m2m.PreProcess(positionSet);
                //每个节点都随机地与周围的一些节点建立连接
                foreach (IPosition_Connected_Edit p in all)
                {
                    for (int i = 0; i < amount.Length; i++)
                    {
                        nearSet = m2m.ApproximateKNearestNeighbor(p, amount[i]);
                        nearSet.InitToTraverseSet();
                        while (nearSet.NextPosition())
                        {
                            if (RandomMaker.RapidBetween01() < probability[i])
                            {
                                near_p = (IPosition_Connected_Edit)nearSet.GetPosition();
                                if (near_p != p)
                                {
                                    unconnected = true;
                                    adjSet      = p.GetAdjacencyPositionSetEdit();
                                    adjSet.InitToTraverseSet();
                                    while (adjSet.NextPosition())
                                    {
                                        if (adjSet.GetPosition_Connected_Edit() == near_p)
                                        {
                                            unconnected = false;
                                            break;
                                        }
                                    }
                                    if (unconnected)
                                    {
                                        distance = (float)Math.Sqrt((p.GetX() - near_p.GetX()) * (p.GetX() - near_p.GetX()) + (p.GetY() - near_p.GetY()) * (p.GetY() - near_p.GetY()));
                                        adjSet.AddAdjacency(near_p, distance);
                                        near_p.GetAdjacencyPositionSetEdit().AddAdjacency(p, distance);
                                    }
                                }
                            }
                        } //while
                    }     //for
                }         //foreach

                //清除没有连接的孤立节点
                int index = 0;
                while (index < all.Count)
                {
                    near_p = all[index];
                    adjSet = near_p.GetAdjacencyPositionSetEdit();
                    adjSet.InitToTraverseSet();
                    if (!adjSet.NextPosition())
                    {
                        all.Remove(near_p);
                    }
                    else
                    {
                        index++;
                    }
                }
            }
            return(all);
        }
Пример #6
0
        protected void runDemo(IPositionSet set)
        {
            //以下代码必须在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);
            FlowControlerForm flowControlerForm = new FlowControlerForm();

            layersPainterForm.Show();
            flowControlerForm.Show(layersPainterForm);

            //新建或外部传入待演示对象
            M2M_NN m2m_NN = new M2M_NN();
            M2M_CH m2m_CH = new M2M_CH();

            //打开一个Worker线程来进行算法流程的演示(否则会阻塞UI线程以至于演示不能进行)
            IAsyncResult result = new dDemoProcess(delegate
            {
                ////产生随机点集:
                //RandomPositionSet_InFixedDistribution randomPositionSet_InFixedDistribution = new RandomPositionSet_InFixedDistribution();
                //randomPositionSet_InFixedDistribution.PointNum = 100000;
                //randomPositionSet_InFixedDistribution.DistributionStyle = distributionStyle.ClusterGaussianDistribution;
                //new ConfiguratedByForm(randomPositionSet_InFixedDistribution);
                //randomPositionSet_InFixedDistribution.Produce();

                //编辑点集
                Layer_PositionSet layer;
                if (set is IPositionSet_Connected)
                {
                    layer = new Layer_PositionSet_Connected((IPositionSet_Connected)set);
                    ((Layer_PositionSet_Connected)layer).Point.PointColor        = Color.Yellow;
                    ((Layer_PositionSet_Connected)layer).Point.PointRadius       = 2;
                    ((Layer_PositionSet_Connected)layer).Point.IsDrawPointBorder = true;
                }
                else
                {
                    layer = new Layer_PositionSet_Point(set);
                    ((Layer_PositionSet_Point)layer).Point.PointColor        = Color.Yellow;
                    ((Layer_PositionSet_Point)layer).Point.PointRadius       = 2;
                    ((Layer_PositionSet_Point)layer).Point.IsDrawPointBorder = true;
                }
                layer.EditAble = true;
                layers.Add(layer);
                layersPainterForm.Invalidate();
                flowControlerForm.SuspendAndRecordWorkerThread();
                //layers.Remove(layer);

                ///////////////////////////////////////
                //GetRandomPositionFromPositionSetRectangle getRandomPositionFromPositionSetRectangle
                //= new GetRandomPositionFromPositionSetRectangle(randomPositionSet_InFixedDistribution);

                ////对m2m_NN算法进行演示:
                ////为对象的事件添加事件响应,以进行算法演示
                //AlgorithmDemo_M2M_NN algorithmDemo_M2M_NN = new AlgorithmDemo_M2M_NN(m2m_NN, layers, flowControlerForm, layersPaintedControl.Invalidate);

                ////以下代码与非演示状态一样。
                //m2m_NN.PreProcess(randomPositionSet_InFixedDistribution);
                //m2m_NN.NearestNeighbor(layersPaintedControl.GetMouseDoubleChickedRealPosition());
                //while (true)
                //{
                //    for (int i = layers.Count - 1; i >= 0; i--)
                //    {
                //        if ((layers[i].Name != "M2MStructure") && (layers[i].Name != "PositionSetOfComparedPoint"))
                //        {
                //            layers.Remove(layers[i]);
                //        }
                //    }

                //    m2m_NN.NearestNeighbor(getRandomPositionFromPositionSetRectangle.Get());
                //}

                ////结束演示(解除事件响应的绑定)
                //algorithmDemo_M2M_NN.EndDemo();
                ///////////////////////////////////////

                //对m2m_CH算法进行演示:
                //为对象的事件添加事件响应,以进行算法演示
                //AlgorithmDemo_M2M_CH algorithmDemo_M2M_CH = new AlgorithmDemo_M2M_CH(m2m_CH, layers, flowControlerForm, layersPaintedControl.Invalidate);
                //while (true)
                //{
                //    layers.Clear();
                //    //以下代码与非演示状态一样。
                //    m2m_CH.ConvexHull(randomPositionSet_InFixedDistribution.Produce());
                //}

                ////结束演示(解除事件响应的绑定)
                //algorithmDemo_M2M_CH.EndDemo();
            }).BeginInvoke(null, null);
        }
Пример #7
0
        static public bool NearestNeighbourTest()
        {
            int              range  = 4000;
            int              Pnum   = 100000;
            int              Tnum   = 1000;
            Random           r      = new Random();
            Stopwatch        sWatch = new Stopwatch();
            List <IPosition> pl     = new List <IPosition>();

            for (int i = 0; i < Pnum; i++)
            {
                // KD2DPoint pp = new KD2DPoint((float)r.NextDouble() * (range - 1), (float)r.NextDouble() * (range - 1));

                float     x  = (float)r.NextDouble() * r.Next((range - 1));
                KD2DPoint pp = new KD2DPoint(x, ((range - 1) - x));//(float)(200+Math.Sin(x)* 200));


                pl.Add(pp);
            }


            INearestNeighbor SearchNearestNeighborEngine = new M2M_NN();

            //SearchNearestNeighborEngine.Init(range, range, 8000, 5, 4);

            SearchNearestNeighborEngine.PreProcess(pl);

            INearestNeighbor KDTSearchNN = new KDT_NN();

            KDTSearchNN.PreProcess(pl);
            KD2DPoint expected, actual;
            long      timeKD, timeMM;

            timeKD = 0;
            timeMM = 0;

            List <IPosition> testPointList = new List <IPosition>();

            for (int i = 0; i < Tnum; i++)
            {
                KD2DPoint NearestNeighbour_target2 = new KD2DPoint((float)r.NextDouble() * (range - 1), (float)r.NextDouble() * (range - 1)); // TODO: 初始化为适当的值

                testPointList.Add(NearestNeighbour_target2);
            }

            //Console.WriteLine("x: " + NearestNeighbour_target2.GetX().ToString() + "   y: " + NearestNeighbour_target2.GetY().ToString());

            sWatch.Reset();
            sWatch.Start();
            KD2DPoint p1, p2;
            int       err = 0;

            foreach (IPosition testPoint in testPointList)
            {
                p1 = (KD2DPoint)
                     SearchNearestNeighborEngine.NearestNeighbor(testPoint);
                //   double b= Math.Sqrt(Math.Pow(p1.X - testPoint.GetX(), 2) + Math.Pow(p1.X - testPoint.GetX(), 2));
                //}
                //sWatch.Stop();

                //Console.WriteLine("M2M:" + sWatch.ElapsedMilliseconds);

                //sWatch.Reset();
                //sWatch.Start();
                //foreach (Position testPoint in testPointList)
                //{
                p2 = (KD2DPoint)
                     KDTSearchNN.NearestNeighbor(testPoint);
                if (!p2.Equals(p1))
                {
                    Console.WriteLine("不符!");

                    float dist1 = (float)Math.Sqrt((double)((testPoint.GetX() - p1.GetX()) * (testPoint.GetX() - p1.GetX()) + (testPoint.GetY() - p1.GetY()) * (testPoint.GetY() - p1.GetY())));

                    float dist2 = (float)Math.Sqrt((double)((testPoint.GetX() - p2.GetX()) * (testPoint.GetX() - p2.GetX()) + (testPoint.GetY() - p2.GetY()) * (testPoint.GetY() - p2.GetY())));

                    Console.WriteLine("m2mnn: " + dist1.ToString());
                    Console.WriteLine("kdnn: " + dist2.ToString());

                    for (int i = 0; i < 100; i++)
                    {
                        SearchNearestNeighborEngine.NearestNeighbor(testPoint);
                        KDTSearchNN.NearestNeighbor(testPoint);
                    }

                    err++;
                }
            }
            sWatch.Stop();
            Console.WriteLine("测试点数:" + Tnum.ToString() + ";不准确数:" + err.ToString());
            Console.WriteLine("KD:" + sWatch.ElapsedMilliseconds);



            //timeMM+=sWatch.ElapsedMilliseconds;
            //sWatch.Reset();
            //sWatch.Start();
            //expected = (KD2DPoint)KDTSearchNN.NearestNeighbor((Position)NearestNeighbour_target2);
            //sWatch.Stop();
            //timeKD += sWatch.ElapsedMilliseconds;
            //sWatch.Reset();
            //if (!expected.Equals(actual))
            //    Console.WriteLine("不符合!");


            //Console.WriteLine("测试完毕!");
            //Console.WriteLine("kd:" + timeKD.ToString());
            //Console.WriteLine("M2M:"+timeMM.ToString());


            return(true);
        }
        public IPosition GetMouseDoubleChickedNearestPositionInCurrentPositionSet(IPositionSet currentPositionSet)
        {
            M2M_NN m2m_NN = new M2M_NN();

            m2m_NN.PreProcess(currentPositionSet);

            layersPaintedControl.state_PainterForm_MouseDown = LayersPaintedControl.State_PainterForm_MouseDown.onDaggle;
            ResetEventHandler();
            //layersPainterForm.state_PainterForm_MouseDown = LayersPainterForm.State_PainterForm_MouseDown.Other;
            IPosition nearestPoint = new Position_Connected_Edit(0, 0);
            PositionSetEdit_ImplementByICollectionTemplate positionSetEdit_ImplementByICollectionTemplate = new PositionSetEdit_ImplementByICollectionTemplate();

            positionSetEdit_ImplementByICollectionTemplate.AddPosition(nearestPoint);
            Layer_PositionSet_Square layer = new Layer_PositionSet_Square(positionSetEdit_ImplementByICollectionTemplate);

            MouseMovedRealPosition = delegate(IPosition position)
            {
                positionSetEdit_ImplementByICollectionTemplate.RemovePosition(nearestPoint);
                nearestPoint = m2m_NN.NearestNeighbor(position);
                positionSetEdit_ImplementByICollectionTemplate.AddPosition(nearestPoint);
                layer.SpringLayerRepresentationChangedEvent(layer);
                layersPaintedControl.Invalidate();
            };

            layer.VisibleInOptDlg = false;
            layer.Active          = true;
            layer.Name            = "Edited Figure";
            layer.SquareFrameDrawer.RectangleRadiusWidth = 8;
            layer.SquareFrameDrawer.LineWidth            = 1;
            layer.SquareFrameDrawer.LineColor            = Color.Red;
            layer.CenterPointCoordinate.Visible          = true;
            layer.CenterPointCoordinate.CoordinateFont   = new Font(layer.CenterPointCoordinate.CoordinateFont, FontStyle.Bold);


            System.Threading.Thread currentThread            = System.Threading.Thread.CurrentThread;
            Position_Connected_Edit mouseChickedRealPosition = null;
            IPosition nearestPositionInCurrentPositionSet    = null;

            this.BeginInvoke(new dShow(MessageBox.Show), new object[] { "please double chick on the screen." });

            MouseDoubleChickOnLayersPaintedControl += delegate(object sender, MouseEventArgs e)
            {
                mouseChickedRealPosition = new Position_Connected_Edit();
                mouseChickedRealPosition.SetX(layersPaintedControl.ConvertMouseXToRealX(e.X));
                mouseChickedRealPosition.SetY(layersPaintedControl.ConvertMouseYToRealY(e.Y));

                nearestPositionInCurrentPositionSet = m2m_NN.NearestNeighbor(mouseChickedRealPosition);

                if ((currentThread.ThreadState & System.Threading.ThreadState.Suspended) == System.Threading.ThreadState.Suspended)
                {
                    currentThread.Resume();
                }
            };

            if (currentLayer != null)
            {
                layers.Remove(currentLayer);
            }
            currentLayer = layer;
            layers.Add(layer);

            currentThread.Suspend();
            MouseDoubleChickOnLayersPaintedControl = null;
            return(nearestPositionInCurrentPositionSet);
        }
Пример #9
0
 //初始化
 private void init()
 {
     m2m_nn = new M2M_NN();
     kdt_nn = new KDT_NN();
 }
Пример #10
0
 //初始化
 private void init()
 {
     m2m_nn = new M2M_NN();
     ((M2M_NN)m2m_nn).TheDensityOfBottomLevel = theDensityOfBottomLevel;
     kdt_nn = new KDT_NN();
 }