Sites


openFrameworks

Fonctions usuelles

En mathématiques, le terme «fonction» diffère un peu du sens donné en informatique. Et dans ce chapitre nous allons traiter de la fonction dans son sens mathématique en partant de ce qu'on connait déjà. Nous commençons par expliquer ce qu'est une fonction et enfin, nous expliquerons ce que sont les fonctions usuelles qui ont des applications en trigonométrie (et donc par exemple dans le dessin génératif où la physique dans les jeux vidéo). Nous serons ici davantage dans un espace théorique que dans la pratique d'oF. Néanmoins, la compréhension de ce chapitre n'est pas nécessaire pour poursuivre la suite du manuel bien qu'elle ne soit pas inutile; y revenir plus tard est tout à fait envisageable.

Fonctions et moulinettes

Jusqu'à présent, les fonctions, on sait bien ce que c'est: on n'a fait que ça, utiliser des fonctions. Ici, on a donc compris empiriquement qu'une est fonction, dans le langage des informaticiens, est une espèce de bloc d'instructions utile pour répéter, en quelque sorte, une «ritournelle», une routine. Appeller une fonction, c'est appeller un ensemble de petites tâches, concaténées entre elles. Cela nous évite de répéter inutilement des portions de codes qui sont, substantiellement, similaires. Pour répéter une «ritournelle de code» mais pouvant être assujetis à des différences, on pouvait passer en paramètres des variables, et faire différer à l'intérieur du bloc d'instruction à partir de celles-ci. Tout ceci n'est qu'un rappel bref et dense: on a vu tout ça dans le chapitre «Fonctions».

Cependant, si ce n'est pas exactement la même chose qu'en mathématiques, il y a cependant quelques similarités, notamment si on parle des fonctions typées. Pour rappel, voici une fonction de type flottant:

float ofApp::polynomeQuelconque(float x){
    float resultat = 4 * (x * x) + 2 * x - 3;
    return resultat;
}

Sans trop faire attention aux particularités, on comprend qu'on a une certaine fonction, nommée d'une certaine façon («polynomeQuelconque») qui a un paramètre (un flottant, ici x). Selon le paramètre renseigné, on obtient différents résultats:

cout << polynomeQuelconque(0) << endl; // retourne ...
cout << polynomeQuelconque(-5) << endl; // retourne …
cout << polynomeQuelconque(3) << endl; // retourne …
cout << polynomeQuelconque(2.4) << endl; // retourne …

On a donc une entrée et une sortie. On peut entrer des valeurs via le (ou les) paramètres, et faire retourner («faire sortir», «renvoyer») un résultat qui a été «passé à la moulinette». La fonction joue le rôle de la moulinette. Eh bien en mathématiques, c'est pratiquement pareil, à la différence près qu'on utilise une autre notation (ne prêtons pas d'attention particulière à la forme de la fonction: comprenons juste qu'on fait un calcul et que le résultat de ce calcul dépend d'une valeur renseignée):

Qu'on peut écrire de façon plus propre de cette façon:

Notre fonction s'appelle ƒ, et a, ici, un paramètre x. On a défini notre fonction d'une façon spécifique, c'est donc un exemple, une fonction possible parmi une infinité d'autres. Pour insister sur une similarité — si bien que ce qui va suivre n'est pas d'usage en mathématiques — on pourrait appeller notre fonction autrement que par ƒ par exemple «polynomeQuelconque». (Mais un mathématicien préférera je pense appeller sa fonction ƒ, g, ou par une lettre, pour des raisons pratiques.) On peut dire que ƒ(x) et polynomeQuelconque(float x) jouent le même rôle, d'une certaine façon, ici tel qu'elles ont été définies. Résumons: selon x, notre variable, notre fonction renvoie tel ou tel résultat. C'est-à-dire que pour un certaine valeur x, passant par une certaine fonction ƒ, j'obtiens un certain résultat — résultat que l'on appellera dans le vocabulaire mathématique une image.

Modèles, fonctions

Quel est l'intérêt des fonctions en mathématiques? Premièrement, comme en informatique, on peut tout à fait imaginer pour une raison quelconque, qu'on ait besoin de modéliser quelque chose — un phénomène économique, physique, etc. selon telle ou telle contraite. Ce modèle est abstrait car il ne contient qu'en puissance toutes les possibilités que peuvent épuiser un phénomène a posteriori. Soit dit en passant, un modèle n'est cependant pas toujours infaillible dans le cas des phénomènes particuliers: dans certains cas, beaucoup de choses à prendre en compte (le nombre de variables possibles, par exemple en météorologie ou des les systèmes économiques complexes), et un modèle n'a pas autant de paramètres (d'entrées) que de variable à prendre en compte pour obtenir un résultat parfait. Retenons-ça: une fonction permet de modéliser quelque chose: un mouvement, une forme, etc.

