1

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

2

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

3

Tu soustrais x et y des 2 coordonnées, tu fais le rotozoom et tu rajoutes x et y quand tu as fini. Ça ne fait que 2 soustractions et 2 additions de plus, c'est très rapide (à condition que tu ne travailles pas en virgule flottante, évidemment grin - mais ça tu le sais déjà smile).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

je soustrait x et y (les coordonnées du centre donc) de kelles coordonnées?

5

des coordonnées initiales de la texture à parcourir j'imagine...
pourtant je viens d'essayer, et au lieu d'une rotation j'obtiens une sorte de distortion
et le zoom se fait tjs vers le point (0,0) de la zone d'affichage. sad

6

Nerick
a écrit : je soustrait x et y (les coordonnées du centre donc) de kelles coordonnées?

Ben, des coordonnées auxquelles tu appliques le rotozoom...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

nan tjs pas... sad
ça parait simple pourtant, mais je n'ai tjs pas une rotation en faisant cela sad

8

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...

9

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.

10

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...

11

Kevin> tu pourrais détailler ce que tu as tenté de m'expliquer stp?
je ne pense pas avoir très bien compris sad

12

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.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

ç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

14

c bon je me suis débrouillé
ça fonctionne à peu près smile

15

TextureX = CentreX - VectX
TextureY = CentreY - VectY

RotoZoom (pour 80 pixels sur 50 lignes)

puis
TextureX = CenterX + VectX TextureY = CenterY + VectY

C'est l'inverse qu'il faut faire!

TextureX = VectX - CentreX
TextureY = VectY - CentreY

RotoZoom (pour 80 pixels sur 50 lignes)

puis
TextureX = VectX + CentreX
TextureY = VectY + CentreY

Mais je ne sais pas si VectX et VectY sont bien les coordonnées auxquelles il faut appliquer la translation, je vais voir ta source en détail.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

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.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

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
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

pour le calcul a chaque iteration c régglé smile (je m'en suis rendu compte juste après t'avoir envoyé la source)
pour le reste je vais voir ça smile
ce que je pensais avoir trouvé hier fonctionne bizarrement...
je repasse + tard smile
merci!

19

je dois calculer TextureX/Y à partir de ScreenX/Y ?
il n'y a pas une autre solution, à partir de mon rotozoom tel qu'il est?
ça m'embêterai d'avoir à repenser mon algo dans l'autre sens... sad

20

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...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

21

exact mais TextureX et TextureY ne sont pas pas calculés en fonction de ScreenX et ScreenY smile
ScreenY en particulier n'est d'ailleurs qu'un compteur..
mon code ressemble à ça maintenant



while (!Esc){
[...]

Screen0 = LightPlane + 5 + 30 * 25; //ptr sur plan clair + offset du debut d'affichage
Screen1 = DarkPlane + 5 + 30 * 25; //idem pour le plan foncé

[...]

ScreenY = 50; //on affiche sur 50 lignes
while (ScreenY --) { //while + décrémentation pour optimiser le for
[...]
for (ScreenX = 0; ScreenX < 80; ScreenX ++) {
[...]
}
[...]
Screen0 += 30; // ligne suivante 30 octets + loin
Screen1 += 30;
}
<test clavier>
}



enfin, ce qui me gene dans ce que tu me propose, c'est:

ScreenX -= CentreX
ScreenY -= CentreY

...

22

Pas de réponse?

23

couic

24

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?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

25

edit: nan rien

26

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

27

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...
avatar
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.

28

Nerick > Pourquoi tu translate aps tout ton rotozoom à la fin ?

http://www.alrj.org/docs/2D/rotozoom/rotozoom.html évidement y a pas mal de retouche à faire pour optimiser la vitesse

29

(c nerick de chez vark)
yoda> c justement le tuto que j'ai utilisé pour coder mon rotozoom. le pb c que ce tuto n'explique pas comment changer le centre de rotation
Link> ouais ça m'interresse smile

30

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)
avatar
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.