2012-09-26 14 views
7

Il seguente è il codice Android.Come appianare il segmento di linea WPF del percorso figura

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

enter image description here

Al fine di rimuovere il forte angolo, sto usando

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

enter image description here

quando si tratta di WPF, io sto usando il codice seguente .

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); 

Ho ottenuto il seguente effetto.

enter image description here

Si noti che, evito di usare PolyQuadraticBezierSegment o PolyBezierSegment. Tende a diventare instabile. Ciò significa che, ogni volta che aggiungo un nuovo punto di arrivo al grafico a linee, il punto appena aggiunto tenderà a cambiare il vecchio percorso, che è già disegnato sullo schermo. Come effetto finale, è possibile osservare che l'intero grafico a linee è scuotendo

Posso sapere in WPF come posso appianare il segmento di linea? Anche se ho usato lineSegment.IsSmoothJoin = true;, riesco ancora a vedere l'angolo acuto. Posso avere qualcosa di equivalente a CornerPathEffect di Android?

risposta

0

Lo so, post thread zombie. Probabilmente già risolto questo problema, ma qui sono i miei pensieri anni dopo il fatto ...


Dal levigante dipende da più punti della linea penso che sarà molto difficile trovare un algoritmo di smoothing che sembra ragionevole senza produrre instabilità nel bordo d'attacco. Probabilmente è possibile ridurre la portata dell'instabilità, ma solo a rischio di produrre una traccia molto strana.

Prima opzione sarebbe utilizzare un algoritmo spline che limita gli artefatti di proiezione. Ad esempio, l'algoritmo Catmull-Rom utilizza due punti noti su entrambi i lati del segmento di curva che viene interpolato. È possibile sintetizzare due punti aggiuntivi a ciascuna estremità della curva o semplicemente disegnare il primo segmento di curva come una linea retta. Questo darà una linea retta come l'ultimo segmento, più una curva come il penultimo segmento che dovrebbe cambiare molto poco se non viene aggiunto un altro punto.

In alternativa è possibile eseguire i punti di dati effettivi tramite un calcolo spline iniziale per moltiplicare i punti, quindi eseguire questi punti attraverso la spline algo una seconda volta. Dovrai comunque aggiornare i più recenti punti 2m (dove m è il moltiplicatore del primo passaggio) o l'output apparirà distorto.

L'unica altra opzione che posso pensare è di provare a prevedere un paio di punti in base ai dati precedenti, il che può essere difficile anche con un input abbastanza regolare. L'ho usato per sintetizzare i punti di controllo Bezier per le estremità delle mie curve - stavo calcolando i CP per tutti i punti e avevo bisogno di qualcosa da usare per i punti finali - e ho avuto alcuni momenti interessanti cercando di fermare i segmenti della curva finale dall'aspetto orribilmente deformato .

Oh, ancora uno ... non rappresentare il segmento della curva finale. Se si termina la curva a P n-1, la curva dovrebbe rimanere stabile. Disegna il segmento finale in uno stile diverso se devi mostrarlo a tutti. Dal momento che le spline C-R richiedono solo +/- 2 punti noti dall'interpolazione, il segmento P n-2 n-1 deve essere sufficientemente stabile.

Se non si dispone del codice per l'algoritmo C-R, è possibile fare praticamente la stessa cosa con i punti di controllo Bezier sintetici. Piuttosto che tentare di descrivere il processo, controlla this blog post che fornisce una ripartizione abbastanza buona del processo. This article ha il codice allegato che può essere utile.

Problemi correlati