在C#/ WPF中获取PathGeometry(行)的长度

Ros*_*ber 4 c# wpf path pathgeometry

如果我有一条封闭的路径,我可以Geometry.GetArea()用来近似我的形状区域.这很棒,节省了我很多时间.但周围有什么可以帮助我找到一条未封闭路径的长度吗?

我现在能够想出的最好PathGeometryGetPointAtFractionLength方法是确保我正在使用并多次调用该方法,获得积分并累加所有这些点之间的距离.

码:

    public double LengthOfPathGeometry(PathGeometry path, double steps)
    {
        Point pointOnPath;
        Point previousPointOnPath;
        Point tangent;

        double length = 0;

        path.GetPointAtFractionLength(0, out previousPointOnPath, out tangent);

        for (double progress = (1 / steps); progress < 1; progress += (1 / steps))
        {
            path.GetPointAtFractionLength(progress, out pointOnPath, out tangent);
            length += Distance(previousPointOnPath, pointOnPath);
            previousPointOnPath = pointOnPath;
        }
        path.GetPointAtFractionLength(1, out pointOnPath, out tangent);
        length += Distance(previousPointOnPath, pointOnPath);

        return length;
    }

    public static double Distance(Point p0, Point p1)
    {
        return Math.Sqrt((Math.Pow((p1.X - p0.X),2) + Math.Pow((p1.Y - p0.Y),2)));
    }
Run Code Online (Sandbox Code Playgroud)

double length = LengthOfPathGeometry(Bob, 10000);

对于此示例,返回的结果应该在某处:1324.37

这看起来很好,但有其缺陷.如果我想要一个非常大的线的更准确的数字,我需要更多的步骤.如果你达到100000步以上,你会遇到很长时间的近似.在我的测试机器上每个方法调用几秒钟.

有谁知道更接近任何形状线的长度的方法?

arx*_*arx 6

要获得更快的近似值,请调用GetFlattenedPathGeometry,它将您的路径转换为一系列直线,并将线长相加.

这与现有代码完全相同,只是它更智能地选择线段(例如,贝塞尔曲线分割成的线段数取决于曲率),因此您的点数将减少几个数量级.精度相同.