Cómo suavizar el segmento de línea WPF de la trayectoria de la figura

A continuación se muestra el código de Android.

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

Introduzca aquí la descripción de la imagen

Para quitar la esquina aguda , estoy usando

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

Introduzca aquí la descripción de la imagen

Cuando viene a WPF , estoy usando el código siguiente.

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

Estoy obteniendo el siguiente efecto.

Introduzca aquí la descripción de la imagen

Tenga en cuenta que, evito utilizar PolyQuadraticBezierSegment o PolyBezierSegment . Tiende a ser inestable . Esto significa que cada vez que añado un nuevo punto de entrada al gráfico de líneas, el punto recién agregado tenderá a cambiar el antiguo camino, que ya está dibujado en la pantalla. Como un efecto final, usted puede observar todo el gráfico de línea está temblando

¿Puedo saber en WPF, cómo puedo suavizar el segmento de línea? Aunque he utilizado lineSegment.IsSmoothJoin = true; , Todavía puedo ver la esquina aguda. ¿Puedo tener algo equivalente a CornerPathEffect de Android?

Lo sé, zombie hilo post. Usted probablemente ya ha resuelto este problema, pero aquí están mis pensamientos años después del hecho …


Como el suavizado depende de varios puntos de la línea, creo que será bastante difícil encontrar un algoritmo de suavizado que parezca razonable sin producir alguna inestabilidad en el borde de ataque. Probablemente puede reducir el alcance de la inestabilidad, pero sólo en el riesgo de producir un rastro de aspecto muy extraño.

La primera opción sería utilizar un algoritmo spline que limite los artefactos de proyección. Por ejemplo, el algoritmo Catmull-Rom utiliza dos puntos conocidos a cada lado del segmento de curva que se interpola. Puede sintetizar dos puntos adicionales en cada extremo de la curva o simplemente dibujar el primer segmento de curva como una línea recta. Esto dará una línea recta como el último segmento, más una curva como el segundo al último segmento que debería cambiar muy poco si es que cuando se agrega otro punto.

Alternativamente, puede ejecutar los puntos de datos reales a través de un cálculo spline inicial para multiplicar los puntos, luego ejecutar esos puntos a través del algo spline por segunda vez. Todavía tendrá que actualizar los últimos 2m puntos (donde m es el multiplicador del primer pase) o la salida se verá distorsionada.

Acerca de la única otra opción que puedo pensar es tratar de predecir un par de puntos por delante sobre la base de sus datos anteriores, lo que puede ser difícil, incluso con una entrada bastante regular. Utilicé esto para sintetizar los puntos de control de Bezier para los extremos de mis curvas – estaba calculando CPs para todos los puntos y necesitaba algo para usar para los puntos finales – y tuve algunos momentos interesantes tratando de detener los segmentos de la curva final de mirar horriblemente deformada .

Oh, una más … no graficar el segmento final de la curva. Si termina su curva en P n-1, la curva debe permanecer estable. Dibuja el segmento final en un estilo diferente si debes mostrarlo en absoluto. Dado que las splines CR sólo necesitan +/- 2 puntos conocidos de la interpolación, el segmento P n-2 -P n-1 debería ser lo suficientemente estable.

Si no tiene código para el algoritmo de CR, puede hacer básicamente lo mismo con los puntos de control de Bezier sintéticos. En lugar de tratar de describir el proceso, echa un vistazo a este post del blog que da una buena distribución del proceso. Este artículo tiene código adjunto que puede ser útil.

  • Pase objetos personalizados a la siguiente actividad en Xamarin Android
  • Entrada de un juego de ritmo
  • En XNA a Mono Android Conversiones: ¿Qué es una manera simple (o la más simple) de manejar el ciclo de vida de la actividad?
  • MonoDroid GetSpans último parámetro
  • MonoGame vs Unity3D
  • No autorizado al llamar a Google GCM
  • Mensajes de GCM no se entregan
  • ¿Existe algún compilador gratuito de C ++ y / o C # que se ejecute en un Tablet PC con Android?
  • No se puede implementar Xamarin aplicación correctamente
  • HttpClient falta del subconjunto portátil .Net al crear PCL en Xamarin
  • Error de compilación de Android C # Xamarin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.