2012-09-26 7 views
7

glätten Die unten ist Android-Code.Wie man WPF Liniensegment von Pfad Abbildung

path.moveTo(xx, yy); 
for (...) { 
    path.lineTo(xx, yy); 
} 
canvas.drawPath(this.path, paint); 

enter image description here

Um die scharfe Ecke, ich

final CornerPathEffect cornerPathEffect = new CornerPathEffect(50); 
paint.setPathEffect(cornerPathEffect); 

enter image description here

Wann WPF kommt, ich den folgenden Code verwende bin mit zu entfernen .

PathFigure pathFigure = new PathFigure(); 
pathFigure.StartPoint = new Point(xx, yy); 
for (...) { 
    LineSegment lineSegment = new LineSegment(new Point(xx, yy), true); 
    lineSegment.IsSmoothJoin = true; 
    pathFigure.Segments.Add(lineSegment); 
} 
PathGeometry pathGeometry = new PathGeometry(new PathFigure[] { pathFigure }); 
drawingContext.DrawGeometry(null, new Pen(Brushes.White, 3), pathGeometry); 

Ich bekomme den folgenden Effekt.

enter image description here

Beachten Sie, dass ich vermeiden PolyQuadraticBezierSegment oder PolyBezierSegment verwenden. Es neigt dazu, instabil zu werden. Dies bedeutet, dass, wenn ich dem Liniendiagramm einen neuen Eingangspunkt hinzufüge, der neu hinzugefügte Punkt dazu neigt, den alten Pfad zu ändern, der bereits auf dem Bildschirm gezeichnet wurde. Als Endergebnis können Sie den gesamten Liniendiagramm beobachten Schütteln

Kann ich in WPF wissen, wie ich das Liniensegment glätten kann? Obwohl ich lineSegment.IsSmoothJoin = true; verwendet habe, kann ich immer noch die scharfe Ecke sehen. Kann ich etwas Ähnliches wie CornerPathEffect von Android haben?

Antwort

0

Ich weiß, Zombie Thread Post. Sie gelöst wahrscheinlich bereits dieses Problem, aber hier sind meine Gedanken Jahre nach der Tat ...


Da Glättung auf mehrere Punkte in der Linie abhängt ich denke, es wird sehr schwierig sein, einen Glättungsalgorithmus zu finden, das aussieht vernünftig, ohne irgendeine Instabilität in der Vorderkante zu erzeugen. Sie können wahrscheinlich den Umfang der Instabilität reduzieren, aber nur mit dem Risiko, eine sehr merkwürdig aussehende Spur zu erzeugen.

Die erste Option wäre die Verwendung eines Spline-Algorithmus, der die Projektionsartefakte begrenzt. Zum Beispiel verwendet der Catmull-Rom-Algorithmus zwei bekannte Punkte auf jeder Seite des Kurvensegments, die interpoliert werden. Sie können zwei zusätzliche Punkte an jedem Ende der Kurve synthetisieren oder einfach das erste Kurvensegment als gerade Linie zeichnen. Dies ergibt eine gerade Linie als das letzte Segment plus eine Kurve als das vorletzte Segment, die sich sehr wenig ändern sollte, wenn überhaupt ein weiterer Punkt hinzugefügt wird.

Alternativ können Sie die tatsächlichen Datenpunkte durch eine anfängliche Spline-Berechnung ausführen, um die Punkte zu multiplizieren, und dann diese Punkte ein zweites Mal durch den Spline ausführen. Sie müssen immer noch die letzten 2m Punkte aktualisieren (wobei m der Multiplikator des ersten Durchgangs ist) oder die Ausgabe wird verzerrt aussehen. Die einzige andere Option, die ich mir vorstellen kann, ist zu versuchen, einige Punkte vorauszusagen, basierend auf Ihren früheren Daten, was selbst mit einer ziemlich regelmäßigen Eingabe schwierig sein kann. Ich benutzte dies, um Bezier-Kontrollpunkte für die Enden meiner Kurven zu synthetisieren - ich berechnete CPs für alle Punkte und benötigte etwas für die Endpunkte - und hatte einige interessante Male versucht, die letzten Kurvensegmente davon abzuhalten, schrecklich deformiert zu wirken .

Oh, noch eins ... nicht das endgültige Kurvensegment grafisch darstellen. Wenn Sie Ihre Kurve bei P n-1 beenden, sollte die Kurve stabil bleiben. Zeichnen Sie das letzte Segment in einem anderen Stil, wenn Sie es überhaupt zeigen müssen. Da C-R-Splines nur +/- 2 bekannte Punkte von der Interpolation benötigen, sollte das Segment stabil genug sein.

Wenn Sie keinen Code für den C-R-Algorithmus haben, können Sie das gleiche mit synthetischen Bezier-Kontrollpunkten tun. Anstatt zu versuchen, den Prozess zu beschreiben, überprüfen Sie this blog post, die eine ziemlich gute Aufschlüsselung des Prozesses gibt. This article hat Code beigefügt, der nützlich sein kann.