Guest User

c# compute best fit circle from many points

a guest
Nov 11th, 2016
1,093
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.36 KB | None | 0 0
  1. using System.Linq;
  2. /// <summary>
  3. /// Given a list of points, find a circle that roughly passes through them all.
  4. /// </summary>
  5. public static CircleSegment ComputeCircle(System.Collections.Generic.IEnumerable<Point2d> l)
  6. {
  7.     // https://www.scribd.com/document/14819165/Regressions-coniques-quadriques-circulaire-spherique
  8.     // via http://math.stackexchange.com/questions/662634/find-the-approximate-center-of-a-circle-passing-through-more-than-three-points
  9.  
  10.     var n = l.Count();
  11.     var sumx = l.Sum(p => p.X);
  12.     var sumxx = l.Sum(p => p.X * p.X);
  13.     var sumy = l.Sum(p => p.Y);
  14.     var sumyy = l.Sum(p => p.Y * p.Y);
  15.  
  16.     var d11 = n * l.Sum(p => p.X * p.Y) - sumx * sumy;
  17.  
  18.     var d20 = n * sumxx - sumx * sumx;
  19.     var d02 = n * sumyy - sumy * sumy;
  20.  
  21.     var d30 = n * l.Sum(p => p.X * p.X * p.X) - sumxx * sumx;
  22.     var d03 = n * l.Sum(p => p.Y * p.Y * p.Y) - sumyy * sumy;
  23.  
  24.     var d21 = n * l.Sum(p => p.X * p.X * p.Y) - sumxx * sumy;
  25.     var d12 = n * l.Sum(p => p.Y * p.Y * p.X) - sumyy * sumx;
  26.  
  27.     var x = ((d30 + d12) * d02 - (d03 + d21) * d11) / (2 * (d20 * d02 - d11 * d11));
  28.     var y = ((d03 + d21) * d20 - (d30 + d12) * d11) / (2 * (d20 * d02 - d11 * d11));
  29.  
  30.     var c = (sumxx + sumyy - 2 * x * sumx - 2 * y * sumy) / n;
  31.     var r = Math.Sqrt(c + x * x + y * y);
  32.  
  33.     return new CircleSegment(new Point2f((float)x, (float)y), (float)r);
  34. }
Advertisement
Add Comment
Please, Sign In to add comment