je suis en train de coder un rotozoom (avec Vark) en C.
nous avons implémenté la routine correctement, ceci à 1 détail près:
impossible de trouver la formule pour changer le centre de rotation sur la surface d'affichage (64²), qui est par defaut (0,0)
il faudrait qu'au début de la routine, on puisse specifier les coordonnées (x,y) du centre, et appliquer une formule, que je n'ai pas réussi a trouver, pour qu'à l'écran, la texture tourne autour de ce point.
merci
Nerick Le 11/11/2002 à 19:35Edité par Nerick le 11/11/2002 à 19:36 euhh... de préférence des solutions pour que ça soit rapide, la taille du prog je m'en fout
il faut que ça rame le moins possible svp
Nerick Le 11/11/2002 à 20:37Edité par Nerick le 11/11/2002 à 20:45 je soustrait x et y (les coordonnées du centre donc) de kelles coordonnées?
Peut-être en rajoutant une composante sur x et une composante sur y (variables), tu pourrais translater le centre, ce qui reviendrait en quelque sorte àa ce que tu veux faire, non ?
Bien sûr, il ne faudrait pas oublier d'afficher les pixels qui sont avant le centre.
Mais je ne suis pas sûr que ça corresponde à ce que tu veux faire...
bah je sais pas..
ce que tu dis, ça semble revenir à ce que me propose Kevin, mais ça fonctionne pas qd je passe ça en C.
jackiechan Le 11/11/2002 à 21:55Edité par jackiechan le 11/11/2002 à 21:59 Ce que dit Kévin est sûrement mieux que ce à quoi je pense.
Mon idée :
Si tu veux que le centre de la rotation soit le point de coordonnnées 20;30, tu calcules l'image des points qui vont de -20;-30 à 44;34 (pour une image 64x64) et tu les translates tous de 20 pixels sur x et 30 pixels sur y.
Mais en fait, ça revient p-ê à ce qu'à dit Kevin, mais je ne suis pas sûr, je n'ai pas bien compris ce qu'il voulait dire...
Au lieu de calculer (xP+i yP)*r e^(i theta), tu calcules ((xP+i yP)-(x+iy))*r e^(i theta) + (x+iy).
En d'autres mots, au lieu d'appliquer la transformation à (xP,yP), tu l'appliques à (xP-x,yP-y) et tu rajoutes (x,y) après.
ça marche pas
je poste mon algo
////////////////////////////////////////////////////////////////
TextureX et TextureY sont les coordonnées respectivement horizontales et verticales tu pixel à rotozoomer
(CentreX, CentreY) est les coordonnées du centre de rotation
(VectX, VectY) est le couple représentant le vecteur directeur (VectX = cos(a) * CoeffZoom; VectY = sin(a) * CoeffZoom)
/////////////////////////////////////////////////////////////
TextureX = CentreX - VectX
TextureY = CentreY - VectY
RotoZoom (pour 80 pixels sur 50 lignes)
puis
TextureX = CenterX + VectX
TextureY = CenterY + VectY
Kevin Kofler Le 11/11/2002 à 22:57Edité par Kevin Kofler le 11/11/2002 à 22:59 Au fait, je viens de regarder ta routine, et elle ne me paraît pas optimale. Tu recalcules ça:
VectX = ((long)(Cos[AngleRot]) * (long)(ZoomCoeff)) >> 8;
VectY = ((long)(Sin[AngleRot]) * (long)(ZoomCoeff)) >> 8;
à chaque itération de la boucle en Y.
Or, ces variables ne changent pas au cours de la routine, il suffit donc de les calculer une seule fois au départ.
Et la transformation à faire ne doit pas toucher à ces variables, mais c'est:
ScreenX -= CentreX
ScreenY -= CentreY
RotoZoom (calcule TextureX/Y à partir de ScreenX/Y)
puis
TextureX += CentreX
TextureY += CentreY
Tu fais déjà une double-boucle en ScreenY et en ScreenX, donc c'est déjà ce que tu fais! À moins que je n'aie vraiment pas compris ton code...
Kevin Kofler Le 14/11/2002 à 01:46Edité par Kevin Kofler le 14/11/2002 à 01:47 Bon, si tu veux une réponse de ma part, il faudra que tu m'expliques ton algorithme, parce que faute de commentaires, je n'ai franchement pas compris grand chose de ce que tu fais.
Surtout: comment sont calculés TextureX et TextureY?
Nerick Le 14/11/2002 à 02:43Edité par Nerick le 14/11/2002 à 03:16 voila le principal est la, il n'ya que l'initialisation de GraphX et le déclaration des textures qui manquent.
avec ça, le centre de roto se situe en (0,0) de la zone d'affichage
ce que je n'arrive tjs pas a faire, c une rotatino autour d'un pt qq de la zone d'affichage
Link Le 14/11/2002 à 21:42 j'avais un prog de rotozoom en basic, si tu veux je peux essayer de le retrouver pour que tu puisses le porter en C...
Et il y avait quelques soustractions bien placées pour le déplacement du centre...

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.
Link Le 17/11/2002 à 20:37Edité par Link le 17/11/2002 à 20:45 Recherche en cours...
Edit: Ca y est!
(nomimg,theta)
Prgm
Local x,y,co,si,pic
If nomimg=/="" Then
mainzoompxl()
RplcPic #nomimg
Else
StoPic pic,0,0,8,1
EndIf
For x,80,158
PxlVert x,0
EndFor
approx(cos(theta))»co
approx(sin(theta))»si
For y,0,76
For x,80,158
(c)x et y: coordonnées d'arrivée
Try
(c) commande de test, clippée par le try:
(c) 32+ -> CentreX de rotation, Image de départ
(c) x-119 -> 119=CentreX de rotation, image d'arrivée
(c) y-38 -> 38=CentreY de rotation, image d'arrivée
(c) 32+ -> CentreY de rotation, image de départ
If pxlTest(int(32+(x-119)*si+(y-38)*co),int(32+(x-119)*co-(y-38)*si))
PxlOn y,x
Else
EndTry
EndFor
EndFor
EndPrgm
Ce programme affiche l'image #nomimg à l'écran et fait une rotation d'angle theta dans la partie droite (TI-89)

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.