Voir aussi: même question sur Math.SE
Comment puis-je trouver la longueur d'arc d'une courbe de Bézier? Par exemple, une courbe de Bézier linéaire a la longueur:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Mais qu'en est-il des courbes de Bézier quadratiques, cubiques ou à n degrés?
(Mon objectif était d'estimer une résolution d'échantillonnage à l'avance, donc je n'ai pas à perdre de temps à vérifier si le point suivant touche le point précédent.)
mathematics
graphics
beziers
heuristics
Mateen Ulhaq
la source
la source
Réponses:
Une méthode simple pour les Béziers cubiques consiste à diviser la courbe en N segments et à additionner les longueurs des segments.
Cependant, dès que vous aurez besoin de la longueur d'une partie seulement de la courbe (par exemple jusqu'à un point 30% de la longueur), le paramétrage de la longueur d' arc entrera en jeu. J'ai posté une réponse assez longue à l'une de mes propres questions sur Béziers, avec un exemple de code simple.
la source
1.0/t
(appeléresolution
), c'est donc pour "en temps réel" (qui est au mieux 10fps sur le NXT lent). Chaque itération,t += resolution
et un nouveau point / ligne est tracé. Quoi qu'il en soit, merci pour l'idée.Bien que je sois d'accord avec les réponses que vous avez déjà obtenues, je veux ajouter un mécanisme d'approximation simple mais puissant que vous pouvez utiliser pour n'importe quel degré Courbes de Bézier: Vous subdivisez continuellement la courbe en utilisant la subdivision de Casteljau jusqu'à la distance maximale des points de contrôle d'une sous-courbe à la ligne de base de la sous-courbe est inférieure à un epsilon constant . Dans ce cas, la sous-courbe peut être approximée par sa ligne de base.
En fait, je pense que c'est l'approche généralement adoptée lorsqu'un sous-système graphique doit tracer une courbe de Bézier. Mais ne me citez pas là-dessus, je n'ai pas de références pour le moment.
En pratique, cela ressemblera à ceci: (sauf que la langue n'est pas pertinente)
la source
Les longueurs d'arc pour les courbes de Bézier ne sont fermées que pour les courbes linéaires et quadratiques. Pour les cubiques, il n'est pas garanti d'avoir une solution fermée. La raison en est que la longueur de l'arc est définie par une intégrale radicale, pour laquelle n'a un fermé que pour les polynômes du 2e degré.
Juste pour référence: La longueur d'un Bézier quadratique pour les points (a, p) (b, q) et (c, r) est
Où LN est le logarithme naturel, et ^ désigne la puissance et √ la racine carrée.
Par conséquent, il devrait être plus facile et moins cher d'approcher l'arc par une autre règle, comme un polygone ou un schéma d'intégration comme la règle de Simpson, car les racines carrées du LN sont des opérations coûteuses.
la source
J'ai calculé l'expression de longueur sous forme fermée pour un Bézier à 3 points (ci-dessous). Je n'ai pas tenté d'élaborer un formulaire fermé pour plus de 4 points. Cela serait très probablement difficile ou compliqué à représenter et à gérer. Cependant, une technique d'approximation numérique telle qu'un algorithme d'intégration Runge-Kutta fonctionnerait assez bien en s'intégrant à l'aide de la formule de longueur d'arc . Mes questions et réponses sur RK45 sur MSE peuvent aider à la mise en œuvre de RK45.
Voici un code Java pour la longueur d'arc de 3 points de Bézier, avec des points
a
,b
etc
.la source