Courbes et surfaces en géométrie informatique, II. Cas particuliers et généraux

Jusqu’à présent, nous avons expliqué comment tracer une courbe passant par un ensemble de points donné. Les méthodes envisagées donnent dans de nombreux cas excellents résultats et sont particulièrement pratiques pour décrire une forme dont la base est obtenue par des expériences ou des calculs mathématiques. Il s’agit par exemple d’une aile d’avion, de composants de moteur, de pièces mécaniques et structurelles. Il existe cependant une autre classe de problèmes dont la solution dépend d'exigences à la fois fonctionnelles et esthétiques, par exemple la conception de la surface d'une voiture, le fuselage d'un avion, la forme d'un navire, des meubles ou des ustensiles. Outre les critères quantitatifs, il faut prendre en compte expérience pratique, et l'intervention interactive du développeur est souvent nécessaire.

Les méthodes discutées ci-dessus, en particulier les splines cubiques, ne sont pas pratiques pour travail interactif. La direction et l’amplitude des tangentes ne fournissent pas la compréhension intuitive nécessaire de la courbe, puisque le lien entre l’ensemble des nombres et la forme de la courbe correspondante n’est pas évident.

Pierre Bézier a proposé une autre méthode pour créer des courbes et des surfaces de n'importe quelle forme. Bézier a tiré la base mathématique de sa méthode de considérations géométriques - mais dans ses travaux, il a été montré que son résultat est équivalent à la base de Bernstein ou à la fonction d'approximation polynomiale.

Riz. 5-25 Courbe de Bézier et ses points déterminants.

Une courbe de Bézier est définie par un polygone, comme le montre la Fig. 5-25. Puisque la base de Bézier est Bernstein, certaines propriétés des courbes de Bézier sont immédiatement connues. Par exemple:

Les fonctions de base sont réelles.

Le degré du polynôme définissant une section de la courbe est inférieur de un au nombre de points du polygone correspondant.

La base de la forme courbe suit le contour d'un polygone.

Les premier et dernier points de la courbe coïncident avec les points correspondants du polygone de définition.

Les vecteurs tangents aux extrémités de la courbe coïncident en direction avec le premier et le dernier côté du polygone.

La courbe se situe à l’intérieur de l’enveloppe convexe du polygone, c’est-à-dire à l’intérieur du plus grand polygone construit selon points donnés. En figue. 5-25, la coque convexe est indiquée par des lignes pointillées et fines.

La courbe a la propriété de réduire la variation. Cela signifie que la courbe ne coupe aucune ligne droite plus souvent que le polygone de définition. La courbe est invariante sous transformations affines.

En figue. La figure 5-26 montre plusieurs polygones de Bézier à quatre points et les courbes correspondantes. Sur la base des propriétés répertoriées ci-dessus, vous pouvez facilement apprendre à prédire la forme d'une courbe en fonction de la forme d'un polygone.

La représentation paramétrique mathématique de la courbe de Bézier est

, , (5-62)

où est la base de Bézier ou de Bernstein, ou la fonction d'approximation

(5-63)

(5-64)

Il s'agit de la fonction d'ordre de base de Bernstein.

Riz. 5-26 polygones de Bézier pour courbes cubiques.

Ici, l'ordre de la fonction de définition de la base de Bernstein - et, par conséquent, du segment de la courbe polynomiale, est inférieur d'un au nombre de points du polygone de définition. Comme le montre la fig. 5-25, les sommets du polygone de Bézier sont numérotés de 0 à . C'est pourquoi .

En figue. 5-27 montre les fonctions approximatives pour différentes significations. Notez que les fonctions sont symétriques. Chaque fonction a un ordre, par exemple les quatre fonctions de la Fig. 5-27b pour le cube. Le maximum de chaque fonction est atteint et est égal à (5-14)

. (5-65)

Riz. 5-27 Fonctions de pondération Bézier/Bernstein. (a) Polygone à trois points, ; (b) de quatre points, ; (c) de cinq points, ; (d) sur six points, .

Par exemple, pour une courbe cubique. Le maximum et est atteint respectivement à et , et a les valeurs

La figure 5-27b illustre cet exemple.

Considérez les équations (5-62) et (5-64) pour le premier point de la courbe, c'est-à-dire à

, ,

, .

,

le premier point de la courbe coïncide avec le premier point du polygone.

De même, pour le dernier point de la courbe, c'est-à-dire au

, ,

, .

et le dernier point de la courbe de Bézier coïncide avec le dernier point du polygone de définition.

Regardons la méthode de construction de Bézier à l'aide d'un exemple.

Exemple 5-7 Courbe de Bézier

Soit les sommets du polygone de Bézier : , , et . Trouvez sept points situés sur la courbe de Bézier.

Considérez les équations (5-62) - (5-64) :

,

.

Dans notre cas, puisqu’il y a quatre sommets. D'ici

,

,

Tableau 5-4 Coefficients pour la courbe de Bézier

Riz. 5-28 Segment de courbe de Bézier, exemple 5-7.

Valeurs pour différentes significations sont donnés dans le tableau. 5-4.

Points sur la courbe :

,

.

Ces points sont représentés sur le polygone de définition de la figure. 5-28.

L'équation de la courbe de Bézier peut s'écrire forme matricielle, tout comme les équations de cannelures cubiques et interpolation parabolique (voir équations 5-27 et 5-44) :

Ici et .

Les formes matricielles pour les petites valeurs sont particulièrement intéressantes. Pour un polygone à quatre points, la courbe de Bézier ressemble à

.

En regroupant les coefficients, on obtient

. (5-68)

De même, une courbe de Bézier du quatrième ordre, donné par un polygoneà partir de cinq points :

. (5-69)

L'ouvrage fournit une représentation généralisée :

,

,

. (5-70)

La Matrice est de retour . Les membres individuels de la matrice sont :

.

L'équation (5-70) peut être écrite sous une forme plus pratique

,

.

Les équations (5-70) ou (5-71) sont plus pratiques pour le calcul lorsque grandes valeurs. Notez que pour tous, la matrice est symétrique par rapport à la diagonale principale et le coin inférieur droit est constitué de zéros.

