Obligement - L'Amiga au maximum

Mercredi 19 décembre 2018 - 06:01  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : GFA Basic - Gestion des polices vectorielles
(Article écrit par Morgan Chanet et extrait d'Amiga News Tech - mars 1991)


L'Amiga souffre d'un grave défaut au niveau des polices de caractères : il ne connaît pas les polices vectorielles. Certains programmes, comme Professional Page, implémente donc les leurs, qui suivent leur propre format. En voici un exemple.

La différence entre une police "Bitmap" et une police vectorielle tient essentiellement en ce que la police vectorielle est affichée par des calculs mathématiques, et non grâce à des matrices de points. Cependant, le calcul revient à transformer une police vectorielle en une matrice affichable, donc pour les petites tailles, il n'y aura pas de différence entre les deux types de polices. Mais l'avantage de la police vectorielle est qu'elle peut générer elle-même toutes ses tailles, sans limite théorique (seulement l'affichage), contrairement à la police Bitmap qui doit posséder chaque taille de corps de caractère, sous peine de représenter le caractère avec un effet d'escalier assez désagréable, en procédant à une multiplication des points de la matrice.

La théorie

Pour représenter la police vectorielle, j'ai renoncé aux coordonnées dites rectangulaires, où un point a pour coordonnées les valeurs x et y par rapport à l'origine, au profit des coordonnées dites polaires, où un point est défini par un rayon et un angle par rapport à l'origine. L'avantage des coordonnées polaires est essentiel lorsque l'on désire procéder à une rotation du caractère, car il suffit d'ajouter l'angle de rotation désiré à l'angle du point et le tour est joué !

Cependant, les instructions graphiques du GFA Basic ne connaissant que les coordonnées rectangulaires (x.y), il faudra procéder à une conversion :

Conversion polaire à rectangulaire :

x = r*COS(alpha)
y = r*SIN(alpha)

Conversion rectangulaire à polaire :

r=SQR(x~2+y~2)
alpha=ATN(y/x)

Dans mes routines, j'utilise les fonctions SINQ() et COSQ() qui travaillent dix fois plus vite que SIN() et COS(), même si la précision est moins bonne, elle est amplement suffisante.

La pratique

Avant de pouvoir afficher une police, il faut en posséder les données. A cette fin, chaque caractère de la police est formé par un certain nombre de vecteurs, théoriquement illimité, mais moins il y en aura, plus rapide sera l'affichage. Par soucis de simplification, vous définirez vos caractères à l'aide de coordonnées rectangulaires, puis les données seront converties par le programme 2 en coordonnées polaires, sous la forme de données (data), que vous insérerez ensuite dans le programme 1.

Donc en premier lieu, écrivez vos définitions de caractères dans un fichier appelé "VectorFont.data" (utilisez n'importe quel éditeur de texte) sous la forme caractère, x1, y1, x2, y2,...,xn, yn. -1, -1.

Par exemple : A, 1, 0, 1, 7,..., -1,-1

"-1, -1" indique la fin de la définition du caractère. Chaque caractère est défini à l'aide de segments de droite, il faut donc deux couples de coordonnées pour chaque segment (x1,y1) et (x2,y2). L'origine des points se trouve en haut à gauche de la matrice. Enfin, vous devez prévoir la taille de la matrice de la définition d'un caractère dans les variables "font_base%" (largeur, en principe 8) et "font_height%" (hauteur, en principe 8).

Ces données sont converties en coordonnées polaires pour ne pas avoir à le faire pendant l'exécution du programme, ce qui gagne du temps. Les données sont lues et chaque segment est stocké dans un tableau nommé "font_data#()", un autre tableau nommé "Font%()" servant de table d'index pour retrouver les segments des caractères. Il est à deux dimensions : le premier indice varie de 0 à 255, équivaut au code ASCII. Le second peut prendre les valeurs 1 et 2 : "1" indique l'indice de départ pour "Font_data#()", "2" indique le nombre de segments pour le caractère demandé.

De fait, rien n'oblige à construire une police entière : on peut se contenter de définir les caractères dont on a réellement besoin (d'ailleurs, à titre d'exemple, je vous donne la définition des chiffres 0 à 9 seulement).

Les routines qui suivent sont relativement simples et suffisamment commentées. Vous pourrez même les améliorer, en permettant par exemple d'utiliser plusieurs polices en même temps...

Programme 1 : gestion des polices vectorielles

GFA Basic
GFA Basic

Programme 2 : conversion des coordonnées cartésiennes en coordonnées polaires

GFA Basic

Programme 3 : coordonnées cartésiennes, à convertir avec le programme 2 et à insérer dans le programme 1 au label "segments:".

GFA Basic


[Retour en haut] / [Retour aux articles]