Cependant, dans un espace purement mathématique une fonction peut parfaitement modéliser certaines choses. Des exemples: un cercle, l'ensemble des positions d'un point qui suit le chemin d'un polynôme (c'est-à-dire d'une courbe)… C'est cela qui va nous intéresser: avoir accès aux fonctions qui déjà, permet d'obtenir certaines choses, reproduire certaines formes ou phénomènes de façon efficiente. Si on veut faire bouger un point de façon qu'il suive la trajectoire d'un lemniscate ou d'un cercle, c'est tout à fait possible — et rendu simple — grâce aux fonctions. Nous allons commencer par les fonctions dites «usuelles» et utiles pour l'algorithimque générative.

Espaces de dimension 1

Pour se familiariser avec les fonctions, on va commencer  à «dessiner» des courbes et des droites par le biais de fonctions dans des espaces de dimension 1. Globalement, un espace contient autant de dimensions que de paramètres. Notre premier exemple, avec la fonction nommée «polynomeQuelconque» est une courbe qui «habite» une seule dimension.

Si sa représentation mathématique semble de dimension 2 (une image, ou plutôt: un ensemble d'images), elle appartient bel et bien un espace d'une seule dimension: il ne peut y avoir deux points distincts sur la même abscisse, l'axe x (mais il peut très bien y avoir deux points partageant la même ordonnée, l'axe y comme c'est le cas dans la courbe représentée). Pour être plus clair, on ne peut y dessiner que des droites qui dessinent un chemin qui est suivi implacablement sans aucun retour en arrière possible, sur l'axe des x, l'axe horizontal, que l'on peut se représenter comme «le temps qui passe irrévocablement». Cette courbe (ou plutôt cette image de cette courbe qui est tronquée) n'est rien de moins qu'un ensemble de points «générés» pour l'infinité des valeurs que x peut prendre selon notre fonction ƒ, définie plus haut (pour rappel:). Pourquoi l'infinité? Simplement parce qu'il existe une infinité de valeurs entre — par exemple — 0 et 1. Pareil entre 1 et 2. 0, 1, 2, 3, 4, 5, etc. sont des nombres dits naturels. L'ensemble des valeurs intérmédiaires entre les naturels sont des réels.

Si la fonction que l'on a inventé à la volée pour donner un exemple n'est pas très inspirante, il existe des fonctions plus connues: par exemple la fonction sinus, bien connue des musiciens. On l'écrit communément sin(x).


 

 Cette fonction sinus a également une sœur (elle lui ressemble beaucoup), la fonction cosinus, notée cos(x).

Si il nous ait déjà arrivé de voir ce genre de courbes, on peut se demander: «qu'est-ce qu'elles modélisent»?

Nous l'avons dit, nous sommes en dimension 1 (1D), une dimension où il est difficile d'y représenter des formes géométriques comme le carré ou le cercle (qui sont des formes en «2D»). Mais, pour répondre à cette question, on peut faire un détour, oublier rapidement les espaces en dimension 1 et aller vers n+1: on va se demander «comment ferait-on pour modéliser un cercle qui habite des espaces en 2D»? Et bien on va avoir recourt aux espaces de dimension 1! On va décomposer une forme de dimension 2 en deux fonctions de dimension 1.

Les mouches de Descartes

L'idée est excellente et elle nous vient de Descartes qui aurait eu l'idée en regardant une mouche se cogner sur des carreaux d'une fenêtre. Une forme peut être littéralement dessinée: on peut la représenter comme l'ensemble des traces produites par un point qui se déplace dans l'espace un temps donné. Cet espace est de dimension 2: alors je vais me concentrer d'abord sur une seule dimension: par exemple l'ensemble des positions prises par le point par rapport à une abscisse; ensuite la même chose par rapport à l'ordonnée.

On va faire ça pour le cercle. Commençons par l'ordonnée: au temps 0, on va dire que mon point est à 1. Ensuite au temps suivant, il est à 0.99999999, ensuite, il est à 0.99999998, etc.

 

 

 

 

/sin(), cos(), tan(), lerp(). partie entière inf, partie entière sup. etc

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.