实现动态描画圆的问题
现在已有另外一个过程帮我不断地获取一些坐标点(基本上是在一个圆周上,但有时可能有错误的点)
现在我想每隔N个点就用这N个点计算它们围成的圆的圆心座标位置,并排除一些偏移太大的点,求算法,有程序函数的加分!!
再理想点,其实我想获取N+1个点后 , 第一个点的数据自动排除,在从2到N+1计算,如此类推,就像一个先入先出的队列
[解决办法]
什么叫偏大的点,拟制定好一个标准,自己删除就是了
数据放到列表中,如果到了N个,那么来一个就RemoveAt(0)
[解决办法]
List<int> x = new List<int>(); List<int> y = new List<int>(); if (mypoints.Count > 0) { foreach (Point p in mypoints) { x.Add(p.X); y.Add(p.Y); } } x.Sort(); y.Sort(); Point pcontent = new Point(x[x.Count / 2],y[y.Count / 2]); int radius = (x[x.Count - 1] - x[1]) / 2; using (Graphics g = this.CreateGraphics()) { Pen mypen = new Pen(Color.Black); g.DrawEllipse(mypen,new Rectangle(pcontent.X - radius,pcontent.Y - radius,radius * 2,radius * 2)); }
[解决办法]
上面是算法图像说明:
1,根据你得到的圆周上的点,先找出他们的最小外接矩形,如红色矩形所示;
2,根据红色矩形,可以得出圆心所在的范围,可以设定一个阈值,这个范围,如黄色矩形所示;
3,遍历黄色区域的每一个像素,计算该像素位置与每个圆周点位置的距离之和Sum;
4,当Sum最小时的那个像素点的位置,就是你要找的圆心位置;
5,如果你有几个点的误差,那么求和之后完全不影响结果,而黄色区域的选择则是为了减少计算量!!
[解决办法]