Pour chaque courbe de Bézier individuelle, il n'est pas nécessaire de connaître les vecteurs tangents à ses extrémités, mais s'il est nécessaire de maintenir la continuité de courbure et de pente aux points de connexion des courbes, de calculer les normales à une surface pour l'éclairage, de calculer courbure locale, il est alors nécessaire de connaître à la fois les dérivées première et seconde de la courbe de Bézier.

D'après l'équation (5-62), la dérivée première de la courbe de Bézier est :

. (5-72)

La dérivée seconde est :

. (5-73)

En différenciant formellement l'équation (5-63), on obtient les dérivées des fonctions de base

. (5-74)

De même, les dérivées secondes ont la forme :

. (5-75)

Au début et à la fin de la courbe de Bézier, soit en et , le calcul numérique des équations (5-74) et (5-75) est difficile.

Une autre façon de calculer la dérivée ième à :

(5-76)

. (5-77)

Les dérivées premières aux extrémités seront donc

(5-78)

. (5-79)

Cela montre que les tangentes à la courbe de Bézier dans les premier et derniers points parallèle aux côtés correspondants du polygone. De même, les dérivées secondes aux extrémités sont :

Les dérivées secondes aux extrémités dépendent des deux côtés les plus proches, c'est-à-dire des trois sommets les plus proches. En général, la -ième dérivée aux points de départ et d'arrivée dépend de ces points et des sommets les plus proches du polygone.

Examinons cela plus en détail à l'aide d'un exemple.

Exemple 5-8 Dérivées des courbes de Bézier

Considérons par exemple un polygone de Bézier à quatre points, comme sur la figure. 5-26 et 5-28. Rappelons la représentation de la courbe

D'où la dérivée première

Rappelons l'exemple 5-7 et différencions directement les fonctions de base

Remplaçons :

La substitution donne

Par conséquent, la direction de la tangente au début de la courbe coïncide avec le premier côté du polygone (voir Figure 5-28).

A la fin de la courbe et

De même, la substitution donne

et la direction du vecteur tangent à la fin de la courbe coïncide avec le dernier côté du polygone.

Pour calculer les dérivées le long d'une courbe, nous utilisons les fonctions de base et les équations (5-74) et (5-75) :

,

,

.

Les résultats sont faciles à calculer pour les deux. En substituant dans l'équation (5-72), nous obtenons la dérivée première en tout point de la courbe. Par exemple, lorsque nous avons

Le résultat pour les points , , , de l'exemple 5 à 7 est présenté sur la Fig. 5-29.

Riz. 5-29 Courbe de Bézier et ses dérivées : ;

; .

,

,

,

.

De même, les dérivées secondes ont la forme :

L'équation (5-73) donne

Une illustration est également présentée sur la Fig.

,

5-29. Notez que le vecteur depuis l'origine jusqu'à n'importe quel point de chacune des courbes représente respectivement la direction et l'amplitude du rayon vecteur et la courbure approximative en ce point de la courbe.

La condition de continuité des courbes de Bézier adjacentes est formulée très simplement. Soit une courbe de Bézier de degré soit spécifiée par les sommets, et une courbe de Bézier de degré adjacente soit définie par les sommets. Alors la continuité de la dérivée première au point de connexion s'exprime par la relation

où est un scalaire.

.

Riz. 5-30 Continuité de la dérivée première pour les courbes de Bézier cubiques.

.

En utilisant les équations (5-78) et (5-79), nous obtenons

De la continuité de la courbe il résulte que

Ainsi, les directions des tangentes à la jonction coïncident si les trois sommets , , sont colinéaires, c'est-à-dire doit se situer sur la ligne entre et .

Si les valeurs des vecteurs tangents coïncident également, alors le milieu du segment de à :

Doit soit former un polygone convexe, soit reposer sur une ligne droite pour maintenir la continuité à la jonction.

Riz. 5-31 Continuité de la dérivée seconde pour les courbes de Bézier du quatrième degré. Pour les courbes de Bézier cubiques, cette condition a la forme Quelques croquis au crayon sur papier montreront que cette exigence limite considérablement l'ensemble des courbes ; Ainsi, en pratique, pour maintenir la continuité des dérivées secondes, les courbes polynomiales de plus de

,

ordre élevé . En figue. La figure 5-31 montre un exemple de continuité des dérivées secondes pour deux courbes de Bézier à cinq points. Ici, vous pouvez appliquer avec succès la technique du travail. Dans le cas limite, le polygone converge vers une courbe. Une flexibilité supplémentaire de la courbe peut également être obtenue en divisant la courbe de Bézier en deux nouvelles afin qu'elles coïncident ensemble avec la courbe d'origine. Les travaux de Barsky ont montré que toute courbe de Bézier peut être divisée en utilisant un paramètre arbitraire dans la plage. Le cas le plus simple- c'est le point médian, c'est-à-dire (cm. ). Lorsqu'il est divisé par un point médian, vous obtenez deux

types spéciaux

courbes de Bézier cubiques. Une courbe de Bézier cubique (voir exercice 5-7) est donnée par

Obtenu en égalisant les vecteurs rayons et les vecteurs tangents à

Les surfaces bicubiques Koons constituent un outil flexible et puissant pour la conception de surfaces. Cependant, leur utilisation pratique, comme pour les courbes splines cubiques, est entravée par la nécessité de spécifier des informations mathématiques précises et intuitivement non évidentes, telles que les coordonnées des points, les vecteurs tangents et les vecteurs de torsion.

Riz. 6-36 Pièces non quadrangulaires. (a) Pentagonal ; (b) triangulaire.

Les problèmes qui se posent sont illustrés dans les figures 6-33-6-35. La plupart de ces problèmes peuvent être surmontés en étendant les concepts de courbes de Bézier aux surfaces.

Le produit cartésien ou tensoriel d'une surface de Bézier est donné par

, (6-58)

où et sont les fonctions de base de Bernstein dans les directions paramétriques et (voir les équations 5-63 et 5-64). Pour plus de commodité, nous répétons ici la définition donnée plus haut dans la section. 5-8

