Comment puis-je ajuster une courbe de Bézier à un ensemble de données?

j'ai un ensemble de points de données (que je peux éclaircir) que je dois ajuster avec une courbe Bézier . J'ai besoin de vitesse plutôt que de précision, mais l'ajustement devrait être assez décent pour être reconnaissable. Je suis également à la recherche d'un algorithme que je peux utiliser qui ne fait pas beaucoup usage des bibliothèques (spécifiquement NumPy ).

j'ai lu plusieurs documents de recherche, mais aucun n'a assez de détails pour pleinement mettre en œuvre. Existe-il des open-source des exemples?

20
demandé sur Peter Mortensen 2011-06-10 00:44:53

7 réponses

j'ai un problème similaire et j'ai trouvé" un algorithme pour ajuster automatiquement les courbes numérisées " de Graphics Gems (1990) à propos de l'ajustement de courbe de Bezier. En outre, j'ai trouvé code source pour cet article.

malheureusement, il est écrit en C que je ne connais pas très bien. Aussi, l'algorithme est assez dur à comprendre (au moins pour moi). J'essaie de le traduire en C# code. Si je vais réussir, je vais essayer de le partager.

fichier GGVecLib.c dans le même dossier que FitCurves.c contient des fonctions de manipulation de vecteurs de base.

j'ai trouvé une question similaire sur le débordement de la pile, Lissage d'une courbe dessinée à la main . La réponse approuvée fournit le code C# pour un algorithme d'ajustement de courbe des gemmes graphiques.

16
répondu Archibald 2017-05-23 12:34:08

ce qui manque dans beaucoup de ces réponses est que vous pouvez ne pas vouloir ajuster une seule courbe de Bézier cube à vos données. Plus généralement, vous souhaitez ajuster une séquence de courbes cubiques de Bézier, c'est-à-dire un ajustement cubique de Bézier par morceaux, à un ensemble arbitraire de données.

il y a une belle thèse datant de 1995, avec le code MATLAB, qui fait ceci:

% 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

pour utiliser ceci, vous devez, au minimum, spécifier le nombre de points de noeud, c.-à-d., le nombre de points de données qui seront utilisés par les routines d'optimisation pour faire cet ajustement. En option, vous pouvez spécifier les nœuds eux-mêmes, ce qui augmente la fiabilité de l'ajustement. La thèse montre quelques exemples assez difficiles. Notez que L'approche de Lane garantit la continuité G1 (directions des vecteurs tangents adjacents identiques) entre les segments cubiques de Bézier, c'est-à-dire les joints lisses. Toutefois, il peut y avoir des discontinuités dans la courbure (changements dans la direction de la dérivée secondaire).

j'ai réimplémenté le code, le mettant à jour en MATLAB moderne (R2015b). Contactez-moi si vous le souhaitez.

voici un exemple d'utilisation de seulement trois noeuds (choisis automatiquement par le code) les ajustements deux segments de Bézier cube à une figure Lissajous.

Lissajous figure

7
répondu Biofloat 2018-04-29 16:27:11

vous pouvez configurer le problème comme les moindres carrés ajustement à des données bruyantes.

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

notez qu'une fois que vous avez calculé les équations le calcul réel est assez simple. Les calculs réels sont la sommation sur les données, puis l'inversion et la multiplication d'une matrice 4x4.

je sais que ce fil est mort depuis longtemps, mais j'ai trouvé que c'était un problème intéressant au cas où quelqu'un d'autre tomberait dessus.

voir http://www.embedded.com/electrical-engineer-community/industry-blog/4027019/1/Why-all-the-math - pour un excellent tutoriel sur les moindres carrés.

5
répondu Luke Whittlesey 2013-05-31 23:26:09

si la plupart des données correspondent au modèle, vous pouvez essayer RANSAC . Il serait assez facile de choisir 4 points et au hasard et ajuster une courbe plus bezier de ceux. Je ne suis pas sûr du haut de ma tête combien il serait coûteux d'évaluer la courbe par rapport à tous les autres points (partie de L'algorithme RANSAC). Mais ce serait une solution linéaire et RANSAC est vraiment facile à écrire (et il y a probablement des algorithmes open source là-bas).

2
répondu Pace 2011-06-10 00:54:24

ici vous trouvez une implémentation python du code C mentionné. https://github.com/volkerp/fitCurves

2
répondu Fred Guth 2018-02-13 23:31:34

tout d'Abord, assurez-vous que ce que vous demandez est en fait ce que vous voulez. Montage les points d'une courbe de Bézier place dans la coque des points. L'utilisation d'une spline s'assurera que votre courbe passe par tous les points.

cela dit, créer la fonction qui dessine l'un ou l'autre n'est pas compliqué du tout. Wikipedia a un bel article qui expliquera les bases, courbe de Bézier .

0
répondu Pedery 2011-09-05 20:29:48

j'ai eu une solution MATLAB pour ce problème. J'ai rencontré le même problème, mais mon code est écrit en MATLAB. J'espère que ce n'est pas trop difficile de le traduire en Python.

vous pouvez trouver les points de contrôle par ce code FindBezierControlPointsND.m Pour une raison quelconque, il n'a pas de fonction "ChordLengthNormND" dans ses archives, mais on l'appelle à la ligne 45.

Je l'ai remplacé par le texte suivant:

[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;
Le code MATLAB de

arclength peut être obtenu ici.

après cela, nous avons des points de contrôle pour Courbe de Bezier, et il ya beaucoup de mise en œuvre de la construction courbe de Bezier par points de contrôle sur le web.

0
répondu lintseju 2014-06-21 04:33:04