Excuse-moi Tmyke. Je débarque un peu après des heures de réaction en chaîne dans le crâne. Il faut que je fasse une pause, question priorité de programmation, sinon il va y avoir un laissé pour compte à qui je dois un programme dans un autre domaine.
Mais je suis déterminé. Si ce passage est quasi-obligatoire, je le ferai. C'est évident. Nul n'a la science infuse, et moi le 1er. En fait, soit on a un très bon niveau dans un domaine appliqué (ici, les maths, la trigo) et l'on transcrit sa théorie en programmation. Soit on est comme moi, à jongler avec les rudiments niveau Bac, mais à maîtriser assez correctement la création d'algorithmes avec le peu qu'on a.
Une chose est sûre, je sais maintenant, et grâce au code plus haut (merci Cpl) que le calcul 3D possède plusieurs 'étage', et cela s'applique aussi en 2D. La découverte de la matrice plus haut m'a permis au moins de comprendre que je 'bricolais' sur la rotation en Z de mon ellipse (Code source plus bas, avec, cette fois-ci principe analogue à la matrice).
Une ellipse c'est élémentaire : c'est la raison pour laquelle je m'y obstine. Au moins, si je parviens à mes fins, je pourrais tout expliquer de A à Z.
Du point de vue du calcul, j'en suis au stade où j'ai un sommet pointé par un vecteur unitaire. Il subit:
1) une rotation sur l'axe Z 'esclave' de mon milieu d'écran
2) une rotation sur l'axe Y 'esclave' de la rotation Z
3) une rotation sur l'axe X 'esclave' de la rotation ZY
Il me manque le 4ème étage :
(4) une rotation sur l'axe 'Zeta*' 'esclave' de la rotation ZYX
*:Dans la rotation ZYXZeta, je pense que la rotation sur Zeta est en fait une rotation sur X alors que Y est temporairement décalé d'un quart de tour durant le calcul Zeta.
Et le tour sera joué. Comme dit Cpl, le code fourni plus haut, est un bon modèle pour créer cette 4ème rotation. Elle n'est pas si méchante en fait.
Elle demande juste de maîtriser parfaitement les rotations (1), (2) et (3) sous forme de procédure pour effectuer 'temporairement' un quart de tour sur l'axe Y, calculer la rotation Zeta, puis annuler ce quart de tour.
Code de l'ellipse : Rotation ZYX
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(1024, 768, 32, "x")
;***********
R.F = 100.0
Xtheta.F = 0.0
Ytheta.F = 0.0
Ztheta.F = 0.0
Ttheta.F = 0.0
;***********
Repeat
StartDrawing(ScreenOutput() )
Box(0, 0, 1024, 768, #Black)
Vxx.F = Cos(Ztheta)
Vxy.F = -Sin(Ztheta)
Vyx.F = Cos(Ztheta + #PI / 2.0)
Vyy.F = -Sin(Ztheta + #PI / 2.0)
Line(512, 384, Vxx * 20.0, Vxy * 20.0, #Blue)
Line(512, 384, Vyx * 20.0, Vyy * 20.0, #Blue)
For i = 0 To 359
; MaJ référentiel Vecteur x et Vecteur y
X.F = #PI * i / 180.0
Tx.F = Cos(X) * Cos(Ytheta) * 100.0
Ty.F = Sin(X) * 100.0
Ex.F = Vxx * Tx + Vxy * Ty
Ey.F = Vxy * Tx + Vyy * Ty
;Trace vecteur E
Plot(512 + Ex, 384 + Ey, #Blue)
If Abs(X - Xtheta) < 0.01
Line(512, 384, Ex, Ey, #White)
Box(511 + Ex, 383 + Ey, 3, 3, #White)
EndIf
Next
Xtmp = Xtheta * 180 / #PI
Xtmp % 180
DrawText(0, 0, Str(Xtmp), #White, #Black)
Ytmp = Ytheta * 180 / #PI
Ytmp % 180
DrawText(0, 16, Str(Ytmp), #White, #Black)
ZTmp = (Ztheta * 180 / #PI)
Ztmp % 180
DrawText(0, 32, Str(Ztmp), #White, #Black)
DrawText(0, 48, "Utilisez les 4 flèches de direction et PageUp, PageDown pour modifier x, y, et z")
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_PageUp)
Ztheta + 0.04
EndIf
If KeyboardPushed(#PB_Key_PageDown)
Ztheta - 0.04
EndIf
If KeyboardPushed(#PB_Key_Up)
Xtheta + 0.04
If Xtheta > 2.0 * #PI
Xtheta - 2.0 * #PI
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down)
Xtheta - 0.04
If Xtheta < 0.0
Xtheta + 2.0 * #PI
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)
Ytheta + 0.04
EndIf
If KeyboardPushed(#PB_Key_Right)
Ytheta - 0.04
EndIf
Until KeyboardPushed(#PB_Key_Escape)