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

2024-01-03

如果我有一条闭合路径,我可以使用Geometry.GetArea()来近似我的形状的面积。这太棒了,节省了我很多时间。但是周围有什么东西可以帮助我找到一条未闭合路径的长度吗?

我现在能想到的最好办法就是确保我正在使用PathGeometry并致电GetPointAtFractionLength方法多次,获取点并将所有这些点之间的距离相加。

Code:

    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)));
    }

为了更快地进行近似,请调用 GetFlattenedPathGeometry,它将您的路径转换为一系列直线,并将直线长度相加。

这与您现有的代码几乎做同样的事情,除了它更智能地选择线段(例如,贝塞尔曲线分割成的线段数量取决于曲率),因此您的线段数量将少几个数量级。相同的精度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C#/WPF 中获取 PathGeometry(行)的长度 的相关文章