1

Bonjour, - bien heureux que tout soir rentre ds l'orde, bravo et merci -

voici un bout de code :


void DrawSphere(unsigned short x, unsigned short y, unsigned int r, float phase, float angle)
{
float xa = 0.0,
ya = 0.0,
za = 0.0;
unsigned int xs = 0,
xx = 0,
ys = 0,
yy = 0;
float a = 0.0,
b = 0.0,
j = 0.0;

for( a=-PI/2.0 ; a<PI/2.0 ; a+=0.2)
{
if(phase>PI)
{
b=phase-PI; //Deg2Rad(Norm180(Rad2Deg(phase-PI)));
j=PI;
}
else
{
b=0.0;
j=phase;
}
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*angle));
ys = (unsigned int)Int_Float(za+ya*angle);
xx = xs+x;
yy = ys+y;
while(b<=j)
{
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*angle));
ys = (unsigned int)Int_Float(za+ya*angle);
DrawLine(xx, yy, xs+x, ys+y, A_NORMAL);
b+=0.2;
}
}
}


Mon but est de dessiner une sphere (courbes u et v) centree sur l'ecran MAIS en tenant compte :
- de la phase: 0/360°->invisible 90°->moitie gauche visible 180°->entiere 270->moitie droite
- d'un angle definissant la visibilite du pole nord (rotation)

le soucis est que mon code est tres lourd sad tres lent sad et ne trace que les latitudes sad
Comment tracer les meridiens ? et comment faite vous pour tracer plus vite ? ma priorite etant la taille de mon exe final.

Amicalement,
Wolf
Astronome Amateur
Programmeur quand il fait pas bo !

2

DrawLine est une fonction lente, mais le pire c'est l'utilisation de float (et de fonctions les manipulant) : utilise une représentation des nombres avec virgule fixe, et précalcule tes sinus/cosinus. Pour le traçage de lignes, ExtGraph fournit une fonction très rapide, mais peut-être un peu grosse.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

salut sasume,
oui je calcul en float car c'est un logiciel d'astronomie (ephemeride et pilotage de telesctope) j'ai don besoin d'une grande precision.
Pour utiliser les virgules fixes, est-ce possible UNIQUEMENT dans une fonction ?

sinon voici le tracage des meridiens :


void DrawSphere(unsigned short x, unsigned short y, unsigned short r, float phase, float angle)
{
float xa = 0.0,
ya = 0.0,
za = 0.0;
unsigned int xs = 0,
xx = 0,
ys = 0,
yy = 0;
float a = 0.0,
b = 0.0,
j = 0.0,
i = 0.0;

for( a=-PI/2.0 ; a<=PI/2.0 ; a+=0.2)
{
if(phase>PI)
{
b=phase-PI; //Deg2Rad(Norm180(Rad2Deg(phase-PI)));
j=PI;
}
else
{
b=0.0;
j=phase;
}
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*(angle)));
ys = (unsigned int)Int_Float(za+ya*(angle));
xx = xs+x;
yy = ys+y;
while(b<=j)
{
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*(angle)))+x;
ys = (unsigned int)Int_Float(za+ya*(angle))+y;
DrawLine(xx, yy, xs, ys, A_NORMAL);
xx = xs;
yy = ys;
b+=0.2;
}
}


if(phase<PI)
{
b=0.0;
i=phase;
}
else
{
b=phase-PI;
i=PI;
}
while( b<=i )
{
if(phase<0)
{
a=phase-PI;
j=PI;
}
else
{
a=-PI/2.0;
j=PI/2.0;
}
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*(angle)));
ys = (unsigned int)Int_Float(za+ya*(angle));
xx = xs+x;
yy = ys+y;
while(a<=j)
{
xa = r*(cos(a)*cos(b));
ya = r*(cos(a)*sin(b));
za = r*sin(a);
xs = ((unsigned int)Int_Float(xa+ya*(angle)))+x;
ys = (unsigned int)Int_Float(za+ya*(angle))+y;
DrawLine(xx, yy, xs, ys, A_NORMAL);
xx = xs;
yy = ys;
a+=0.2;
}
b+=0.2;
}
}


