Quel est l'equivalent en C de ces fonctions??
C'étais aussi simple que ca?
Merci d'avoir repondu si vite
J'essaye de convertir un prog de rotation en C et ca marche pas alors qu'en basic ca marche Pourkoi?
BASIC:
(theta = o)
Prgm
setMode("Angle","DEGREE")
InputStr "image 40x40",img
Input "angle de rotation",ang
ClrDraw
RclPic #img,0,0
For a,1,40
For b,1,40
If pxlTest(a,b)=true Then
"racine carree"(a^2+b^2)->r
cos-1(a/r)->o
o+ang->o
round(r*cos(o)+50,0)->c
round(r*sin(o)+50,0)->d
PxlOn c,d
EndIf
EndFor
EndFor
EndPrgm
C:
// C Source File
// Created 02/12/01; 15:57:33
#define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization
#define SAVE_SCREEN // Save/Restore LCD Contents
#include <tigcclib.h> // Include All Header Files
short _ti89; // Produce .89Z File
short _ti92plus; // Produce .9XZ File
short x;
short y;
short c;
short d;
short teta;
short r;
short ang=90;
short show_picvar(char *SymName, short x, short y, short Attr)
{
SYM_ENTRY *sym_entry = SymFindPtr(SymName, 0);
if (!sym_entry) return FALSE;
if (peek(HToESI (sym_entry->handle)) != PIC_TAG) return FALSE;
BitmapPut(x, y, HeapDeref (sym_entry->handle) + 2, ScrRect, Attr);
return TRUE;
}
void _main(void)
{
ESI argptr;
short argtype = 0;
argptr = top_estack;
argtype = GetArgType(argptr);
ClrScr();
if (argtype != STR_TAG)
{
DlgMessage("ERREUR!","Argument inexistant ou d'autre type que 'str'",BT_OK,BT_NONE);
goto fin2;
}
if(show_picvar(GetSymstrArg(argptr),0,0,A_NORMAL)==FALSE)
{
goto erreur;
}
goto fin;
erreur:
DlgMessage("ERREUR!","l'image n'existe pas",BT_OK,BT_NONE);
goto fin2;
fin:
for (x=0;x!=50;x++)
{
for (y=0;y!=50;y++)
{
if(GetPix(x,y)==1)
{
r=sqrt((x*x)+(y*y)));
teta=asin((y/r)*3.14/180);
teta=teta+ang;
c=r*cos(teta*3.14/180);
d=r*sin(teta*3.14/180);
DrawPix(d+50,c+50,A_NORMAL);
}
}
}
ngetchx();
fin2:
}
Merci de m'eclairer rapidement
Déjà, remplace 3.14 par PI ou par 3.1415926535898 .
Correction: Le dernier chiffre est un 8, pas un 7, parce que c'est ...58979... Désolé pour l'erreur. Et c'est inutile de mettre plus de chiffres que ça: le format BCD de TI est limité à 14 chiffres significatifs de toute façon.
[edit]Edité par Kevin Kofler le 04-12-2001 à 21:27:05[/edit]
PpHd Le 04/12/2001 à 17:30 Ensuite fait if (Getpix(x,y)) // Ca ne vaut pas un mais TRUE ou FALSE
Je suis certain que le problème ne vient pa de l'affichage de l'image mais de l'algorithme de rotation mais je ne sais pas ou
Vire quand-même le ==1 pour le GetPix. C'est faux.
PpHd Le 06/12/2001 à 11:14 Transforme toutes tes variables short en float. Et pkoi t'as un x3.14/180 ? Pour convertir ? Mais n'est-ce pas deja au bon format ?
Au fait, j'ai trouvé une erreur grave:
teta=asin((y/r)*3.14/180);
Déjà les parenthèses sont mal placées, et puis la conversion est effectuée à l'envers. Correct:
teta=asin(y/r)*(180./PI);
Mets aussi tes 3.14/180 entre parenthèses: ... *(PI/180.). Ça permettra au compilateur d'en faire une constante et de supprimer un calcul en virgule flottante.
[edit]Edité par Kevin Kofler le 06-12-2001 à 22:01:38[/edit]
Merci pour vos réponse je vais tester si ca marche maintenant
J'avais pas vupour l'erreur de conversion
De toute facon je vais faire une table de cosinus et de sinus pour + de rapidité
Je viens d'essayer et ca marche toujours pas
il s'affiche des traid sur l'ecran mais ca ressemble a rien
Revoile le code modifié:
// C Source File
// Created 02/12/01; 15:57:33
#define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization
#define SAVE_SCREEN // Save/Restore LCD Contents
#include <tigcclib.h> // Include All Header Files
short _ti89; // Produce .89Z File
short _ti92plus; // Produce .9XZ File
short x;
short y;
short c;
short d;
short teta;
short r;
short ang=90;
short show_picvar(char *SymName, short x, short y, short Attr)
{
SYM_ENTRY *sym_entry = SymFindPtr(SymName, 0);
if (!sym_entry) return FALSE;
if (peek(HToESI (sym_entry->handle)) != PIC_TAG) return FALSE;
BitmapPut(x, y, HeapDeref (sym_entry->handle) + 2, ScrRect, Attr);
return TRUE;
}
void _main(void)
{
ESI argptr;
short argtype = 0;
argptr = top_estack;
argtype = GetArgType(argptr);
ClrScr();
if (argtype != STR_TAG)
{
DlgMessage("ERREUR!","Argument inexistant ou d'autre type que 'str'",BT_OK,BT_NONE);
goto fin2;
}
if(show_picvar(GetSymstrArg(argptr),0,0,A_NORMAL)==FALSE)
{
goto erreur;
}
goto fin;
erreur:
DlgMessage("ERREUR!","l'image n'existe pas",BT_OK,BT_NONE);
goto fin2;
fin:
for (x=0;x!=50;x++)
{
for (y=0;y!=50;y++)
{
if(GetPix(x,y))
{
r=sqrt((x^2)+(y^2));
teta=asin(y/r)*(180/PI);
teta=teta+ang;
c=r*cos(teta*(PI/180));
d=r*sin(teta*(PI/180));
DrawPix(d+50,c+50,A_NORMAL);
}
}
}
ngetchx();
fin2:
}
PpHd Le 07/12/2001 à 17:22 j'ai dit de transformer tes variables en float !
Surtout r, teta et angle !
p_y_a Le 07/12/2001 à 17:33 Ecoute le maitre , jeune apprenti !
"I read the game.dll assembly more easily than you read the joke on the back of your box of Cocoa Pebbles, and have spent the past 2 1/2 years navigating it." ©
Argh, encore une erreur très grave: x^2 veut dire x XOR 2 en C! Il faut écrire x*x. (Sinon, pour les puissances générales, c'est pow(x,n), mais x*x est bien plus rapide que pow(x,2).)
Et puis:
- Si tu utilises des floats, pas besoin de passer par les degrés.
- C'est quoi ça, teta=teta+ang? Ce n'est pas faux, mais en C, on écrit plutôt teta+=ang.
[edit]Edité par Kevin Kofler le 07-12-2001 à 19:18:40[/edit]
merci encore, je vous tiens au courant si ca marche pas
Ca y est ca marche mais l'image n'est pas claire, elle est toute tremblotante pourkoi?
Quelle est la methode pour que l'image soit nette?
Probablement utiliser des variables de type float plutôt que short.
Ca marche parfaitement mais c'est tres lent pour obtenir des rotations fluides, meme avec des tables de sinus et cosinus.
Quelkun a pas une méthode plus rapide ou une routine en ASM?