从点集合中检测弧线段

时间:2019-06-06 21:48:20

标签: c# straight-line-detection

我正准备创建一个程序,以从点(x,y)的集合中检测弧和线段,这些点彼此跟随,通常它们会创建一个封闭的多边形。 我只是不知道从哪里开始。 也许有人知道“准备出发”的图书馆(可以付费),这对我有何想法?还是一些相对容易实现的算法命题?我正在寻找任何建议。

1 个答案:

答案 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;
    }

“曲线”是一个包含线段和弧段的列表。

它应该与开放的折线和多边形一起工作(终点与起点相同)。如果多边形的起点位于圆弧的中间,它将被分成两个圆弧。 规则的多边形(产生一个圆)将无法正常工作,因为您将定义一个具有相同起点和终点的弧。