Une solution peut être d'analyser très profondément l'automate et ses transitions pour définir des « noyaux », c'est-à-dire rassembler les états possédant beaucoup de transitions entre eux. On peut alors s'occuper de ses « noyaux » constitués de 2 ou 3 états, les traiter de façon très poussée pour minimiser les croisements. Il suffit ensuite de les relier avec les transitions qu'ils possèdent en commun.
range
calcule
la liste [1;...;n]
et la fonction copains
la liste des états
possédant au moins deux transitions avec t
.
Ensuite, pour chaque classe, les transitions sont définies en faisant varier
un angle et la longueur de la tangente à la courbe de BEZIER (cf. FIGURE 3.3).
La variation de l'angle est choisie pour augmenter plus rapidement au début
qu'à la fin et ainsi tendre lentement vers . Quand ces transitions ont été définies, il suffit
de définir celles existant entre les classes.
Le résultat de la fonction sera le même que celui de la fonction de dessin d'automate, c'est-à-dire la liste des états, des transitions, des transitions instantanées, des états initiaux et des états finaux. Ceci peut permettre de pouvoir modifier ces données justement grâce à cette fonction de dessin (déplacement d'états, de transitions, ...) et donc d'améliorer le résultat, qui est souvent imparfait.
Les exemples présentés montrent ce que ce programme parvient à faire. On voit d'une part que même si certains croisements existent, le résultat est proche de ce que l'on peut faire à la main (cf. FIGURE 1.2 et FIGURE 3.4). D'autre part, ce résultat dépend beaucoup de l'automate : l'automate des MINES (cf. FIGURE 3.5) est correctement représenté alors que celui de CENTRALE (cf. FIGURE 3.6) est complètement illisible car il nécessite une représentation par arbre.