为了实现平滑曲线,我们可以使用
三次贝塞尔曲线,如上面的
答案所示,使用
PolyBezierSegment类。
它是如何工作的
一个三次贝塞尔曲线由四个点定义:起始点、终止点和两个控制点。
对于集合中的每三个点,第一个和第二个点指定曲线的两个控制点,第三个点指定终点。请注意,没有指定曲线的起始点,因为起始点与上一段的终点相同。
如果您只想指定每个段的起始点和终止点,则需要动态计算控制点,这将取决于您需要的曲率类型。
在以下示例中,我将定义3个点,然后硬编码控制点以定义曲率,这应该使用根据您的需求计算曲率的算法来完成。
请注意,我正在将起始点添加到点集合中,尽管
path figure类需要一个起始位置点,而
PolyBezierSegment类需要一个包含多个3(2个控制点和一个结束点)的集合。
Point start = new(50, 50),
mid = new(80, 100),
end = new(200, 150);
Point[] _points = new[]
{
start,
new(start.X, start.Y + (mid.Y - start.Y) / 2),
new(mid.X - (mid.X - start.X) / 2, mid.Y),
mid,
new(mid.X + (end.X - mid.X) / 2, mid.Y),
new(end.X, end.Y - (end.Y - mid.Y) / 2),
end
;
PathGeometry connectorGeometry = new()
{
Figures = new PathFigureCollection()
{
new PathFigure()
{
StartPoint = _points[0],
Segments = new PathSegmentCollection()
{
new PolyBezierSegment(
points: _points.Skip(1),
isStroked: true)
}
}
}
};
Path smoothCurve = new()
{
Stroke = Brushes.Black,
StrokeThickness = 3,
Data = connectorGeometry
};
Graph.Children.Add(smoothCurve);
结果:
![Example](https://istack.dev59.com/GJzab.webp)