En premier, je pourrais vous montrer le nouvel outil “AttractorPen” :

Le jeu des particules m’ouvre des portes insoupçonnées pour la création. Je reste toujours stupéfait combien le tout est performant si on regarde la quantité de calculs qui sont effectués à chaque moindre mouvement de souris.

Depuis la version 0.0.9.0 , j’ai travaillé sur 21 éléments de l’application (on peut voir le détail en consultant l’historique sur GitHub).

Ça fait maintenant un peu plus d’un an que je travaille sur ce projet — pas à temps plein évidemment — et il reste encore tellement à faire simplement pour réinsérer les fonctionnalités qui existaient avec l’ancienne interface WinForms. Le code ne se ressemble plus vraiment ; plus clair quoiqu’il reste beaucoup à faire pour le rendre réellement lisible et facile à suivre. C’est presque un détail en comparaison avec les fonctionnalités que je voudrais ajouter comme par exemple un historique qui permettrait d’effacer les plus récents tracés, une meilleure présentation de la planche à dessin, la possibilité de créer de nouveaux fichiers de n’importe quelle taille, etc. Pour plusieurs de ces tâches je n’ai pas encore d’idée comment implanter la fonctionnalité dans le code : ça viendra bien.

À tout le moins on peut sauvegarder les images et les retravailler dans d’autres programmes.

Si vous essayez l’application, vous verrez aussi que vous pouvez dessiner avec le “Grainy Pen” au sujet duquel j’avais posté une vidéo ici. C’est un outil qui utilise aussi les particules.

Particules

Mon code des particules est largement inspiré de https://natureofcode.com/ de Daniel Shiffman et sa chaîne YouTube bien remplie The Coding Train. Je devrais étudier un peu plus à fond la relation entre position, vélocité et accélération. Mon code diffère à cet égard. La première série de particules codées contenait un bogue qui n’enlevait rien au visuel du résultat (Grainy Pen) mais ça ne fonctionnait pas pour les particules qui réagissaient à une force d’attraction. J’ai donc deux séries de classes de particules que je vais tenter de fusionner en une seule en m’assurant que Grainy Pen et Attractor Pen vont continuer de fonctionner correctement.

Dans le monde réel, la force gravitationnelle dont on connaît bien les effets, ne s’applique pas exactement comme telle dans un univers de pixels, de particules sans masse, donc qui ne se heurtent pas les unes aux autres (il existe des librairies de physique des particules qui simulent toutes ces caractéristiques et bien d’autres mais je n’en suis pas encore là). Lorsque la particule est très près de son attracteur, sa vélocité est telle qu’elle part en trombe et disparaît de la zone de dessin. Pour conserver un effet d’attraction sans excès, j’ai limité la force d’attraction de sorte que rendue à une distance minimale, la force n’augmente plus. Mes essais m’indiquent qu’elle devrait même diminuer et qu’elle devrait diminuer aussi la vélocité pour que l’ensemble des particules effectue une danse un peu plus serrée autour de l’attracteur. En même temps, je veux laisser suffisamment de latitude d’exploration. Je me propose de créer différentes versions de formules de calcul des forces et, éventuellement, laisser l’utilisateur choisir celle qu’il préférera.

Trajectoires

À chaque mouvement de la souris, toutes les particules sont recalculées et repositionnées. Si on ne dessine qu’un pixel par particule on obtient rapidement que des nuages de points. Pour un effet visuel plus fluide, pour chaque particule, un tracé est dessiné entre sa position précédent et sa nouvelle position. Ce tracé donne un plus beau résultat (mais c’est évidemment relatif) si la valeur de transparence (alpha) est très faible.

Documentation

Une lacune qui va prendre de l’importance au fur et à mesure que mon projet grandit. Bien conscient que ce n’est pas encore une application très facile à utiliser, je me propose au moins de documenter les paramètres des outils de dessin et d’effet. Je réalise aussi que certaines combinaisons de valeurs de paramètres donnent de meilleurs résultats que d’autres, comme par exemple le nombre de particules et leur étalement (spread) : plus il y a de particules et plus l’étalement doit être élevé pour que l’effet ne soit pas un gros trait sans caractère. Je peux imaginer un système où ces paramètres seraient mutuellement modifiés avec toutefois une option de les modifier individuellement. Un autre truc à mettre sur la liste des choses à faire 🙂

Je vais voir comment dans GitHub je peux ajouter la documentation. Il y a bien un Wiki mais les options de mise en page m’apparaissent limitées.

Sur ce, je retourne au code.

Version disponible

le code source : https://github.com/belisssle/Paintual

l’installable et exécutable sous Windows : https://github.com/belisssle/Paintual/releases/download/0.0.10.1/PaintualSetup.0.0.10.1.zip