Index
Documentation
µlib:
µlib est une bibliothèque de fonctions destinées à l'affichage graphique tridimentionnel.
Elle est programmée entièrement en assemleur. Toutes les fonctions de calcul et de projection
tridimentionnels ont étés créés de toutes pièces.
Cette version est une démonstration avancée, et je me réserve le droit de modifier tout ce
qu'il me plaira sans préavis (noms des fonctions, fonctions, arguments, voir nom de la lib...).
Son nom "officiel" est µlib, mais étant donné certaines difficultés de transmition dûes
au caractère "µ", µlib sera remplacé par mulib :*(
Bien sûr, toutes les mises à jour (dans le cas où il y en aurait) seront sur mon site.
Requis:
Bien sûr, l'emploi de cette lib nécessite une calculatrice ti-89 ou ti-92(+) munie d'un kernel.
Je n'ai pas fait de nombreux test, mais elle devrait fonctionner sur toutes les ROMs et hardwares.
Utilise GenLib, par Patrick Pelissier, version 0.99.20 ou plus récente.
En effet, µlib utilise des fonctions grahiques de GenLib telles que le traçage de lignes clippées et de triangles remplis.
Elle utilisera également plus tard les tables trigonométriques.
Pour pouvoir utiliser cette lib, il faut tout d'abord ajouter la ligne:
include "mulib.h"
dans le pogramme, après avoir copié le fichier "µlib.h" dans le dossier include\asm
(ou asm\include) de votre compilateur.
De plus, µlib utilisant GenLib, vous devez inclure cette lib aussi, de la même manière. Il faut alors initialiser GenLib
au début du programme comme il est expliqué dans la documentation de GenLib.
Disclaimer:
Ceci est une librairie en assemleur, et en version d'essai de surcroît. En conséquence,
je ne peux en aucun cas être considéré comme responsable des éventuels dommages (bugs, erreur fatales, pertes de mémoire, etc...)
que peut entraîner un usage quelconque de cette lib.
Cependant, cette lib est en plein cours de développement, il est donc possible que:
-Certaine fonctions soient inopérantes, ou buggées à 100%
-La description d'une fonction ne corresponde pas à ladite fonction
-Les argument changent d'ici la prochaine version
-Des fonctions disparaissent d'ici la prochaine version
-Le nom change d'ici la prochaine version
-La lib disparaisse d'ici la prochaine version
-Qu'il n'y ait pas de prochaine version
Merci de votre compréhension.
Bugs:
Si vous constatez des bugs liés à l'utilisation de µlib, je vous serais reconnaissant de m'en faire part:
ximoon@voila.fr
Tout report de bug devra être accompagné de sa description, des circonstances qui l'ont entrainé, de la fonction
dans laquelle il intervient et de tous le détails qui pourraient m'aider à le fixer. Merci d'avance.
Fonctions principales
mulib::rotate_E
mulib@0000
Input:
Coordonnées (signées):
d0.w = x0
d1.w = y0
d2.w = z0
Angles:
d3.w = précession psi (p)
d4.w = nutation theta (t)
d5.w = rotation propre phi (f)
Output:
d0.w = x1
d1.w = y1
d2.w = z1
Registres détruits:
Description:
Obtient les coordonnées d'un point d'une base initiale
(o,x0,y0,z0) dans la base (o,x1,y1,z1) en rotation par
les angles d'Euler par rapport à la première autour du
centre mulib::centre. Les coordonnées d'entrée sont par rapport au centre,
celles de sortie sont classiques.
Notes:
Actuellement cette fonction est buggée (erreur dans les équations
de rotation/projection). Etabt donné son intéret réduit, je ne sais pas si je corrigerai
le bug ou si je me contenterai de la supprimer...
mulib::rotate_A
mulib@0002
Input:
Données:
a0.l = pointeur vers une structure de point 3D
Angles:
d3.w = alpha (a)
d4.w = beta (b)
d5.w = gamma (g)
Output:
Registres détruits:
d0/d1/d2/d6/d7/a0 (+a1 = output)
Description:
Obtient les coordonnées d'un point d'une base initiale
(o,x0,y0,z0) dans la base (o,x1,y1,z1) en rotation par
d'angles alpha, beta, gamma par rapport aux axes x,y et z
puis centre sur mulib::centre. Les coordonnées d'entrée sont par rapport au centre,
celles de sortie sont classiques.
mulib::n_rotate_E
mulib@0001
Input:
Données:
a0.l = Liste source
a1.l = Liste de destination
d7.w = Nombre de points
Angles:
d3.w = précession psi (p)
d4.w = nutation theta (t)
d5.w = rotation propre phi (f)
Output:
Nouvelles coordonnées dans #destination
Registres détruits:
Description:
mulib::n_rotate_A
mulib@0003
Input:
Données:
a0.l = Liste source
a1.l = Liste de destination
d7.w = Nombre de points
Angles:
d3.w = alpha (a)
d4.w = beta (b)
d5.w = gamma (g)
Output:
Nouvelles coordonnées dans #destination
Registres détruits:
d0/d1/d2/d6/a1 (à vérifier...)
Description:
mulib::draw_n_lines
mulib@0004
Input:
Output:
Registres détruits:
Description:
Trace n lignes de couleur à partir d'une liste de segments.
Les couleurs sont celles de genlib: 1,2,3 ou 4.
Les lignes sont clippées, seules les coordonnées
x et y de chaque point sont prises en compte (projection de
z sur le plan de l'écran).
Les lignes sont tracées par genlib dans l'écran de travail
genlib doit donc avoir été initialisée (!).
mulib::draw_n_faces
mulib@000A
Input:
Output:
Registres détruits:
Description:
Trace n faces de couleur à partir d'une liste de faces.
Les couleurs sont celles de genlib: 1,2,3 ou 4.
Les faces sont clippées, seules les coordonnées
x et y de chaque point sont prises en compte (projection de
z sur le plan de l'écran).
Les lignes sont tracées par genlib dans l'écran de travail
genlib doit donc avoir été initialisée (!).
mulib::draw_object
mulib@000C
Input:
a0.l = Liste de points 3D
a1.l = Structure d'objet 3D
Output:
Registres détruits:
Description:
Trace un objet en 3D si le produit mixte (AB^AC).Oz est positif.
De même que pour draw_n_faces, l'objet est tracé par genlib.
Notes:
Franchement, je ne sais pas si cette fonction marche. Je crois bien ne pas l'avoir encore terminée... A manier
avec précautions!
Outils
mulib::centre
mulib@0005
Type:
Structure de point 3D (8 octets signés).
Accès:
Description:
Variable, structure de point 3D (8 octets)
Centre de rotation pour mulib::rotate_?
Initialement (120,64,0).
mulib::cos
mulib@0006
Input:
d0.w = A (signé)
d1.b = i (signé)
Output:
Registres détruits:
Description:
Notes:
i est un angle tel qu'un cercle fasse un angle de 255,
i appartient donc à [0,255]. Cette fonction est celle donnée dans la doc de GenLib comme exemple (à peu de choses près).
mulib::sin
mulib@0007
Input:
d0.w = A (signé)
d1.b = i (signé)
Output:
Registres détruits:
Description:
Notes:
i est un angle tel qu'un cercle fasse un angle de 255,
i appartient donc à [0,255]. Cette fonction est celle donnée dans la doc de GenLib comme exemple (à peu de choses près).
mulib::vect_z
mulib@000B
Input:
a0.l = point A
a1.l = point B
a2.l = point C
Output:
d0.w = (AB^AC).Oz
(produit vectoriel de AB et AC projeté sur l'axe Oz).
Registres détruits:
Description:
Effectue le produit mixte (AB^AC).Oz (produit vectoriel de AB et AC projeté sur l'axe Oz). Les
points sont des points 3D.
Notes:
Cette fonction est utile pour ne présenter, par exemple,
les triangles que sous une seule face selon que cette opération
retourne une valeur positive ou non.
Il faut cependant bien faire attention à ce que l'angle
(AB,AC) soit du bon signe lors de la construction de l'objet.
mulib::cos_table
mulib@0008
Type:
Liste de 256 octets signés.
Accès:
Description:
Table de cosinus, 256 octets signés.
Notes:
A terme, les deux tables trigonométriques seront supprimées au proffit de celles de GenLib.
De plus, il est possible que ces tables soient peu précises (±0.39%)...
mulib::sin_table
mulib@0009
Type:
Liste de 256 octets signés.
Accès:
Description:
Table de cosinus, 256 octets signés.
Notes:
A terme, les deux tables trigonométriques seront supprimées au proffit de celles de GenLib.
De plus, il est possible que ces tables soient peu précises (±0.39%)...
Notes sur les structures
Axes de repérage:
L'origine du repérage est (0,0,0) en haut à gauche de l'écran.
L'axe des x pointe vers la droite, les y vers le bas et les
z percent l'écran vers l'intérieur de façon à ce que le repère
(O,x,y,z) soit orthonormal direct.
Angles:
Tous les angles utilisés proviennent des tables trigonométriques. Les cosinus et sinus qu'elle contiennent
sont tels qu'un cecle fermé fasse un angle de 255. L'idée vient bien sûr de la doc de GenLib, et il
s'avère que ce choix est très judicieux.
Point 3D:
Point_3D: dc.w x,y,z,0
x,y et z sont des mots signés.
Le quatrième mot porte la taille de la structure à 8 octets
au lieu de 6, et ne sert qu'à gagner un peu de temps dans
la gestion des points (en utilisant des lsl au lieu des mulu/s).
Liste de segments:
segment: dc.w (index du 1er point dans la liste de points).w
dc.w (index du deuxième point).w
dc.w (couleur).w
dc.w $0000
dc.w (premier point du 2ème segment).w
dc.w (deuxième point du 2ème segment).w
dc.w (couleur).w
dc.w $0000
dc.w ...
Un segment est donc représenté par quatre mots.
Les points sont des points 3D dont on n'utilise en fait que les
coordonnées x et y, l'axe des z étant perpendiculaire à l'écran.
Liste de faces:
faces: dc.w (index du 1er segment de la 1ère face dans la liste de segments).w
dc.w (index du deuxième segment).w
dc.w (index du troisième segment).w
dc.w (couleur).w
dc.w (index du 1er segment de la 2ème face dans la liste de segments).w
dc.w (index du deuxième segment).w
dc.w (index du troisième segment).w
dc.w ...
Une face est donc représentée par quatre mots.
La liste de segments est décrite ci-dessus.
Objet 3D:
Objet: dc.w numéro du point A
dc.w numéro du point B
dc.w numéro du point C
dc.w nombre de faces
dc.w liste de faces
dc.w ...
dc.w nombre de segments
dc.w liste de segments
dc.w ...
Les listes de faces et de segments sont celles citées plus haut.
Les trois points sont des points 3D.
Il faut bien faire attention au signe de l'angle (AB,AC) lors de
la création, car il importe sur celui du produit vectoriel (AB^AC).