void M2MCH(double n, Object o)
        {
            M2M_CH MCH = new M2M_CH();

            MCH.TheDensityOfBottomLevel = chc.TheDensityOfBottomLevel;
            MCH.ConvexHull((IPositionSet)o);
        }
        void M2MPP(double n, Object o)
        {
            M2M_CH MCH = new M2M_CH();

            MCH.TheDensityOfBottomLevel = chc.TheDensityOfBottomLevel;
            MCH.PreProcess((IPositionSet)o);
        }
        private void m2MCHToolStripMenuItem_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_CH m2m_CH = new M2M_CH();

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

                m2m_CH.ConvexHull(positionSetContainer.GetPositionSet());

                //结束演示(解除事件响应的绑定)
                algorithmDemo_M2M_CH.EndDemo();
            }).BeginInvoke(null, null);
        }
        void M2MQCH(double n, Object o)
        {
            M2M_CH MCH = new M2M_CH();

            m2mch.QueryConvexHull();
        }
        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);
        }
Beispiel #6
0
        public AlgorithmDemo_M2M_CH(M2M_CH m2m_CH, Layers layers, FlowControlerForm flowControlerForm, dUpdate update)
        {
            this.m2m_CH            = m2m_CH;
            this.layers            = layers;
            this.flowControlerForm = flowControlerForm;
            this.Update            = update;

            m2m_CH.GetM2MStructure += delegate(IM2MStructure m2mStructure)
            {
                this.m2mStructure = m2mStructure;
            };

            m2m_CH.GetChildPositionSetInSpecificLevelOfConvexHull += delegate
            {
                if (representativeHullLayer != null)
                {
                    representativeHullLayer.Visible = false;
                }
                if (convexHullLayer != null)
                {
                    lock (layers)
                    {
                        convexHullLayer.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            m2m_CH.GetConvexHullPositionSetInSpecificLevel += delegate
            {
                if (linePartSetLayer != null)
                {
                    lock (layers)
                    {
                        linePartSetLayer.Visible            = false;
                        BottonLevelPositionSetLayer.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            m2m_CH.GetRealConvexHull += delegate
            {
                if (representativeHullLayer != null)
                {
                    lock (layers)
                    {
                        representativeHullLayer.Visible = false;
                    }
                }
                if (convexHullLayer != null)
                {
                    lock (layers)
                    {
                        convexHullLayer.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            IsGetM2MStructure = true;
            IsGetPositionSetToGetConvexHull                  = true;
            IsGetConvexHullPositionSetInSpecificLevel        = true;
            IsGetRepresentativeHullInSpecificLevel           = true;
            IsGetLinePositionSetInSpecificLevel              = true;
            IsGetChildPositionSetInSpecificLevelOfConvexHull = true;
            IsGetRealConvexHull = true;

            m2m_CH.GetConvexHullPositionSetInSpecificLevel += delegate
            {
                if (childPositionSetOfConvexHullLayer != null)
                {
                    lock (layers)
                    {
                        childPositionSetOfConvexHullLayer.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            m2m_CH.GetConvexHullPositionSetInSpecificLevel += delegate
            {
                if (convexHullLayer != null)
                {
                    lock (layers)
                    {
                        convexHullLayer.ConvexHull.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            m2m_CH.GetRealConvexHull += delegate
            {
                if (linePartSetLayer != null)
                {
                    lock (layers)
                    {
                        linePartSetLayer.Visible            = false;
                        BottonLevelPositionSetLayer.Visible = false;
                    }
                    flowControlerForm.BeginInvoke(Update);
                    flowControlerForm.SuspendAndRecordWorkerThread();
                }
            };

            flowControlerForm.SelectConfiguratoinObject(this);
            flowControlerForm.SuspendAndRecordWorkerThread();
        }
Beispiel #7
0
        private void button1_Click(object sender, EventArgs e)
        {
            IConvexHullEngine convexhull;
            int n;

            switch (comboBox1.SelectedIndex)
            {
            case 0:
                convexhull = new GrahamScan();
                break;

            case 1:
                //convexhull = new QuickHull();
                convexhull = new M2M_CH();
                break;

            default:
                return;
            }
            try
            {
                n = Int32.Parse(textBox1.Text);
            }
            catch (Exception)
            {
                return;
            }

            //Point[] ps = new Point[n];
            PositionSetEdit_ImplementByICollectionTemplate ps = new PositionSetEdit_ImplementByICollectionTemplate();
            Random r = new Random(DateTime.Now.Millisecond);

            //if (true)
            {
                int minx = (int)(pb.Width * 0.05);
                int miny = (int)(pb.Height * 0.05);
                for (int i = 0; i < n; i++)
                {
                    int x = r.Next(minx, pb.Width - minx);
                    int y = r.Next(miny, pb.Height - miny);
                    //ps[i] = new Point(x, y);
                    ps.AddPosition(new Position_Point(x, y));
                    System.Console.Write(x);
                    System.Console.Write(",");
                    System.Console.Write(y);
                    System.Console.WriteLine(",");
                }
                System.Console.WriteLine();
            }
            //else
            //{
            //    ps = testData();
            //}

            IPositionSet convexPoints = convexhull.ConvexHull(ps);

            pb.Image = new Bitmap(pb.Width, pb.Height);
            Graphics g = Graphics.FromImage(pb.Image);

            convexPoints.InitToTraverseSet();

            g.Clear(Color.White);

            /*
             * for (int i = 0; i < ps.Length; i++)
             * {
             *  g.FillEllipse(Brushes.Black, ps[i].X - 2, pb.Height - ps[i].Y - 2, 4, 4);
             *  g.DrawString("(" + ps[i].X + "," + ps[i].Y + ")", Font, Brushes.Blue, ps[i].X, pb.Height - ps[i].Y);
             * }
             * for (int i = 0; i < convexPoints.Length; i++)
             * {
             *  if (i != convexPoints.Length - 1)
             *      g.DrawLine(new Pen(Color.Green), new PointF(convexPoints[i].X, pb.Height - convexPoints[i].Y), new PointF(convexPoints[i + 1].X, pb.Height - convexPoints[i + 1].Y));
             *  else
             *  {
             *      g.DrawLine(new Pen(Color.Green), new PointF(convexPoints[i].X, pb.Height - convexPoints[i].Y), new PointF(convexPoints[0].X, pb.Height - convexPoints[0].Y));
             *  }
             * }
             * */
            ps.InitToTraverseSet();
            IPosition p = ps.GetPosition();

            while (p != null)
            {
                g.FillEllipse(Brushes.Black, p.GetX() - 2, pb.Height - p.GetY() - 2, 4, 4);
                g.DrawString("(" + p.GetX() + "," + p.GetY() + ")", Font, Brushes.Blue, p.GetX(), pb.Height - p.GetY());
                p = ps.GetPosition();
            }
            IPosition p1 = convexPoints.GetPosition();
            IPosition p2 = convexPoints.GetPosition();

            while (p2 != null)
            {
                g.DrawLine(new Pen(Color.Green), new PointF(p1.GetX(), pb.Height - p1.GetY()), new PointF(p2.GetX(), pb.Height - p2.GetY()));
                p1 = p2;
                p2 = convexPoints.GetPosition();
            }
            convexPoints.InitToTraverseSet();
            p2 = convexPoints.GetPosition();
            g.DrawLine(new Pen(Color.Green), new PointF(p1.GetX(), pb.Height - p1.GetY()), new PointF(p2.GetX(), pb.Height - p2.GetY()));
        }