mais c'est encore plus GROS...
ExtGraph est sans doute tres bien, mais je ne crois pas approprie pour mon prog sad dommage.
je pensais plutot a une petite routine "maison"...
bon j'y retourne smile
A+
Astronome Amateur
Programmeur quand il fait pas bo !

4

heu neutral

tu ferrait pas mieux d'utiliser autre chose qu'uen TI pourr ce genre de choses ?? neutral

pasque bon un ecran en 32x32 avec 2 couleurs :/ c'est pas top top

je te conseillerait plutot un PDA voir un PC (MAC) portable pour ce genre de choses, surtout que les logiciels existent deja sur ce plateformes
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

5

wolfgane :
salut sasume, oui je calcul en float car c'est un logiciel d'astronomie (ephemeride et pilotage de telesctope) j'ai don besoin d'une grande precision.

Tu peux avoir autant de précision que tu veux en virgule fixe ^^ Et honnêtement, pour le code d'affichage, je doute que tu aies besoin de tant de précision que ça : 16 bits pourraient quasiment suffire si tu choisis bien les plages de tes nombres...
Pour utiliser les virgules fixes, est-ce possible UNIQUEMENT dans une fonction ?

confus
		xa = r*(cos(a)*cos(b));
 		ya = r*(cos(a)*sin(b));
 		za = r*sin(a);
 		xs = ((unsigned int)Int_Float(xa+ya*(angle)));
 		ys = (unsigned int)Int_Float(za+ya*(angle));
 		xx = xs+x;
 		yy = ys+y;
   while(b<=j)
 	 {
 		xa = r*(cos(a)*cos(b));
 		ya = r*(cos(a)*sin(b));
		za = r*sin(a);
 		xs = ((unsigned int)Int_Float(xa+ya*(angle)))+x;
 		ys = (unsigned int)Int_Float(za+ya*(angle))+y;
		DrawLine(xx, yy, xs, ys, A_NORMAL);
 		xx = xs;
 		yy = ys;
		b+=0.2;
   }

Petite remarque, c'est une très mauvaise idée de dupliquer le code comme ça, parce que ton code sera plus pénible à lire, et tu risques de faire des erreurs (que tu ne verras pas forcément si tu ne relis pas attentivement *tous* les bouts de code).

Quelque chose comme :
   xx = -1;
   b -= 0.2;
   do
 	 {
 		xa = r*(cos(a)*cos(b));
 		ya = r*(cos(a)*sin(b));
		za = r*sin(a);
 		xs = ((unsigned int)Int_Float(xa+ya*(angle)))+x;
 		ys = (unsigned int)Int_Float(za+ya*(angle))+y;
		if (xx >= 0)
                    DrawLine(xx, yy, xs, ys, A_NORMAL);
 		xx = xs;
 		yy = ys;
		b+=0.2;
   } while(b<=j);

