Die Linie Sie bekommen ist die Vereinigung von drei verschiedenen Bezier-Kurven - einer für jede Gruppe von drei Punkten. (Eine für jedes "Bezier-Segment"?)
Wenn Sie eine einzelne glatte Kurve wollen, müssen Sie Ihre 9 (oder mehr) Punkte als eine einzige Sammlung von Punkten (einzelnes "Bezier-Segment"?), Nicht als Gruppen von drei Punkten.
Edit: Anscheinend BezierSegment
nur unterstützt drei Punkte, also kein Wunder, dass dies nicht funktioniert. Sogar 'PolyBezierSegment' gibt nur eine Sammlung von Bezier-Segmenten statt einer einzelnen glatten Bezier ...
Also, da WPF nichts nützliches gibt, klopfte ich etwas zusammen mit der Mathematik here. Es ist eine numerische Lösung, aber es scheint ziemlich performant zu sein, auch mit genügend Punkte schön aussehen und glatt:
PolyLineSegment GetBezierApproximation(Point[] controlPoints, int outputSegmentCount)
{
Point[] points = new Point[outputSegmentCount + 1];
for (int i = 0; i <= outputSegmentCount; i++)
{
double t = (double)i/outputSegmentCount;
points[i] = GetBezierPoint(t, controlPoints, 0, controlPoints.Length);
}
return new PolyLineSegment(points, true);
}
Point GetBezierPoint(double t, Point[] controlPoints, int index, int count)
{
if (count == 1)
return controlPoints[index];
var P0 = GetBezierPoint(t, controlPoints, index, count - 1);
var P1 = GetBezierPoint(t, controlPoints, index + 1, count - 1);
return new Point((1 - t) * P0.X + t * P1.X, (1 - t) * P0.Y + t * P1.Y);
}
diese Verwendung,
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
Point[] points = new[] {
new Point(0, 200),
new Point(0, 0),
new Point(300, 0),
new Point(350, 200),
new Point(400, 0)
};
var b = GetBezierApproximation(points, 256);
PathFigure pf = new PathFigure(b.Points[0], new[] { b }, false);
PathFigureCollection pfc = new PathFigureCollection();
pfc.Add(pf);
var pge = new PathGeometry();
pge.Figures = pfc;
Path p = new Path();
p.Data = pge;
p.Stroke = new SolidColorBrush(Color.FromRgb(255, 0, 0));
((Grid)sender).Children.Add(p);
}
Ich sehe es ist natürlich, diese Zahl zu haben, können Sie einen Link mit der gewünschten Kurve buchen? –
Oder möchten Sie vielleicht ein einzelnes Segment mit 7 Kontrollpunkten zeichnen? –