Il faut isoler chaque ligne de texte dans un rectangle curviligne, dont les côtés non verticaux sont des portions de paraboles convenablement ajustées.
Le contenu pictural sera transféré dans un rectangle de hauteur (HL) convenue, par exemple 50 ou 100 pixels, et de largeur égale à celle (La) de la zone de texte.
1°) Circonscrire au préalable le domaine du texte par le rectangle (ABCD), de dimensions (La, Ha).
a) Noter les ordonnées des (N + 1) points d'intersection successifs (A0, A1, ... Ak, ... AN) du côté gauche (AD) du rectangle avec les médianes séparant les extrémités gauches des lignes successives: on obtient une première suite de valeurs entières (a0, a1, ... aN).
b) Faire de même pour les (N + 1) points d'intersection successifs (B0, B1, ... Bk, ... BN) du côté droit (BC) du rectangle avec les médianes séparant les extrémités droites des lignes successives: on obtient une seconde suite de valeurs entières (b0, b1, ... bN).
c) Reprendre enfin le procédé pour les (N + 1) points d'intersection successifs (J0, J1, ... Jk, ... JN) de la médiane verticale du rectangle avec celles séparant les parties centrales des lignes successives: on obtient une troisième suite de valeurs entières (m0, m1, ... mN).
C'est une démarche entièrement manuelle, mais dont l'exécution ne devrait pas présenter de difficulté sur une image agrandie.
2°) Il devient alors possible d'arpenter chaque bande ainsi délimitée à l'aide de deux réels (u, v) compris entre zéro et l'unité.
a) La première frontière parabolique (AkIkBk) correspond à (v = 0) et admet pour équation:
y = ak + (bk - ak)*u + hk*u*(1 - u) ;
le coefficient (hk) du dernier terme correspond à l'ordonnée centrale (u = 1/2 , y = mk) et vérifie l'équation:
mk = (bk + ak)/2 + hk/4 .
b) La seconde frontière parabolique (Ak+1Ik+1Bk+1) correspond à (v = 1) et admet pour équation:
y = ak+1 + (bk+1 - ak+1)*u + hk+1*u*(1 - u) ;
le coefficient (hk+1) du dernier terme correspond à l'ordonnée centrale (u = 1/2 , y = mk+1) et vérifie l'équation:
mk+1 = (bk+1 + ak+1)/2 + hk+1/4 .
c) On établit ainsi un maillage la bande envisagée par un réseau de paraboles; la localisation d'un point quelconque à l'aide de ses coordonnées curvilignes (u, v) s'effectue par les équations:
y = a + (b - a)*u + h*u*(1 - u) ;
a = ak*(1-v) + ak+1*v ;
b = bk*(1-v) + bk+1*v ;
h = hk*(1-v) + hk+1*v .
3°) Intervient alors la synthèse de l'image transformée, circonscrite au rectangle (La, HL), réalisée au moyen d'une double boucle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| TYPE Rectangle = ARRAY[0..La - 1, 0..Hl - 1] OF Puxel;
VAR Ligne: Rectangle;
PROCEDURE Calc_Ligne(VAR Lg_: Rectangle);
CONST Imax = Hl - 1; Jmax = La - 1;
VAR i, j, Li: Word; a, b, h, p, q, r, s, u, v: Extended;
BEGIN
FOR i:= 0 TO Imax DO
BEGIN
v:= i / Imax;
p:= a[k]*(1-v); q:= a[k+1]*v; a:= p + q;
p:= b[k]*(1-v); q:= b[k+1]*v; b:= p + q;
p:= h[k]*(1-v); q:= h[k+1]*v; h:= p + q;
FOR j:= 0 TO Jmax DO
BEGIN
u:= j / Jmax; w:= u * (1 - u); s:= h * w;
p:= a[k] * (1 - u); q:= a[k + 1] * u; r:= p + q;
Li:= Round(r + s); Lg_[i, j]:= Image[Li, j] // Pixel(Ligne (Li), Colonne(j)) de l'image initiale
END // Li<>i en raison de l'inclinaison des lignes d'écriture
END // et de leur courbure
END; |
Ce qui est donné ici est à prendre comme du pseudo-code; il traîne peut-être quelques erreurs.
PS: Jipété a tout à fait raison sur les objections formulées; le document en cause comporte au moins deux zones, avec des couleurs de texte et de fond différentes; et la proximité des teintes ne va rien arranger.
Partager