Quart de cercle à base de courbes de Bézier

La librairie Swing de Java permet de dessiner directement sur un JComponent à l'aide des méthodes de Graphics2D.

Il est même possible d'avoir quelque chose de joliment anti-aliasé ! Seulement, pour ça, il faut dessiner à l'aide de Shapes. Il y a des formes prédéfinies (arcs, ellipses, rectangles droits et arrondis, polygones, …), mais si on veut créer des formes personnalisées, il faut passer par un GeneralPath construit à partir de courbes de Bézier.

Et en construisant une forme personnalisée contenant un quart de cercle, j'ai cherché comment placer les points de façon optimale pour que la courbe s'approche le plus possible d'un quart de cercle. Pour ça, j'ai fait un peu de mathématiques…

Définition d'une courbe de Bézier

Les courbes de Bézier sont des courbes polynomiales paramétriques (définition sur Wikipédia). Plus simplement, il s'agit d'un ensemble de barycentres de points de contrôle.

Les courbes sont l'ensemble des barycentres G tels que, pour t\in\left[0,1\right]

  • deux points :

    \overrightarrow{G}=\overrightarrow{A}\left(1-t\right)+\overrightarrow{B}t

  • trois points :

    \overrightarrow{G}=\overrightarrow{A}\left(1-t\right)^2+2\overrightarrow{B}\left(1-t\right)t+\overrightarrow{C}t^2

  • quatre points :

    \overrightarrow{G}=\overrightarrow{A}\left(1-t\right)^3+3\overrightarrow{B}\left(1-t\right)^2t+3\overrightarrow{C}\left(1-t\right)t^2+\overrightarrow{D}t^3

  • n points :

    \overrightarrow{G}=\sum_{i=0}^n\dbinom{n}{i}t^i\left(1-t\right)^{n-i}\overrightarrow{P_i}

Dans mon cas, je vais utiliser des courbes cubiques (donc de degré trois). J'aurai donc quatre points A, B, C et D.

Approcher un quart de cercle

quart_cercle

Dessin

En chacun de ses points le cercle admet une tangente. La tangente en M est la droite passant par M et perpendiculaire au rayon issu de M. (article "Tagente (géométrie)" sur Wikipédia)

Par conséquent, ma courbe devra être tangente aux droites a et d en A et D respectivement. Une courbe de Bézier définie par quatre points de contrôle A, B, C et D est toujours tangente en A à la droite (AB), et en D à la droite (CD). Par conséquent, (AB) = a et (CD) = d. Je peux donc localiser C sur la droite d, et B sur la droite A.

D'autre part, afin de respecter l'axe de symétrie du quart de cercle (l'axe x-y=0), |AB| = |DC|.

On peut donc définir A comme étant aux coordonnées (R, 0), B en (R, Rk), C en (Rk, R) et D en (0, R), R étant le rayon du quart de cercle (R=2 sur le dessin ci-contre), et k étant tel que l'erreur entre la courbe et le cercle soit minimale ou nulle.

En équations paramétriques, notre courbe de Bézier est définie par :

C:\left\{\begin{array}{l}x=x_A\left(1-t\right)^3+3x_B\left(1-t\right)^2t+3x_C\left(1-t\right)t^2+x_Dt^3\\y=y_A\left(1-t\right)^3+3y_B\left(1-t\right)^2t+3y_C\left(1-t\right)t^2+y_Dt^3\end{array}\right.,t\in\left[0,1\right]

Soit, compte tenu de nos définitions :

C:\left\{\begin{array}{l}x=R\left(1-t\right)^3+3R\left(1-t\right)^2t+3Rk\left(1-t\right)t^2\\y=3Rk\left(1-t\right)^2t+3R\left(1-t\right)t^2+Rt^3\end{array}\right.,t\in\left[0,1\right]

Il ne reste qu'à factoriser tout ça proprement pour isoler les degrés de t :

C:\left\{\begin{array}{l}x=\left(\left(2-3\,k\right)\,t^3+\left(3\,k-3\right)\,t^2+1\right)\,R\\y=\left(\left(3\,k-2\right)\,t^3+\left(3-6\,k\right)\,t^2+3\,k\,t\right)\,R\end{array}\right.,t\in\left[0,1\right]

Calcul de l'erreur

Afin de définir la différence entre la courbe et l'arc de cercle, j'ai choisi de comparer les surfaces définies par le quart de disque d'une part, et par la courbe de Bézier, [OA] et [OD] d'autre part.

La surface du quart de disque est connue :

S_1=\frac\pi4R^2

La surface délimitée par la courbe de Bézier est une intégrale. La surface d'une courbe paramétrique définie par \left\{\begin{array}{l}x=x(t)\\y=y(t)\end{array}\right.,t\in\left[0,1\right] est :

S=-\int_0^1y(t)x^\prime(t)dt

Dans mon cas :

S_2=-R^2\int_0^1\left(\left(3\,k-2\right)\,t^3+\left(3-6\,k\right)\,t^2+3\,k\,t<br />
\right)\left(\left(6-9\,k\right)\,t^2+\left(6\,k-6\right)\,t\right)dt

S_2=-R^2\,\left[-\frac12\left(9\,k^2-12\,k+4\right)\,t^6+\frac35\left(24\,k^2-31\,k+10\right)\,t^5-\frac94\left(7\,k^2-8\,k+2\right)\,t^4+6k\left(k-1\right)\,t^3\right]_0^1

S_2=-\frac1{20}\left(3\,k^2-12\,k-10\right)\,R^2

L'erreur commise est la distance entre S_1 et S_2 :

E=S_1-S_2

Calcul de k

On cherche k tel que E=0 :

\frac\pi4R^2+\frac1{20}\left(3\,k^2-12\,k-10\right)\,R^2=0

\frac3{20}\,k^2-\frac35\,k+\frac{-2+\pi}4=0

\Delta_2=\frac{66-15\pi}{100}>0

k_1=\frac{6+\sqrt{66-15\pi}}{3}\simeq3.448221522195532

k_2=\frac{6-\sqrt{66-15\pi}}{3}\simeq0.5517784778044676

Conclusion

Tracé des courbes de Bézier pour les deux valeurs de k

Tracé des courbes de Bézier pour les deux valeurs de k

La valeur de k qui nous intéresse est k_2 car elle est la seule telle que 0<=k<=1 . Pour se convaincre que les autres valeurs ne conviennent pas, il suffit de tracer les deux courbes de Bézier (voir le schéma ci-contre).

On remarque alors que la courbe étant un quart de cercle est la courbe de Bézier telle que k=\frac{6-\sqrt{66-15\pi}}{3}\simeq0.5517784778044676 .

Pour construire un cercle complet, il suffit de construire les images de ce quart de cercle par symétries.

Laisser une réponse

Vous devez être connecté pour publier un commentaire.