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); }
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); }
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); }
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); }
//初始化 private void init() { m2m_nn = new M2M_NN(); kdt_nn = new KDT_NN(); }
//初始化 private void init() { m2m_nn = new M2M_NN(); ((M2M_NN)m2m_nn).TheDensityOfBottomLevel = theDensityOfBottomLevel; kdt_nn = new KDT_NN(); }