1-Comment fais-t-on pour faire des racines carrées en C?
(J'ai cherché et j'ai pas trouvé, meis je m'en sort avec de puissance 1/2!)
2-Comment fais t'on pour avoir un cosinus en degré(ou sinus...)?
Merci d'avance pour vos réponses...
(je fais un programme de rotation de sprite en C qui est un peu lent en basic)
niuob Le 24/11/2001 à 16:03 >1-Comment fais-t-on pour faire des racines carrées en C?
Fonction sqrt (square root : racine carrée)
>2-Comment fais t'on pour avoir un cosinus en degré(ou sinus...)?
Tu as un angle en degré, tu le multiplies par PI/180, et tu lui appliques la fonction cosinus ou sinus.
Houla, utiliser de la racine carrée pour faire une rotation de sprite, c mauvais plan...
Et fait toi des tables de cos et sin plutôt.
Regarde aussi le tutorial S1P8 de Thomas Nussbaumer ( tict.ticalc.org ).
Je fais un programme de rotation de sprites en passant par les coordonnées polaires
J'utillise donc la racine carrée pour calculer r et les cosinus pour "theta", ensuite je change l'angle obtenu par incrémentation et je retransforme en coordonnées (x,y)
Est ce qu'il y a une méthode + rapide?
En basic ca donne ca:
(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
Il y a mieux: il suffit de multiplier a+ib par e^(i*ang) pour obtenir c+id.
En découpant:
(a+ib)e^(i*ang)=c+id
(a+ib)(cos(ang)+i sin(ang))=c+id
a cos(ang) + i a sin(ang) + i b cos(ang) - b sin(ang)=c+id
a cos(ang) - b sin(ang) + i (a sin(ang) + b cos(ang))=c+id
Donc:
c = a cos(ang) - b sin(ang)
d = a sin(ang) + b cos(ang)
Mais ca c'est plutôt pour rotationner un pxl, pas un sprite.
Ouais, c quand même pas comme ça qu'on fait une routine de rotation de sprite optimisée.
>ZdRUbAl: Oui, mais si tu le fais pour tous les points du sprite ...
Ou plutôt si on applique la rotation réciproque à tous les points de la destination et qu'on regarde à quel point du sprite ils correspondent. (Ça donne un résultat bien meilleur.)
niuob Le 28/11/2001 à 14:53 > Kevin: Ou plutôt si on applique la rotation réciproque à tous les points de la destination et qu'on regarde à quel point du sprite ils correspondent. (Ça donne un résultat bien meilleur.)
Pour ne pas faire trop d'erreurs d'arrondis ?
Non, pour éviter de traîter certains pixels de la destination plusieurs fois et en oublier d'autres.