tiempo real matrices graficos graficas graficar grafica coordenadas barras python algorithm bezier curve-fitting

python - real - ¿Cómo puedo ajustar una curva de Bézier a un conjunto de datos?



matplotlib python (7)

Tengo un conjunto de puntos de datos (que puedo diluir) que necesito para encajar con una curva de Bézier . Necesito velocidad sobre la precisión, pero el ajuste debe ser lo suficientemente decente como para ser reconocible. También estoy buscando un algoritmo que pueda usar que no haga mucho uso de las bibliotecas (específicamente NumPy ).

He leído varios artículos de investigación, pero ninguno tiene suficientes detalles para implementarlos por completo. ¿Hay ejemplos de código abierto?



En primer lugar, asegúrese de que lo que pide es en realidad lo que quiere. Ajustar los puntos a una curva Bezier los colocará en el casco de los puntos. El uso de una spline asegurará que su curva atraviese todos los puntos.

Dicho esto, crear la función que dibuja cualquiera de los dos no es complicado en absoluto. Wikipedia tiene un buen artículo que explicará lo básico, la curva de Bézier .


Lo que falta en muchas de estas respuestas es que es posible que no desee ajustar una única curva de Bézier cúbica a sus datos. Más generalmente, le gustaría ajustar una secuencia de curvas de Bézier cúbicas, es decir, un ajuste de Bézier cúbico a trozos, a un conjunto de datos arbitrario.

Hay una buena tesis que data de 1995, completa con el código MATLAB, que hace esto:

% Lane, Edward J. Fitting Data Using Piecewise G1 Cubic Bezier Curves. % Thesis, NAVAL POSTGRADUATE SCHOOL MONTEREY CA, 1995

http://www.dtic.mil/dtic/tr/fulltext/u2/a298091.pdf

Para usar esto, debe, como mínimo, especificar el número de puntos de nudo, es decir, el número de puntos de datos que utilizarán las rutinas de optimización para hacer que esto se ajuste. Opcionalmente, puede especificar los propios puntos de nudo, lo que aumenta la confiabilidad de un ajuste. La tesis muestra algunos ejemplos bastante difíciles. Tenga en cuenta que el enfoque de Lane garantiza la continuidad G1 (las direcciones de los vectores tangentes adyacentes son idénticas) entre los segmentos de Bézier cúbicos, es decir, las uniones lisas. Sin embargo, puede haber discontinuidades en la curvatura (cambios en la dirección de la segunda derivada).

He vuelto a implementar el código, actualizándolo a MATLAB moderno (R2015b). Ponte en contacto conmigo si quieres.

Aquí hay un ejemplo de cómo usar solo tres puntos de nudo (elegidos automáticamente por el código), se ajusta dos segmentos Bézier cúbicos a una figura de Lissajous.


Puede configurar el problema como ajuste de mínimos cuadrados a datos ruidosos.

Ver http://nbviewer.ipython.org/5688579

Tenga en cuenta que una vez que calcule las ecuaciones, el cálculo real es bastante simple. Los cálculos reales suman los datos y luego invierten y multiplican una matriz 4x4.

Sé que este hilo ya está muerto, pero encontré que este es un problema interesante en caso de que alguien más se tropiece con él.

Consulte http://www.embedded.com/electrical-engineer-community/industry-blog/4027019/1/Why-all-the-math- para un excelente tutorial en los mínimos cuadrados.


Si la mayoría de los datos se ajustan al modelo, puede probar con RANSAC . Sería bastante fácil elegir 4 puntos y al azar y ajustar una curva más bonita de esos. No estoy seguro de lo costoso de mi cabeza lo costoso que sería evaluar la curva contra todos los otros puntos (parte del algoritmo RANSAC). Pero sería una solución lineal y RANSAC es realmente fácil de escribir (y probablemente haya algoritmos de código abierto).


Tengo un problema similar y he encontrado "Un algoritmo para ajustar curvas digitalizadas automáticamente" de Graphics Gems (1990) sobre el ajuste de curvas Bezier. Además, he encontrado el código fuente de ese artículo.

Lamentablemente está escrito en C que no sé muy bien. Además, el algoritmo es bastante difícil de entender (al menos para mí). Estoy tratando de traducirlo en código C #. Si voy a tener éxito, trataré de compartirlo.

El archivo GGVecLib.c en la misma carpeta que FitCurves.c contiene funciones básicas de manipulación de vectores.

He encontrado una pregunta similar de Desbordamiento de pila, Alisando una curva dibujada a mano . La respuesta aprobada proporciona el código C # para un algoritmo de ajuste de curvas de Graphic Gems.


Tuve una solución MATLAB para este problema. Encontré el mismo problema, pero mi código está escrito en MATLAB. Espero que no sea demasiado difícil traducirlo a Python.

Puede encontrar los puntos de control con este código FindBezierControlPointsND.m Por alguna razón, no tiene la función "ChordLengthNormND" en su archivo, pero se llama en la línea 45.

Lo reemplacé por las siguientes líneas:

[arclen,seglen] = arclength(p(:,1),p(:,2),''sp''); t = zeros(size(p,1),1); sums = seglen(1); for i = 2:size(p,1)-1 t(i) = sums / arclen; sums = sums + seglen(i); end t(end) = 1;

El código MATLAB de arclength se puede obtener aquí.

Después de eso, tenemos puntos de control para la curva de Bezier, y hay mucha implementación de la construcción de la curva de Bezier por los puntos de control en la web.