【发布时间】:2016-10-24 01:43:43
【问题描述】:
我需要根据圆柱形物体的多个表面测量值找到圆心。
我目前使用基于三个点的简化算法(用C#编写)来寻找中心(取自How to determine the radius and center of a circle when only three noncollinear points are known?):
private Point CircleCenter(List<Point> points, double p1Skip, double p2Skip, double p3Skip)
{
var p1 = points.Skip((int)(points.Count * p1Skip)).First();
var p2 = points.Skip((int)(points.Count * p2Skip)).First();
var p3 = points.Skip((int)(points.Count * p3Skip)).First();
double mr = (p2.Y - p1.Y) / (p2.X - p1.X);
double mt = (p3.Y - p2.Y) / (p3.X - p2.X);
double centerX = (mr * mt * (p3.Y - p1.Y) + mr * (p2.X + p3.X) - mt * (p1.X + p2.X)) / (2 * (mr - mt));
double centerY = (-1 / mr) * (centerX - ((p1.X + p2.X) / 2)) + ((p1.Y + p2.Y) / 2);
return new Point(centerX, centerY, p1.Z);
}
问题是这种方法对噪声非常敏感。如果其中一个点关闭,它当然会影响中心点。 对于每个横截面,我有 640 个表面点可用,并且认为应该可以使用超过 3 个点。
我猜测现有算法应该可以扩展更多点,但我不知道如何。
【问题讨论】:
-
有趣的问题...固定一个圆的 3 个点在数学上是正确的,即使您知道该圆上有更多点,您也无法做很多事情。我认为方向应该是如何降低噪音,或者如何明智地选择640个点中的3个点来形成一个更好的近似圆(圆心)...
-
一种想法是使用不同的点进行许多不同的 3 点计算,然后计算这些点的平均值或中位数。我现在正在研究这个
-
是的......类似的想法(只是概念,完全不知道如何实现),我认为将640点“收缩”成更少的点,比如320,重复(并细化)听起来更可行) 每次迭代,直到剩下约 3 个点,然后用这 3 个点形成一个圆?
-
首先,准确定义要最小化的内容。例如它是每个点距估计圆的距离的平方和吗?然后你可以把它当作一个优化问题来处理。
-
我用你的建议改进了我的答案@samgak,它确实改善了结果。
标签: c# algorithm math geometry