next up previous contents
suivant: Fonctionnalisation de l'interface monter: Premier exemple : le lien précédent: Un dessin fonction de   Table des matières

Une numérisation paramétrée rétrospectivement

Sur une partition, les liens varient peu en épaisseur, mais fortement en longueur. La longueur minimum est la ligature de deux notes, et le maximum théorique est la largeur de la feuille, mais les liens trop longs sont déconseillés car noircissant trop la page. Le lien dessiné à la main a été numérisé afin d'obtenir le programme PostScript correspondant. Les opérateurs classiques d'étirement fournissent malheureusement un dessin où l'attaque et la sortie sont déformées, comme le montre la figure 1.18.

Figure 1.18: allongement uniforme d'un lien

N'étirer que sur la longueur de l'axe produit des cassures pas moins inesthétiques, car les 2 droites joignant les frontières haute et basse, indiquées par des flèches sur la figure 1.19, entre le mouvement principal du ductus et les contre-mouvements qui l'encadrent, ne passent pas par les extrémités de l'axe, et ne sont même pas parallèles entre elles. Un étirement harmonieux doit calculer indépendamment les nouvelles abscisses et ordonnées des points de l'attaque, la sortie, le milieu supérieur ou le milieu inférieur, autrement dit définir 8 formules à partir des 6 points déterminants : les 4 frontières et les 2 extrémités de l'axe.

Figure 1.19: points déterminants d'un lien

Les points constituant l'attaque sont déterminés exclusivement par le point de départ de l'axe intérieur et l'épaisseur demandée E. Pour un lien dont le point de départ de l'axe était en (x22#22,y22#22) lors de la numérisation, et devant être placé en (X22#22,Y22#22) sur la partition, l'ensemble des points (x,y) de son attaque est transformé en l'ensemble des points (A23#23(x),A24#24(y)) où :

A24#24(y) = Y22#22 + (y - y22#22) E
A23#23(x) = X22#22 + (x - x22#22) E

De même, pour un point d'arrivé en (x25#25,y25#25) lors de la numérisation, et devant être placé en (X25#25,Y25#25) sur la partition, l'ensemble des points (x,y) de la sortie devient l'ensemble des points (S23#23(x), S24#24(y)) où :

S24#24(y) = Y25#25 + (y - y25#25) E
S23#23(x) = X25#25 + (x - x25#25) E

La partie intermédiaire s'étire par homothétie. Soit (x26#26,y26#26) les coordonnées, lors de la numérisation, de la frontière entre la partie haute de l'attaque et la suite du dessin; soit (x27#27,y27#27) celles de la sortie, soit (X26#26,Y26#26) et (X27#27,Y27#27) les coordonnées où ces deux points doivent se retrouver sur la partition, l'ensemble des points (x,y) de la partie intermédiaire supérieure est transformé en l'ensemble des points (H23#23(x),H24#24(y)) où :

H24#24(y) = (Y27#27-Y26#26)(y-y26#26)/(y27#27-y26#26) + Y26#26
H23#23(x) = (X27#27-X26#26)(x-x26#26)/(x27#27-x26#26) + X26#26

On définit de même pour la partie inférieure :

B24#24(y) = (Y28#28-Y29#29)(y-y29#29)/(y28#28-y29#29) + Y29#29
B23#23(x) = (X28#28-X29#29)(x-x29#29)/(x28#28-x29#29) + X29#29

Le programme PostScript fourni par le numériseur consiste en une suite d'appels aux opérateurs postfixés de placement de points moveto, tracé de lignes droites lineto et de courbes de Bézier curveto comme :


28.1876 624.649 29.4913 624.736 30.6305 624.736 curveto

Étirer une telle ligne revient à remplacer ces constantes par l'application sur chacune d'elles d'une des 8 fonctions ci-dessus, préalablement traduites en PostScript. Compte tenu de la notation postfixée, cette instruction doit devenir :


28.1876 H23#23 624.649 H24#24 29.4913 H23#23 624.736 H24#24 30.6305 S23#23 624.736 S24#24 curveto

Pour cela, il faut d'abord repérer les 6 points fondamentaux. Les 2 points de départ et d'arrivée sont caractérisés par leur isolement : ce sont les coordonnées de 2 appels à moveto hors tracé. Les 4 points déterminant l'attaque et la sortie constituent des changements de direction, autrement dit un point où la tangente s'annule; ce sont donc les points d'aboutissement de courbes de Bézier dont l'abscisse est la même que celle de leur dernier point de contrôle. Ils sont repérés par l'expression rationnelle :

 \( [0-9\.]*\) [0-9\.]*\1 curveto

En conséquence, le programme fourni par le numériseur est paramétré entièrement automatiquement, en deux passes. Une première passe, écrite en shell, détecte les 6 points fondamentaux en appliquant des expressions rationnelles, et synthétise à partir d'eux un programme awk, qui effectuera la deuxième passe. Sachant que les instructions décrivent successivement la partie haute de l'attaque, la partie intermédiaire haute, la sortie, la partie intermédiaire basse, puis la fin de l'attaque, le programme synthétisé sait laquelle des 8 fonctions insérer en repérant à nouveau les 4 points où la tangente s'annule, et en utilisant la parité de l'indice des arguments pour distinguer les x des y.


next up previous contents
suivant: Fonctionnalisation de l'interface monter: Premier exemple : le lien précédent: Un dessin fonction de   Table des matières
Nabil Bouzaiene 2000-07-12