我正准备创建一个程序,以从点(x,y)的集合中检测弧和线段,这些点彼此跟随,通常它们会创建一个封闭的多边形。 我只是不知道从哪里开始。 也许有人知道“准备出发”的图书馆(可以付费),这对我有何想法?还是一些相对容易实现的算法命题?我正在寻找任何建议。
答案 0 :(得分:1)
如果您的点没有精确地落在圆弧和线段上,但是您正试图找到最合适的点,请参见:“ https://en.wikipedia.org/wiki/Curve_fitting”。
如果您的点正好遵循弧或线段,则此封闭式解决方案可能对您有用。 假定弧线至少由4个点组成。您可以创建具有任意3个点的弧,因此无法判断它们是弧段还是线段(除非您使用角度阈值)。有了4个点,您就可以比较(0,1,2)和(0,1,3)点是否在同一弧中。
从3个点创建弧形对象时,在内部会计算半径和中心以进行比较。要从3个点中找到一个圆:https://math.stackexchange.com/questions/213658/get-the-equation-of-a-circle-when-given-3-points
PolyCurve ArcsAndLines(List<Point3d> points)
{
var curve = new PolyCurve();
Arc current = Arc.Unset;
for (int i = 0; i < points.Count - 1; i++)
{
var areEqual = false;
if (i + 3 < points.Count)
{
var arcA = new Arc(points[i], points[i + 1], points[i + 2]);
var arcB = new Arc(points[i], points[i + 1], points[i + 3]);
areEqual = AreEqual(arcA, arcB);
}
if (areEqual)
{
var start = current == Arc.Unset ? points[i] : current.StartPoint;
current = new Arc(start, points[i + 1], points[i + 3]);
}
else
{
if (current != Arc.Unset)
{
curve.Append(current);
current = Arc.Unset;
i++;
}
else
{
curve.Append(new Line(points[i], points[i + 1]));
}
}
}
return curve;
}
bool AreEqual(Arc a, Arc b)
{
const double tol = 0.001;
bool sameRadius = Math.Abs(a.Radius - b.Radius) < tol;
if (!sameRadius) return false;
bool sameCenter = a.Center.DistanceTo(b.Center) < tol;
return sameCenter;
}
“曲线”是一个包含线段和弧段的列表。
它应该与开放的折线和多边形一起工作(终点与起点相同)。如果多边形的起点位于圆弧的中间,它将被分成两个圆弧。 规则的多边形(产生一个圆)将无法正常工作,因为您将定义一个具有相同起点和终点的弧。