gpt4 book ai didi

c# - 在 C#/WPF 中获取 PathGeometry(线)的长度

转载 作者:太空狗 更新时间:2023-10-30 00:35:16 24 4
gpt4 key购买 nike

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

目前我能想到的最好方法是确保我使用的是 PathGeometry 并多次调用 GetPointAtFractionLength 方法,获取点和将所有这些点之间的距离相加。

代码:



 public double LengthOfPathGeometry(PathGeometry 路径,双步)
{
点 pointOnPath;
指向 previousPointOnPath;
点切线;

双倍长度 = 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);

返回长度;
}

公共(public)静态双距离(点 p0,点 p1)
{
返回 Math.Sqrt((Math.Pow((p1.X - p0.X),2) + Math.Pow((p1.Y - p0.Y),2)));
}

用法(XAML):

    <Path Stroke="Beige" StrokeThickness="5" x:Name="Robert">
<Path.Data>
<PathGeometry x:Name="Bob">
<PathGeometry.Figures>
<PathFigure StartPoint="20,10" IsClosed="False" IsFilled="False">
<PathFigure.Segments>
<BezierSegment
Point1="100,50"
Point2="100,200"
Point3="70,200"/>
<LineSegment Point="200,300" />
<ArcSegment
Size="50,50" RotationAngle="45"
IsLargeArc="True" SweepDirection="Counterclockwise"
Point="250,150"/>
<PolyLineSegment Points="450,75 190,100" />
<QuadraticBezierSegment Point1="50,250" Point2="180,70"/>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>

用法(代码):

double length = LengthOfPathGeometry(Bob, 10000);

对于这个例子,返回的结果应该在某个地方:1324.37

这似乎很好,但也有缺陷。如果我想要一个非常大的线的更准确的数字,我需要更多的步骤。如果你超过 100000 步,你会花很长时间来近似。在我的测试机器上每个方法调用几秒钟。

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

最佳答案

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

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

关于c# - 在 C#/WPF 中获取 PathGeometry(线)的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com