gpt4 book ai didi

c# - silverlight/wpf 中的交点

转载 作者:行者123 更新时间:2023-12-02 01:10:55 25 4
gpt4 key购买 nike

给定这样的路径:

<Path Stretch="Fill" Stroke="#FFD69436" Data="M 0,20 L 22.3,20 L 34,0 L 44.7,20 L 68,20 L 55.8,40 L 68,60 L 44.7,60 L 34,80 L 22.3,60 L 0,60 L 11.16,40 L 0,20 Z">
<Path.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFFFFF" Offset="0" />
<GradientStop Color="Orange" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Path.Fill>
</Path>

如何获取该图形任意角度边缘的点?假设我想要该图形的边缘与穿过该图形中心的线之间的交点,与 OX 轴成 30 度角?

谢谢。

最佳答案

有很多不同的方法可以做到这一点,具体取决于您需要的性能和准确性以及您愿意编写多少几何代码。

<强>1。使用 FillContains

一种方法是构造连续的线几何图形并使用 path.Data.FillContains(geometry) 来确定它们是否与图形相交。大致如下:

Transform rotation = new RotateTransform { Angle = 30 };

double max = path.Width + path.Height;
double current = 0;
for(double delta = max/2; delta > 0.25; delta = delta/2)
{
var line = new LineGeometry(
new Point(centerX + current, centerY),
new Point(centerX + max, centerY),
rotation);
if(path.Data.FillContains(line))
current += delta;
}
var intersectPoint = rotation.Transform(new Point(current, 0));

<强>2。使用 GetFlattenedPathGeometry

另一种方法是使用 GetFlattenedPathGeometry:

var flattened = path.Data.GetFlattenedPathGeometry();
var segment = pg.Figures[0].Segments[0] as PolyLineSegment;
Point[] points = segment.Points;
for(int i=0; i<points.Count-1; i++)
{
... check for intersection with the line from points[i] to points[i+1] ...
}

这可能会更快,因为几何图形仅处理一次,但需要您编写自己的线相交算法(非常简单)。

<强>3。使用 PathGeometry.CreateFromGeometry

最有效的方法是将给定的几何图形转换为 PathGeometry,然后手动迭代几何图形中的图形和线段:

var geo = PathGeometry.CreateFromGeometry(path.Data); foreach(geo.Figures 中的 var 图) foreach(图中的var段.Segments) if(线段是线段) ... else if(线段是ArcSegment) ... else if(线段是BezierSegment) ... else if(线段是 QuadraticBezierSegment) ... else if(线段是PolyLineSegment) ... else if(线段是PolyBezierSegment) ... else if(线段是 PolyQuadraticBezierSegment) ...

这种方法需要相当多的几何分析代码,但速度非常快,因为 WPF 不需要构造展平的几何图形或进行重复的相交。当我需要代码运行得非常快时,这是我通常使用的技术。

关于 GetWidenedPathGeometry 的说明

到目前为止我所说的一切都会为您提供几何路径数据和相交线之间的交集:它不考虑线宽、端盖等。要考虑这些,您将需要使用GetWidenedPathGeometry 如下:

var widenedData = path.Data.GetWidenedPathGeometry(new Pen { ... });

Pen 参数是通过 path.Stroke、path.StrokeWidth 等设置的。

完成此操作后,使用上述技术之一将“path.Data”替换为“widenedData”。

关于c# - silverlight/wpf 中的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595359/

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