private List<Point2d> checkBall()
        {
            List<Point2d> point = new List<Point2d>();
            for (int i = 0; i < surface.Count; i++)
            {
                point.Add(new Point2d(surface[i].x, surface[i].y, surface[i].z, point.Count));
            }

            BallConcave cc = new BallConcave(point);
            var defaultR = cc.GetRecomandedR();
            cc.main = this;
            List<Point2d> ret = cc.GetConcave_Ball(defaultR);
            return ret;
        }
        private void BTN_Cal_Click(object sender, RoutedEventArgs e)
        {

            if (CB_List.SelectedIndex == 0)
            {
                this.retMesh = DelaunayConcave.GetMesh(pointList);
                for (int i = 0; i < retMesh.Faces.Count; i++)
                {
                    BallGenerator.DelaunayConcave.Triangle t = retMesh.Faces[i];
                    DrawLine_Delauney(retMesh.Points[t.P0Index], retMesh.Points[t.P1Index], "A0");
                    DrawLine_Delauney(retMesh.Points[t.P0Index], retMesh.Points[t.P2Index], "A0");
                    DrawLine_Delauney(retMesh.Points[t.P1Index], retMesh.Points[t.P2Index], "A0");
                }
                retMesh.InitEdgesInfo();
                retMesh.ExecuteEdgeDecimation(R);
                List<BallGenerator.DelaunayConcave.EdgeInfo> edges = retMesh.GetBoundaryEdges();
                for (int i = 0; i < edges.Count; i++)
                {
                    DrawLine(retMesh.Points[edges[i].P0Index], retMesh.Points[edges[i].P1Index], null);
                }
            }
            if (CB_List.SelectedIndex == 1)
            {
                BallConcave cc = new BallConcave(this.pointList);
                if (cc.GetRecomandedR() > R)
                {
                    ShowMessage("R值不合法,可点检查参数!");
                    return;
                }
                cc.main = this;
                List<Point2d> ret = cc.GetConcave_Ball(R);
                DrawPolyline(ret);
            }
            if (CB_List.SelectedIndex == 2)
            {
                BallConcave cc = new BallConcave(this.pointList);
                if (cc.GetRecomandedR() > R)
                {
                    ShowMessage("R值不合法,可点检查参数!");
                    return;
                }
                cc.main = this;
                List<Point2d> ret = cc.GetConcave_Edge(R);
                DrawPolyline(ret);
            }
        }
 public string GetRNeighboursMessage(BallConcave cc)
 {
     List<int>[] nlist = cc.GetInRNeighbourList(this.R);
     StringBuilder sb = new StringBuilder();
     sb.Append("半径领域列表如下:\n");
     for (int i = 0; i < nlist.Length; i++)
     {
         sb.Append("P" + pointList[i].index + "的R近邻点有" + nlist[i].Count + "个: ");
         for (int j = 0; j < nlist[i].Count; j++)
         {
             sb.Append(string.Format("P{0},", pointList[nlist[i][j]].index));
         }
         sb.Append("\n");
     }
     sb.Append("执行算法的R值应大于: " + cc.GetRecomandedR());
     return sb.ToString();
 }
 private void BTN_StateCheck_Click(object sender, RoutedEventArgs e)
 {
     BallConcave cc = new BallConcave(this.pointList);
     ShowMessage(GetRNeighboursMessage(cc));
     this.slider.Value = cc.GetRecomandedR() + 1;
 }