, (5-63)

,

. (6-64)

Ici, les éléments sont les sommets du maillage polygonal définissant, comme le montre la Fig. 6-37. Les indices et sont inférieurs de un au nombre de sommets du polyèdre dans les directions et , respectivement. Pour les surfaces à quatre côtés, le maillage polygonal définissant doit être topologiquement rectangulaire, c'est-à-dire qu'il doit avoir le même nombre de sommets dans chaque « ligne ».

Encore une fois, comme pour les courbes de Bézier, parce que les fonctions de mélange utilisent une base de Bernstein, de nombreuses propriétés de surface sont connues. Par exemple:

Degré de surface dans chaque direction paramétrique par unité moins de nombre sommets du polyèdre de référence dans cette direction.

Riz. 6-37 Surface de Bézier et sommets du polyèdre caractéristique.

Riz. 6-38 Schéma d'un maillage polygonal de définition pour une surface de Bézier.

Le lissé de la surface dans chaque direction paramétrique est inférieur de deux unités au nombre de sommets du polyèdre définissant dans cette direction. La surface s'affiche dans vue générale la forme du maillage polygonal de définition. Seuls les points d’angle du maillage polygonal définissant et la surface coïncident.

La surface est contenue dans l’enveloppe convexe du maillage polygonal de définition.

La surface ne présente pas de propriétés d'amortissement des changements. Cette propriété est indéfinie et inconnue pour les surfaces à deux variables.

La surface est invariante sous une transformation affine.

Chacune des courbes limites d'une surface de Bézier est une courbe de Bézier. Rappelons-nous ce fait et considérons le maillage polygonal définissant une surface de Bézier bicubique de taille, représenté schématiquement sur la Fig. 6-38. Il est facile de voir que la direction et l’amplitude des vecteurs tangents aux coins de la pièce sont contrôlées par la position des points voisins le long des côtés du maillage. À savoir, les vecteurs tangents dans les directions en un point sont contrôlés respectivement par les sommets du maillage polygonal et . De même, les sommets du maillage du polygone , , et , contrôlent respectivement les vecteurs tangents aux points d'angle. Les quatre sommets internes du maillage polygonal, , , et influencent la direction et l'ampleur des vecteurs de torsion aux coins d'un morceau de surface. Par conséquent, l'utilisateur peut contrôler la forme d'un morceau de surface sans connaître les valeurs spécifiques des vecteurs tangents et de torsion.

En figue. La figure 6-39 montre plusieurs surfaces de Bézier bicubiques et leurs maillages polygonaux définissant. Le maillage du polygone de base est dimensionné et centré autour de l'origine avec des points d'angle situés à , . La composante aux sommets des coins est nulle. Pour tous les autres sommets, cette composante est égale à cinq. Le maillage polygonal de base et sa surface de Bézier correspondante sont représentés sur la Fig. 6-39a. En figue. Le point 6-39 est le sommet du coin gauche et le sommet du coin droit. Notez que les sommets centraux du maillage polygonal de base forment une croix plate (représentée en ombré). Par conséquent, le centre de la surface résultante est peu courbé, bien que non plat.

En figue. La figure 6-39b illustre l'effet du doublement de l'amplitude du vecteur tangent en un point dans les deux directions paramétriques et du déplacement des points et . Le vecteur torsion ne change pas. Notons une augmentation de la courbure des courbes limites correspondant aux valeurs des paramètres et , et une modification correspondante de l'intérieur de la surface.

En figue. La figure 6-39c montre l'effet du changement de direction des vecteurs tangents en un point dans les deux directions paramétriques et du déplacement des points et . Notons le changement du signe de courbure de la courbe frontière à proximité du point et de la forme de la partie interne de la surface par rapport à la surface de base.

En figue. La figure 6-39d illustre le résultat du doublement de l'amplitude du vecteur de torsion en un point sans changer sa direction. Dans ce cas, seul le point est déplacé. L’effet de ce changement est subtil, mais néanmoins important pour le design. Une comparaison minutieuse avec la surface de base de la Fig. 6-39a montre que lignes paramétriques près du point où ils ont une plus grande courbure. Cet effet s'étend approximativement jusqu'au centre de la surface.

Sous forme matricielle, le produit cartésien de la surface de Bézier est donné par l'expression

,

,

,

et les matrices sont données par l'équation (5-70) ou (5-71).

Riz. 6-39 Surfaces de Bézier bicubiques. (a) Surface principale ; (b) l'effet de la modification de l'amplitude des deux vecteurs tangents dans ; (c) l'effet du changement de direction du vecteur tangent dans ; (d) l'effet de la modification de l'amplitude du vecteur de torsion dans .

Pour le cas particulier d'une surface de Bézier bicubique de taille, l'équation (6-59) se réduit à

. (6-60)

Il n’est pas nécessaire que la surface de Bézier soit carrée. Pour une taille de grille, l'équation (6-59) devient

. (6-61)

Une surface de Bézier de taille est constituée de courbes polynomiales du quatrième degré dans la direction paramétrique et de courbes polynomiales quadratiques dans la direction. Un exemple d'une telle surface de Bézier est montré sur la Fig. 6-40. DANS dans ce cas, comme le montre la fig. 6-40b, le changement du sommet central d'un côté d'un maillage à cinq sommets n'affecte pas les vecteurs tangents aux points de coin.

Riz. 6-40 Surface de Bézier. (a) Surface principale ; (b) l'effet du changement du sommet central d'une polyligne limite à cinq sommets.

Les surfaces dérivées de Bézier sont obtenues en différenciant formellement l'équation (6-58) ou (6-59). Si nous utilisons l'équation (6-58), alors les première et deuxième dérivées paramétriques seront

, (6-62)

, (6-63)

, (6-64)

, (6-65)

, (6-66)

où le premier désigne la différenciation par rapport à une variable paramétrique. Les dérivées des fonctions de base de Bernstein , , et sont données dans les équations (5-74) et (5-75).

Il est facile de trouver la relation entre les surfaces bicubiques de Bézier et de Koons. En égalisant les équations (6-52) et (6-59), nous obtenons

