Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Linq;
- /// <summary>
- /// Given a list of points, find a circle that roughly passes through them all.
- /// </summary>
- public static CircleSegment ComputeCircle(System.Collections.Generic.IEnumerable<Point2d> l)
- {
- // https://www.scribd.com/document/14819165/Regressions-coniques-quadriques-circulaire-spherique
- // via http://math.stackexchange.com/questions/662634/find-the-approximate-center-of-a-circle-passing-through-more-than-three-points
- var n = l.Count();
- var sumx = l.Sum(p => p.X);
- var sumxx = l.Sum(p => p.X * p.X);
- var sumy = l.Sum(p => p.Y);
- var sumyy = l.Sum(p => p.Y * p.Y);
- var d11 = n * l.Sum(p => p.X * p.Y) - sumx * sumy;
- var d20 = n * sumxx - sumx * sumx;
- var d02 = n * sumyy - sumy * sumy;
- var d30 = n * l.Sum(p => p.X * p.X * p.X) - sumxx * sumx;
- var d03 = n * l.Sum(p => p.Y * p.Y * p.Y) - sumyy * sumy;
- var d21 = n * l.Sum(p => p.X * p.X * p.Y) - sumxx * sumy;
- var d12 = n * l.Sum(p => p.Y * p.Y * p.X) - sumyy * sumx;
- var x = ((d30 + d12) * d02 - (d03 + d21) * d11) / (2 * (d20 * d02 - d11 * d11));
- var y = ((d03 + d21) * d20 - (d30 + d12) * d11) / (2 * (d20 * d02 - d11 * d11));
- var c = (sumxx + sumyy - 2 * x * sumx - 2 * y * sumy) / n;
- var r = Math.Sqrt(c + x * x + y * y);
- return new CircleSegment(new Point2f((float)x, (float)y), (float)r);
- }
Advertisement
Add Comment
Please, Sign In to add comment