Pour fabriquer ma petite animation mathématique de Noël (dont je voudrais d'ailleurs faire une version pour mettre sur YouTube — ajout : voilà, c'est fait), je me suis posé la question suivante, sur laquelle je continue à m'arracher les cheveux, et dont je suis assez stupéfait qu'il ne semble pas exister de solution pratique :
Je veux dessiner, sur un fond neutre (disons, noir, mais peu importe) un certain nombre de disques de couleur, de façon qu'à l'intersection de n de ces disques la couleur soit donnée par la moyenne (ou, en fait, par n'importe quelle fonction raisonnablement symétrique) des couleurs de ces n disques. Le point important est qu'il ne soit pas possible de déterminer dans quel ordre les disques ont été dessinés.
L'idée est de faire ça en Canvas, SVG, ou à la limite en n'importe quoi de commodément programmable (Cairo, ImageMagick, que sais-je encore). L'exemple ci-contre a été calculé par un programme de mon cru (très malcommode et mal foutu).
Ça ressemble à de la transparence, mais je ne vois pas comment obtenir ce résultat (la symétrie entre les objets) avec le modèle de transparence (canal alpha) ni avec les modes de composition des différents outils évoqués. Il y a toujours une notion d'objet au-dessus et d'objet en-dessous, et si je rends l'objet du dessus partiellement transparent, il laissera apparaître le fond, alors que je veux qu'il occulte complètement celui-ci.
À la limite, je me contenterais bien du XOR
comme opération pour les couleurs à l'intersection (ce que je veux
surtout est que l'opération soit symétrique). C'est ce que j'ai
essayé d'utiliser dans ma petite animation de Noël, mais
le XOR utilisé par canvas (au moins chez Firefox et
Chrome) a l'air d'obéir à des règles qui m'échappe
(rouge xor vert = noir ? hein ?).
[Ajout () : on me
souffle que cette
page explique assez bien comment fonctionnent les modes de
composition standards — en l'occurrence de Cairo, mais ce sont presque
un sur-ensemble de ceux de canvas — et notamment ce que fait
le XOR
.]