où est donné par l'équation (5-76) et - par l'équation (5-70). Par conséquent, la matrice géométrique de la surface bicubique de Koons est définie en termes de maillage polygonal de la surface de Bézier comme suit

. (6-67)

L'examen de la sous-matrice de taille inférieure droite dans l'équation (6-67) confirme que les quatre sommets centraux du maillage polygonal de définition influencent la torsion aux points d'angle d'un morceau d'une surface de Bézier bicubique. Cependant, la torsion aux points de coin est contrôlée non seulement par les sommets centraux, mais également par les vecteurs tangents adjacents. En effet, la torsion en un point de coin est contrôlée par la forme du quadrilatère non plan formé par le point de coin, deux points limites adjacents et le point central adjacent.

D'après les équations (6-62)-(6-64), il s'ensuit que

. (6-68)

De même, la relation inverse entre les matrices et , exprimant les sommets d'un maillage polygonal de Bézier en fonction des paramètres de la surface bicubique de Koons, est égale à

. (6-69)

Le concept de surface de Bézier est illustré plus en détail dans l'exemple suivant.

Exemple 6-14 Surface de Bézier

Pour celui montré sur la Fig. 6-39a Surfaces de Bézier pour les valeurs des paramètres, déterminer les coordonnées d'un point sur la surface et les dérivées premières dans et dans les directions. Trouvez également les coordonnées du point et les dérivées de la surface modifiée illustrée à la Fig. 6-39j. Comparez les résultats. Les sommets du polyèdre surfacique de Bézier sont :. Nouvelle signification du produit : et sont toujours orthogonaux, mais leurs grandeurs et leurs directions sont différentes. Ces résultats montrent que le vecteur de torsion à un coin a un effet subtil mais significatif sur la forme de la surface entière.

La discussion ci-dessus sur les surfaces de Bézier portait sur la définition et les caractéristiques d'une seule pièce de surface. Afin d'obtenir des surfaces plus complexes, vous devez combiner plusieurs morceaux d'une surface de Bézier. Une discussion détaillée de cette question dépasse le cadre de ce livre. Nous renvoyons le lecteur intéressé à et. Les problèmes qui surviennent lors de la combinaison de morceaux d'une surface de Bézier tout en garantissant la douceur le long des côtés en contact sont illustrés sur la Fig. 6-41 en utilisant l'exemple de la combinaison de deux morceaux d'une surface de Bézier bicubique le long d'un côté.

Pour assurer la continuité ou le lissé le long de la frontière, il est nécessaire que deux courbes frontières coïncident, et donc deux lignes brisées frontières le long du bord de la surface. Pour garantir la continuité de la pente ou des vecteurs tangents ou la douceur le long de la limite d'une pièce, la direction de la normale à la surface le long de la courbe limite doit être la même pour les deux pièces. Pour ce faire, vous pouvez utiliser deux conditions. La première nécessite que les quatre segments de maillage polygonal qui se rencontrent et se coupent à la frontière soient colinéaires, comme le montrent les lignes mises en évidence sur la figure. 6-41a. La deuxième condition, moins stricte, exige que seules trois arêtes du maillage polygonal qui se rencontrent aux extrémités de la courbe limite soient coplanaires, comme le montrent les lignes mises en évidence sur la figure. 6-41b.

Une implémentation simple et claire des fameuses courbes de Bézier en C#.

Introduction

Les courbes de Bézier sont les courbes les plus fondamentales, utilisées principalement dans infographie et le traitement d'images. Ces courbes sont principalement utilisées dans l'interpolation, l'approximation, le dessin de courbes et le dessin d'objets. Cet article montre de manière très simple et claire comment construire et utiliser ces courbes.

Information brève

Les courbes de Bézier sont des courbes paramétriques hautement personnalisables et fluides qui fonctionnent bien pour de nombreuses tâches. Ils portent le nom de Pierre Bézier, mathématicien français et l'ingénieur qui a développé cette méthode dessin sur ordinateur fin 1960 alors qu'il travaillait pour le constructeur automobile Renault. On dit qu'au même moment, le même développement s'est produit au cours des recherches de Ford. On ne sait toujours pas qui les a créés en premier.

L'article se concentre principalement sur l'interpolation et le dessin de courbes. Lors de l'interpolation, vous devez trouver des courants inconnus en utilisant valeurs connues. Un ensemble de points discrets peut être représenté comme une structure continue, résultant en une courbe strictement définie pour les points manquants. La courbe est initialisée avec certains points de base et tente de générer de nouveaux points qui se rapprochent (ou interpolent) des anciennes valeurs.

Algorithme de construction d'une courbe de Bézier

Considérons n +1 points P 0 ,…,P n et connectons les points en ligne brisée, ci-après appelée zone de contrôle.

Étant donné les points P i, i = 0,...,n, notre tâche est de déterminer la courbe g (t) pour toutes les valeurs de t ? . L’idée est présentée ci-dessous :

À PROPOS algorithme principal

Ici, le but est de trouver les points situés au milieu entre deux points adjacents et de répéter cette opération jusqu'à épuisement de toutes les répétitions. Les nouvelles valeurs de points produiront une courbe. Équation célèbre Bézier est la formulation exacte de cette idée. Voici l'algorithme :

Étape 1 : Sélectionnez la valeur t ? . Cette valeur ne change pas dans toutes les autres étapes.

Étape 2 : Définir P i (t) = P i, pour i = 0,...,n.

Étape 3 : Pour j = 0,...,n, définissez i = j,...,n.

Étape 4 : g(t) = Pn(t)

Privé et cas généraux

Des formules pour les cas généraux et particuliers, utiles dans certaines applications, seront données ici. Le code de l'article ne montre aucun de ces éléments, mais il utilise une formule généralisée. Commençons par la formule générale :

Pour des raisons de simplicité et de convention utilisée dans cet article et ce code, il est préférable de représenter cette formule comme ceci :

Cette équation n'est qu'une formulation de l'algorithme ci-dessus (itération médiane). Il est important que l’ensemble de l’algorithme puisse être réduit à une formule et que sa mise en œuvre directe puisse donner des résultats corrects. Ici, n désigne le nombre de points et P désigne les points eux-mêmes. Les coefficients factoriels des points sont appelés fonctions de base de Bernstein, du nom de leur créateur.

