Montrez vos belle courbes !

Dans cet article, nous allons écrire un programme permettant de faire de belles courbes en 3D. Nous allons nous baser sur une fonction mathématique d’une variable que nous allons appliquer à la distance du point par rapport à l’axe Z.

Coordonnées polaires

La courbe que nous traçons à partir d'une fonction d'une variable f:x->f(x) est la surface constituée des points d'ordonnée z = f(r)

En raison de la façon dont la courbe est construite, elle présente évidemment une symétrie centrale. Voici un exemple du résultat:

Courbe

Résultat pour f(x) = 140.e-z2/1280.cos(z/10)

Pour tracer la courbe, nous allons partir du centre et progresser selon l’axe X. Il est possible de profiter de la symétrie centrale pour calculer en même temps les valeurs pour x et -x.

Nous voulons tracer la courbe sur un espace délimité par un cercle de rayon R. Nous allons donc parcourir les valeurs de 0 à Xmax = R et tracer en même temps les valeurs de 0 à -Xmax = -R. Pour une valeur de x donnée, nous allons parcourir les valeurs possible de y en partant de la valeur maximale (points les plus proches de l’observateur) et en allant jusqu’à la valeur minimale. Le point ne sera affiché que si il n’est pas caché, c’est à dire si sa valeur est supérieure à la valeur maximale ou inférieure à la valeur minimale calculées jusque là pour cette valeur de x.

Les valeurs minimales et maximales de y que l’on utilisera sont choisies en fonction de x: on trace la courbe sur un espace délimité par un cercle. On utilise donc les valeurs telles que Ymax(x)2 = R2-x2. Pour x = 0, on trace la courbe en considérant les valeurs de y allant de -R à R. Plus x croit, moins l’intervalle considéré est grand, jusqu’à atteindre x=R où l’on ne considère que la valeur y=0.

Afin de donner un effet 3D, on ajoute à la valeur calculée par la fonction un petit décalage dépendant de y. Pour mieux comprendre, regardons la figure ci-dessous:

Projection d'une scène en 3D sur un ecran

La projection d'une scène en 3D sur une surface plane restitue à des hauteurs différentes des éléments placés à la même hauteur mais à des profondeurs différentes.

Dans cette figure, le triangle de cotés h et d, et celui de côté H et D+d sont similaires, leurs cotés sont donc proportionnels, d’où la formule h/H = d/(D+d). Si d est petit, cette formule peut être approximée par h = d.H/D. L’étalement en hauteur sur la projection est a peu près proportionnel à leur espacement horizontal dans la réalité. On voit bien sur la figure que ça n’est pas vrai lorsque d n’est pas négligeable par rapport à D.

Dans notre programme, nous allons utiliser cette approximation pour donner l’impression que notre courbe est en 3D et observée légèrement de dessus. Cet effet marche bien tant que la courbe n’est pas trop étendue et que l’on se contente d’un léger décalage. En faisant grandir le décalage, on aura l’impression, au début, de tourner autour de la courbe mais rapidement on ne fera plus qu’étaler la courbe de manière inesthétique !

Voici le programme permettant d’afficher ces courbes d’équation

f(r) = A.e-Lr2.cos(F.r).

Comme d’habitude, il y a quelques contrôles avec lesquels jouer:

  • p / m: modifier (dans un sens ou l’autre) le décalage simulant la perspective
  • w / x: réduire / augmenter la valeur de L (diviser / multiplier par 2)
  • a / q: augmenter / réduire la valeur de F
  • i: afficher la valeur des paramètres A, L, F et la perspective
  • c: colorer ou non la courbe
  • Echap pour quitter (seulement après une longue utilisation !)

A vous de trouver les plus belles et de partager vos améliorations ou suggestions dans les commentaires !

Courbe en 3D

Exemple de courbe

Courbe 3D

Autre exemple de courbe

Tore

Pour produire un tore, il faut modifier l'élimination des faces cachées afin de tenir compte du trou central. La méthode des lignes de crêtes n'est plus suffisante.

Cette entrée a été publiée dans Imagerie numérique. Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

− two = seven