serait bien plus lisible et te permettrait de faire des modifications après bien plus facilement... (enfin là la modification que j'ai faite ne marche que si tu supposes que les arguments à DrawLine ne sont pas en dehors de l'écran, ce qui n'est pas forcément vrai; sinon, il n'y a qu'à transformer "xx = -1" en "xx = INT_MIN" et "xx >= 0" en "xx == INT_MIN", ce sera juste un chouilla plus lent et gros)

(idem pour le reste du code, mais j'ai pas envie de le lire tongue)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

6

En reponse a Godzil :

Oui, j'ai meme ce genre de chose sur mon telephone portable smile
mais j'ai une caltos, avec un port serie, pi voila wink en plus mon code est portable, donc y'aura ps trop de soucis.

En reponse a Pollus :

oui pour la duplication de code, c ma version bete, je vais faire une fctO car j'utilise cette partie pour d'autre chose aussi.
Je vais regarder comment utiliser la virgule fixe ?!
Je vais 'minspirer de ta routine, mais normalement en travaillant en rad je reste entre -1;1 donc impossible de sortir de l'ecran si je respecte mon echelle.

Amicalement,
Wolf
Astronome Amateur
Programmeur quand il fait pas bo !

7

Une petite optimisation :

/* ====================================================== */
/* = Function : Drawing Sphere = */
/* = Input : X,Y, ray, Phase & angleY, angleX = */
/* = Angles are used for projection formula = */
/* = Output : - = */
/* ====================================================== */
void DrawSphere(unsigned short x, unsigned short y, unsigned short r, float phase, float angleY, float angleX)
{
// real sphere coords
float xa = 0.0,
ya = 0.0,
za = 0.0;
// computation var.
float a = 0.0,
b = 0.0,
j = 0.0;
// counter for latitudes
short int latitude = 0,
longitude = 0,
delta = 0;
short int vertex = 180;
short tab[vertex][2];
//-----------------------------------------------------------
// computing sphericals points
for( a=-PI/2.0 ; a<=PI/2.0 ; a+=SPHERE_PRECISION,latitude++)
{
if(phase>PI)
{
b=phase-PI;
j=PI;
}
else
{
b=0.0;
j=phase;
}
// compute all the line
while(b<=j)
{
xa = (cos(a)*cos(b));
ya = (cos(a)*sin(b));
za = sin(a);
xa *= r;
ya *= r;
za *= r;
tab[longitude][0] = (unsigned short)Int_Float(xa*sin(angleX)+ya*-cos(angleX));
tab[longitude][1] = (unsigned short)Int_Float(za+ya*sin(angleY));
b+=SPHERE_PRECISION;
longitude++;
}
}

delta = (short)ceil((float)(longitude/latitude));
// drawing latitude lines with computed points
for(longitude=0,latitude=1;longitude<(vertex-delta);longitude++,latitude++)
{
if(latitude>=delta)
{
latitude=1;
longitude++;
}
DrawLine(tab[longitude][0]+x,tab[longitude][1]+y,tab[longitude+1][0]+x,tab[longitude+1][1]+y,A_NORMAL);
}
// drawing longitude lines with latitude's points computed before
for(longitude=0;longitude<(vertex-delta);longitude++)
DrawLine(tab[longitude][0]+x,tab[longitude][1]+y,tab[longitude+delta][0]+x,tab[longitude+delta][1]+y,A_NORMAL);

}
Astronome Amateur
Programmeur quand il fait pas bo !

8

wolfgane> tu peux utiliser la balise [ pre ] autour de ton code source, de façon à ce qu'il ne soit pas mis en forme (en particulier, que [ 0 ] ne mette pas en blanc)

(pour exemple, edite mon post)

tab[0] = 10;
printf("Hello World !");
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

9

> ExtGraph est sans doute tres bien, mais je ne crois pas approprie pour mon prog
FMI, pourquoi ? En tout cas, contrairement à presque toutes les autres librairies, ExtGraph n'a pas tout un stub d'init / deinit.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

10

11

Qu'est ce qui manque ?

12

13

Et ces fonction pour permettre de faire des trucs "tranquillement" ne sont pas faisables sans un "stub d'init/deinit" ?

14

./11 > gestion du link, affichage de chaines de caractères, zoom, traçage de polygones et d'ellipses.

./13 > Si. Pourquoi ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

15

"C'est sûr, mais en conséquence elle n'a pas certains features intéressantes de ce libs."

16

> disons que quand tu veux gérer des plans avec ExtGraph, tu dois le programmer à la main, à moins d'utiliser un tilemap engine.
ExtGraph toute seule, évidemment, car elle n'intègre pas de routines de grayscale. Mais TIGCCLIB et Grib, avec lesquelles elle fonctionne parfaitement, le font !
> Un seul binaire sur la calc,
<troll>Compatibilité on-calc sux, et j'ai des arguments déjà exposés dans d'autres topics - même s'il faut reconnaître un défaut au niveau de la facilité de transfert d'une calculette à une autre, les 92+/V200 sont plus rares !</troll>
> un seul header sur PC,
Certes, mais celui d'ExtGraph (ainsi que la lib) n'est séparé en plusieurs morceaux que parce que pas tout le monde n'a besoin du tilemap engine et de la brute-force (preshifting), qui rendraient le header moitié plus gros et illisible que ce qu'il n'est déjà - ~100 KB !

> Pareil pour les fonctions de synchronisation, genlib propose des fonctions et variables très bien foutues pour faire ça tranquillement.
Idem que plus haut: Grib.

GenLib n'existe qu'en grayscale, alors que beaucoup de programmes utilisant ExtGraph sont en B/W.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

17

./15 > Ah, alors les features sont : pas besoin de passer les adresses des planes où dessiner aux fonction, pas besoin de faire d'appel à GrayOn pour activer les niveaux de gris (puisque gl_init se charge de le faire).
D'ailleurs, je ne vois vraiment pas le problème d'avoir des fonctions d'init/deinit confus Je suppose que toi même dans tes projets tu dois bien avoir codé une fonction init_system et une fonction quit_system qui se chargent respectivement de mettre en place l'environnement de ton programme et de remettre la TI dans son état initial.
Et puis GrayOn et GrayOff ne sont-ils pas des fonctions d'init/deinit ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

18

Je vois. Mais perso, je me méfie générallement des lib qui s'occupent de tout, ça les rend moins souples

"D'ailleurs, je ne vois vraiment pas le problème d'avoir des fonctions d'init/deinit"-> Tu parles à qui ? (j'ai jamais dis que j'aimais pas ça happy moi)

19

Je m'adressais bien à toi smile
J'avais l'impression que ça t'embêtait.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

20

21

Ben, déjà, ça commence par les programmes de TICT: depuis que je maintiens les programmes, j'ai mis ExtGraph dans plusieurs d'entre eux. Il me semble que Civ89, par exemple, utilise ExtGraph.

C'était pour faire remarquer qu'ExtGraph a aussi un mode B/W. "Beaucoup" ne veut en effet pas forcément dire la majorité. Les programmes les plus connus (Ice Hockey 68k et autres de Travis, etc.) sont en grayscale.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

22

23

Sauf si ça a sauté dans la 1.x (ce dont je doute), Genlib fait effectivement aussi du noir et blanc...
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

24

Oui, mais elle n'est pas vraiment conçue pour. Très peu de fonctions permettent de travailler en BW (comparé à ExtGraph qui propose environ toutes ses fonctions en BW/nvg).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

25

Oui bien sûr, mais la fonctionnalité demeure.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

26

27

Ben, il faut carrément chercher pour voir qu'elle permet en effet de faire du B/W (en fait, je n'avais pas trouvé). Les recherches "BW", "B/W" et "B&W" dans la doc ne retournent presque rien !
Même l'intro ne dit pas immédiatement qu'elle permet de faire du B/W, et encore, c'est assez indirect:
"GENLIB is an asm dynamic (kernel based) graph 4-gray tiles-oriented library for TI-92, TI-92+, Ti-89, V200 and Titanium compatible with C and ASM"
[...]
What are the main features of GENLIB?
[...]
Put fast sprites: more than 13000 sprites (16x16) / second! (B&W).
[...]
The Black&White standard graph functions work with GENLIB.
[...]


Je suppose que Monsieur Julien Sabatier dit en termes peu diplomatiques que je devrais lire la doc et me documenter avant de "critiquer" ?
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

28

JS devrait être banni neutral
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

29

Puisque sa contribution, que tu m'as décrite, est de son style habituel, il faudrait en effet au moins le kicker du topic...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

30

Pour ce genre de réflexion, toi aussi hehe
Le comportement à adopter face à un post locké, c'est de n'en pas parler... fin de l'affaire.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.