Voici des cas particuliers :

Bézier linéaire :

Bézier quadratique :

Bézier troisième degré :

Explication et utilisation du code

C'est la fonction qui fait tout le travail. C'est très court et très simple. Comme nous n’avons affaire qu’à des courbes 2D, les points n’ont que des coordonnées X et Y. La fonction calcule les points de Bézier.

Public void Bezier2D(double b, int cpts, double p)
{
int npts = (b.Longueur) / 2 ;
int jecompte, jcompte;
double pas, t;

// Calculer les points sur la courbe

Icompte = 0 ;
t = 0 ;
étape = (double)1,0 / (cpts - 1) ;

Pour (int i1 = 0; i1 != cpts; i1++)
{
si ((1,0 - t)< 5e-6)
t = 1,0 ;

Jcompte = 0 ;
p = 0,0 ;
p = 0,0 ;
pour (int i = 0; i != npts; i++)
{
base double = Bernstein (npts - 1, je, t);
p += base * b ;
p += base * b ;
jcompte = jcompte +2;
}

Je compte += 2 ;
t += étape ;
}
}

Les fonctions restantes ne sont que des fonctions auxiliaires impliquées dans les calculs factoriels et les calculs de fonctions de base, qui sont assez triviaux . Pour utiliser correctement cette fonction, transmettez-lui un ensemble de points au format : XYXYXYXYXYXYXYXYXYXY.... coordonnées, et le nombre de points que vous devez calculer sur la courbe. La fonction remplira le tableau p de points de trajectoire.

En raison des limitations des calculs factoriels, le code ne calcule que des courbes jusqu'à 32 points. Les conceptions plus complexes sont généralement représentées à l'aide d'une combinaison de données de courbe (comme dans l'outil de tracé d'Adobe Photoshop, Illustrator et Flash).

Bien que GDI (Graphics Device Interface) dispose d'une fonction intégrée de calcul de courbe de Bézier, il n'est pas conseillé d'utiliser les bibliothèques intégrées pour la formation. GDI ne fera pas toujours le travail à votre place ! Quelque part, un jour, vous devrez peut-être le mettre en œuvre, et vous devriez alors avoir une idée approximative du fonctionnement de ces courbes.

Nous savons tous ce qu'est une courbe. Voici quelques exemples.

Les courbes de Bézier sont très simples à utiliser et peuvent décrire de nombreuses formes. Les courbes de Bézier sont largement utilisées pour représenter des caractères dans des polices et des formes de dessins. Véhicule. Les courbes de Bézier sont également utilisées dans les éditeurs de graphiques vectoriels pour représenter diverses courbes et dans les outils d'animation 3D pour représenter des courbes d'animation.

Dans les jeux, les courbes de Bézier sont parfois utiles pour décrire un chemin : un parcours de course sur une piste dans un jeu de course, ou des lignes dans des jeux de dessin au trait comme Contrôle de vol, ou la trajectoire en boucle d'un papillon qui s'envole, qui vit dans le monde du RPG.

Les courbes de Bézier sont si populaires parce qu'elles descriptions mathématiques très compact, intuitif et élégant. Ils sont faciles à calculer, faciles à utiliser dans plus dimensions élevées(3D et supérieur), et peuvent être connectés ensemble pour représenter n'importe quelle forme que vous pouvez imaginer.

Dans ce tutoriel, je vais vous donner les instructions dont vous avez besoin pour implémenter les algorithmes afin que vous puissiez utiliser les courbes de Bézier dans vos jeux.

Description mathématique

Commençons par les mathématiques. Mathématiquement, on peut décrire une courbe de Bézier par fonction. La fonction prend un paramètre. La valeur de la fonction est un point sur la courbe ; cela dépend du paramètre , et d'un ensemble de points appelés points de contrôle. Les premier et dernier points de contrôle sont les extrémités de la courbe. Généralement, la courbe ne passe pas par d’autres points de contrôle.

La valeur peut aller de 0 à 1. Une valeur de 0 correspond à point de départ courbe, la valeur 1 correspond au point final de la courbe. Les valeurs intermédiaires correspondent aux points restants de la courbe.

Voici un exemple du type le plus simple de courbe de Bézier, un segment :

Voici une notation abrégée pour les deux équations qui donnent des coordonnées distinctes :

Les points sont des points de contrôle. Quand , partie droite l'équation est égale au premier point de contrôle - le début du segment. Lorsque , nous obtenons le point , le deuxième point de contrôle est la fin du segment.

Pour des formes plus intéressantes, nous avons besoin de plus de points de contrôle. Le nombre de points de contrôle détermine degré courbé. Deux points de contrôle sont nécessaires pour les courbes linéaires (premier degré) telles que le segment de droite ci-dessus. Pour le deuxième degré, ou quadratique courbes, nous avons besoin de trois points de contrôle.

Voici la formule :

Courbes cubiques(ou courbes du troisième degré) sont les plus couramment utilisées, c'est pourquoi nous discuterons dans ce guide courbes cubiques. Leur construction nécessite quatre points de contrôle, et vous êtes peut-être déjà très familier avec leur utilisation dans les logiciels de graphiques vectoriels (oui, les mêmes cercles qui sont utilisés pour modifier la forme des courbes dans Freehand ou Inkscape sont nos points de contrôle).

Les lignes jaunes s'étendent dans la même direction que les tangentes aux extrémités de la courbe. Plus ces segments jaunes sont éloignés, plus la courbe est « étirée » dans le sens des tangentes.

Formule pour les courbes de Bézier cubiques :

Il est peu probable que vous ayez besoin de degrés de courbe plus élevés. Si c'est le cas, alors la formule est simple, mais nécessite quelques connaissances coefficients binomiaux. Vous pouvez trouver des détails dans l’une des sources à la fin de l’article.

Cas

En géométrie il y aura toujours plus de problèmes que vous ne le pensez au premier abord, ce qui peut conduire à une longue recherche d’erreurs.

Voici les courbes de Bézier 2D correctes :

Tous points de terminaisonà même distance les uns des autres. 1. Une courbe sans courbure, sans pli ni boucle. 2. Une courbe avec une inflexion, sans plis ni boucles. 3. Courbe avec un pli. 4. Courbe avec boucle. 5. Ligne droite. (Au point d'inflexion, la courbe change de direction de pliage)

Cas dégénéré 5 est le plus difficile. Les options suivantes peuvent être disponibles :

  • pas de chevauchement
  • la courbe se brise deux fois à une ou aux deux extrémités
  • la courbe se plie trois fois trois quelque part entre les extrémités

Il existe un sixième cas où les quatre points de contrôle coïncident : en conséquence, la courbe dégénère en un seul point. Notez que la courbe ne dégénère pas en un point lorsque seuls les points finaux correspondent - les quatre points de contrôle doivent correspondre. Ceux qui sont intéressés par les détails techniques peuvent lire Une caractérisation géométrique des courbes cubiques paramétriques (PDF de 1,6 Mo) par Stone et De Rose. L'article Points d'inflexion d'un Bézier cubique explique comment calculer les points d'inflexion et fournit également des applets Java interactives pour une illustration visuelle.

En 3D, les boucles et les fractures offrent moins de problèmes, puisqu'ils n'apparaissent que dans le cas où tous les points se trouvent dans le même plan. En 3D, vous pouvez toujours changer la direction de la ligne (surtout pour les cas comme 2, 4 et 5).

Lors de la mise en œuvre d'algorithmes de courbe de Bézier, réfléchissez bien à l'opportunité d'appliquer ce type de courbe à un cas spécifique et vérifiez toujours que l'algorithme fonctionne correctement. Soyez particulièrement prudent avec les points de contrôle - s'ils coïncident, une situation de normalisation peut survenir vecteur zéro, ce qui peut entraîner un crash du programme.

Mise en œuvre

La formule mathématique est facile à traduire en code. Vous trouverez ci-dessous une implémentation de l'algorithme, dans laquelle une certaine optimisation a déjà été réalisée en sauvegardant et réutilisation résultats intermédiaires.

Le code est en C#, mais sa traduction en Java, C++ et la plupart des autres langages ne devrait pas poser de problème.

(Les fonctions suivantes fonctionneront également en 2D si Vector3 est remplacé par Vector2.)

Vector3 CalculerBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) ( float u = 1 – t; float tt = t* t; float uu = u* u; float uuu = uu * u; float ttt = tt * t; Vecteur3 p = uuu * p0; //premier terme p += 3 * uu * t * p1; //deuxième terme p += 3 * u * tt * p2;

Dessiner des courbes de Bézier

Maintenant que nous avons un moyen de calculer un point sur une courbe de Bézier, nous avons besoin d’un moyen de tracer la courbe.

Pour les images, l’approche la plus simple consiste à utiliser l’itération pour calculer les points requis :

pour (int je = 0 ; je<= SEGMENT_COUNT; ++ i) { t = i / (float ) SEGMENT_COUNT; Vector3 pixel = CalculateBezierPoint(t, p0, p1, p2, p3) ; DrawPixel(pixel) ; //supposons que cette fonction puisse gérer Vector3 }

Cette approche souffre des problèmes suivants :

Des algorithmes plus avancés utilisent le gain adaptatif pour surmonter ces problèmes. L'anticrénelage de la courbe donnera un résultat généralement excellent, rendant la courbe très lisse et claire. Une bonne source pour dessiner des courbes (et de nombreux autres sujets utiles) est Computer Graphics and Computer Modeling de David Salomon.

Une alternative plus simple consiste à tracer des lignes plutôt que des pixels. Cette méthode est également plus adaptée au dessin de courbes à l’aide de matériel graphique.

q0 = CalculerBezierPoint(0 , p0, p1, p2, p3) ;<= SEGMENT_COUNT; ++ i) { t = 1 / (float ) SEGMENT_COUNT; q1 = CalculateBezierPoint(t, p0, p1, p2, p3) ; DrawLine(q0, q1) ; q0 = q1; }

pour (int je = 1 ; je

Puisque nous n'avons plus à nous soucier des pixels manquants, nous pouvons choisir un incrément plus grand et réduire la charge de rendu. Mais il reste difficile de bien sélectionner l’incrément.

Il existe un autre algorithme qui utilise des partitions récursives. Il produit généralement moins de points de rendu pour le même niveau de précision que l'algorithme précédent. Cependant, il ne gère pas correctement toutes les courbes présentant des plis ou des boucles et ne doit pas être utilisé si de tels cas sont susceptibles de se produire.

Voici l'algorithme :

1. La figure ci-dessous montre un exemple fonctionnel. Commençons par deux points finaux et un point entre eux. On vérifie l'angle formé entre deux segments. 2. C'est suffisamment petit pour que nous ajoutions un point de rendu entre eux.Ensuite, nous faisons la même chose pour le côté gauche de la courbe. 3. Dans ce cas, l'angle est suffisamment grand pour que nous n'ajoutions pas de point et ne le divisons pas davantage. On fait la même chose pour le côté droit de la courbe. 4. Dans ce cas, l’angle est suffisamment petit, on ajoute donc de nouveaux points pour dessiner et développer le segment. 5. ET Nous faisons la même chose pour les deux moitiés de l’étape précédente. 6. L'ensemble final de points est utilisé pour tracer la courbe.

Vous trouverez ci-dessous le code de l'algorithme récursif. L'astuce consiste à insérer les points au bon endroit dans la liste afin qu'ils restent dans le bon ordre pour le dessin. Nous vérifions le produit scalaire des segments normalisés, au lieu de vérifier directement l'angle. C'est pourquoi > est utilisé à des fins de comparaison au lieu de< как если бы мы проверяли углы напрямую.

//renvoie le nombre de points ajoutés. int FindDrawingPoints(float t0, float t1, int insertionIndex, List pointList) ( tMid = (t0 + t1) / 2 ; p0 = bezierCurve(t0) ; p1 = bezierCurve(t1) ; if (p0 – p1. sqrMagnitude< MINIMUM_SQR_DISTANCE) { return 0 ; } pMid = bezierCurve(tMid) ; leftDirection = (p0 – pMid) . Normalised ; rightDirection = (p1 – mMid) . Normalised ; if (Dot(leftDirection, rightDirection) >seuil) ( int pointsAddedCount = 0 ; pointsAdded += FindDrawingPoints(t0, tMid, insertionIndex, pointList) pointList. insert (insertionIndex + pointsAdded, pMid) ; pointsAdded++; pointsAdded += FindDrawingPoints(tMid, t1, insertionIndex + pointsAdded, pointList) ; points de retour ajoutés) return 0 ;

)

La fonction suivante illustre un appel de fonction récursif :

void FindPoints() ( List pointList = new List() ; p0 = bezierCurve(0 ) ; p1 = bezierCurve(1 ) ; pointList. Add (p0) ; pointList. Add (p1) ; int pointsAdded = FindPoints(0, 1, 1 , pointList) ; assert(pointsAdded + 2 == pointsList. Count ) //contrôle de cohérence ) ;

  • Quelques remarques :
  • Le contrôle de la distance minimale est nécessaire pour éviter les problèmes de normalisation des vecteurs très courts. Cela évite également des calculs inutiles.
  • La valeur seuil est étonnamment proche de -1. Un bon point de départ est -0,99.

L'algorithme ne fonctionne pas très bien pour les courbes contenant des plis ou des boucles. Vous trouverez ci-dessous un exemple de ce qui peut arriver si vous l'appliquez à une courbe avec un virage. Un exemple dans lequel l'algorithme donnera un mauvais résultat. Dans ce cas, l’angle dépasse le seuil acceptable, donc aucune division ne se produira.

Le résultat n'est pas très similaire à la courbe souhaitée.

Coller des courbes ensemble : les chemins de Bézier

  • Lorsque nous voulons tracer une courbe complexe, nous avons deux options :
  • utiliser une courbe de Bézier avec un degré élevé ;

divisez la courbe en segments plus petits et utilisez des courbes de Bézier de faible degré pour chaque segment. Le dernier type de courbe est appeléfaçons Bézier. Les chemins de Bézier sont généralement plus faciles et plus efficaces à utiliser que les courbes haut degré

L’implémentation présentée ici n’est qu’une parmi tant d’autres possibles. Nous allons définir une classe qui crée une liste de points de contrôle de courbe de Bézier qui constituent un chemin de Bézier. Étant donné que les segments sont connectés bout à bout, les points de début et de fin des courbes adjacentes sont les mêmes, ce qui permet d'éviter les points en double. La figure montre un exemple de chemin de Bézier composé de quatre courbes de Bézier. Dans ce cas, la liste contient 13 points, comme le montre la figure de gauche.

Si nous décidons de construire une courbe avec des segments, alors bonne décision mettra en cache les extrémités des segments et les mettra à jour à mesure que la courbe change. Algorithme suivant calcule tous les points de dessin (points finaux des segments).

class BezierPath ( Liste des points de contrôle ; Vector3 CalculateBezierPoint (float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3) ( ... ) List GetDrawingPoints() ( List drawPoints = new List() ; for (int i = 0 ; i< controlPoints. Count - 3 ; i+= 3 ) { Vector3 p0 = controlPoints[ i] ; Vector3 p1 = controlPoints[ i + 1 ] ; Vector3 p2 = controlPoints[ i + 2 ] ; Vector3 p3 = controlPoints[ i + 3 ] ; if (i == 0 ) //Fais seulement ça pour le premier point final. //Quand i != 0, cela coïncide avec la fin //point du segment précédent( drawPoints. Add (CalculateBezierPoint(0 , p0, p1, p2, p3) ) ; ) pour (int j = 1 ; j<= SEGMENTS_PER_CURVE; j++ ) { float t = j / (float ) SEGMENTS_PER_CURVE; drawingPoints. Add (CalculateBezierPoint(t, p0, p1, p2, p3) ) ; } } return drawingPoints; } }

Cet algorithme récursif s'adapte facilement pour obtenir des points intermédiaires. Vous pouvez trouver un exemple dans le code joint à l'article.

Lors de la mise en œuvre des chemins de Bézier, vous pouvez vous simplifier la vie en procédant comme suit :

  • Activez les modes de débogage pour dessiner des points de contrôle, des points finaux de Bézier, des points de dessin et des tangentes.
  • Affichez le nombre de points de dessin et de points de contrôle : grâce à cela, vous pouvez toujours vérifier combien de points génère l'algorithme et la justesse de ce nombre.

Et enfin, les courbes de Bézier sont très cool, mais vous ne devriez pas les utiliser partout, surtout pour représenter des lignes courtes, presque droites.

  • La plupart des moteurs 3D nécessitent que vous utilisiez des lignes courtes et droites pour restituer les courbes. Vous devez donc être clair sur l'intérêt de la mise en œuvre du rendu des courbes de Bézier.
  • Lorsque le mouvement est contrôlé par la physique, les changements brusques de vitesse et de direction sont pratiquement inexistants. Les objets se déplacent généralement en modifiant la force agissant sur l’objet et, de ce fait, leur vitesse ne peut pas changer instantanément. De cette façon, tout mouvement est automatiquement lissé : tout objet suivant des lignes droites connectées suivra automatiquement le chemin lissé - il n'y a pas besoin de courbes de Bézier.

Télécharger

  • Courbes de Bézier (64 Ko, projet Unity 3D, zippé)
  • BezierPath.cs (fichier de code source C#)

L'article est une traduction, lien source - Courbes de Bézier pour vos jeux : un didacticiel.
Si vous constatez des inexactitudes dans la traduction, veuillez le signaler par courrier à l'adresse indiquée en bas de page.

courbe B rayon-vecteur

    Nous réparons t. Supposons alors qu'il n'en existe qu'un seul tel que

    Pour l'indice défini ci-dessus, si l'on calcule la seule valeur non nulle de la B-spline non normalisée du premier niveau (m=1) :

    Rappelez-vous ce qui a été choisi lors de la première étape, pour que De plus, en raison de la condition, du dénominateur et en raison de la condition nous avons Ainsi, pour un index situé en dehors de l’ensemble, la valeur n’est pas calculée.

    En utilisant les relations de Cox-de Boer, nous calculons toutes les splines non nulles non nulles du ème ordre à :


    En particulier,

    (6.6)

    où en mettant (6.6) on obtient

    Lemme 6.5. Il y a une relation:

  1. Nous calculons des splines normalisées pour chaque selon la formule (en même temps).

  2. On calcule finalement en utilisant la formule

Algorithme de De Boer pour calculer le rayon vecteur d'une courbe B

Théorème 6.4. Vecteur rayon r(t) de la courbe B :

peut être calculé à l’aide de l’algorithme suivant :

Cet algorithme est illustré par le schéma suivant ( ):

Surfaces définies par des matrices de points de contrôle et de poids

Surfaces Bézier

Définition 6.2.1. Soit (m +1) * (n+1) points dans l'espace formant une matrice rectangulaire (grille de Bézier) :

Ordre de surface de Bézier m * n , le maillage correspondant est appelé une surface

(6.7)

où E est l'opérateur de décalage vers l'avant au premier index, F est l'opérateur de décalage vers l'avant au deuxième index :

Les opérateurs E et F font évidemment la navette entre eux : donc, c'est-à-dire que la formule (6.7) est cohérente.

Définition 6.2.2. Une surface de Bézier rationnelle construite à partir de points avec des poids est définie comme suit :

(6.8)

La formule (6.8) signifie que l'on construit une surface de Bézier point par point puis on applique la transformation

Problème 6.2.1. Étudiez visuellement l'influence des points de contrôle et de leurs poids sur la surface rationnelle de Bézier en modifiant les données initiales pts (points de contrôle) et (leurs poids) dans le programme suivant. La matrice de poids contient des vecteurs bidimensionnels, mais seule leur première composante est utilisée. Le deuxième composant est fixe. Cela est dû à l'incapacité de Mathematica à appliquer la fonction Bezier aux matrices constituées de scalaires.

Exemple 6.2.1. Surface de Bézier rationnelle avec la possibilité de contrôler directement les poids à l'aide de curseurs.

Dans : = DynamicModule [ (pts, a, w0, pw, w, g, f, w6, w7, wl0, wll, i, j, out, ins, u, v, n, pts0), pts = ((( 0, 0, 0), (0, 1, 0), (0, 2, 0), (0, 3, 0)), ((1, 0, 0), (1, 1, 1), ( 1, 2, 1), (1, 3, 0)), ((2, 0, 0), (2, 1, 1), (2, 2, 1), (2, 3, 0)), ((3, 0, 0), (3, 1, 0), (3, 2, 0) , (3, 3, 0))); pts0 = Aplatir ;


n = Longueur ;

Ligne[ (Manipuler ], (i, 1, 4), (j, 1, 4)]; pw = Tableau ] pts [ ], (i, 1, 4) , ( j, 1, 4) ]; g = BezierFunction; f = BezierFunction; Show[(Graphics3D[(PointSize, Rouge, Carte, Vert, Texte, pts0[[#]] + (0.01, 0.04, 0.04)] & /@ Range[n])], Graphics3D[( Gris, Pointillés, Ligne, Ligne])], ParametrioPlot3D / g , (u, 0, 1), (v, 0, 1), PlotStyle -> FaceForm ] )], Column[(Control[((ins, Green, "Couleur intérieure"), Vert)], Contrôle[((sortie, Rouge, "Couleur extérieure"), Rouge)]), Droite], ((w5, 10), 1, 100), ((w6, 10) , 1, 100), ((w9, 10), 1, 100), ((wl0, 10), 1, 100)] MatrixForm ) , " " ], Initialisation : -> (pts = (((0, 0 , 0), (0, 1, 0), (0, 2, 0), (0, 3, 0)), ((1, 0, 0), (1, 1, 1), (1, 2 , 1), (1, 3, 0)), ((2, 0, 0), (2, 1, 1), (2, 2, 1), (2, 3, 0)), ((3 , 0, 0), (3, 1, 0), (3, 2, 0), (3, 3, 0))); pts0 = Aplatir n = Longueur)]

Signification géométrique de la surface de Bézier

Une surface de Bézier peut être obtenue comme suit :

(6.9)

(6.10)

Dans ce cas, l'opérateur de transition correspondant d'un point de référence pris sur la courbe au point de référence suivant pris sur la courbe en termes de nœuds de grille pij est décrit par l'opérateur de décalage F par le deuxième indice. Ainsi, où m et n sont le nombre de pas le long du premier et du deuxième indice, respectivement, à partir du point d'angle de la grille de Bézier, 00 est l'indice de ce point d'angle, à partir duquel nous commençons à former tous les autres nœuds de la grille avec des opérateurs de décalage E et F. Nous avons Ici à travers sont indiqués feuilles de Bézier quadrangulaires, construit à partir des points p ij pris comme

points d'angle

, similaire à la formule (6.9). peut être obtenu en utilisant l’algorithme suivant :

Le point résultant sera un point avec des paramètres sur la surface rationnelle de Bézier, construite en utilisant sans changer sa forme. Avec cette division, on obtient deux surfaces de Bézier (constituant ensemble la surface d'origine) et les deux matrices correspondantes de points de contrôle de Bézier, dont chacune a le même ordre que la matrice d'origine : et Ensuite, chacune des deux surfaces de Bézier résultantes doit être divisé en un point paramétrique (en utilisant la division des courbes de Bézier construites à partir des lignes des matrices correspondantes). En conséquence, vous obtiendrez quatre surfaces de Bézier et les quatre matrices de points de contrôle correspondantes : et Ces quatre surfaces de Bézier reposeront sur la surface de Bézier d'origine, la diviseront en quatre parties et constitueront ensemble la surface d'origine.

Nouveaux réseaux de points de contrôle et sont obtenus à partir du réseau d'origine par les formules suivantes, similaire aux formules (5.26) :




Avez-vous aimé l'article? Partage avec tes amis!