Apprenant actuellement l'algèbre linéaire, j'ai décidé de partager quelques règles qui pourraient vous être utiles. Voici une première partie
La rotation:
Un exemple simple un carré que l'on fait tourné sur un angle alpha à 45°. (Nb si l'angle est positif on tournera dans le sens anti-horaire alors que si l'angle est négatif on tournera dans le sens horaire)
Première chose placé l’abscisse et l'ordonnée (dans le cas ici au centre de l'objet carré) Nb: dans vos programmes évidemment vous ne l’afficherez pas.
Deuxièmement Calculer la position des points (dans ce cas 4 a,b,c,d) par rapport à l'abscisse et l'ordonnée les points en question étant des vecteurs X,Y nous les placerons dans une matrice colonne
X
Y
Si la position X du point concerné est à gauche de l'ordonnée, alors il sera négatif (exemple: -100 pour carré de 200) si il est à droite il sera positif (exemple: 100 pour carré de 200)
Se sera la même chose pour la position Y, si il en haut de l'abscisse alors il sera positif (exemple: 100 pour carré de 200) si il est en bas il sera négatif (exemple: -100 pour carré de 200).
Troisièmement, nous allons maintenant calculer la nouvelle position des points ' en fonction de l'angle alpha avec une matrice de transformation carrée de 2 colonnes et 2 lignes.
Concrètement vous prenez chaque point comme calculé précédemment et vous faites comme l'exemple ci-dessous (avec un carré de 200)
aX'=(cos(Radian(45))*-100)+(-sin(Radian(45))*100)=-141,42
aY'=(sin(Radian(45))*-100)+(cos(Radian(45))*100)=0
etc...
Il ne vous reste plus qu'a ajouter la position de l'ordonnée au cordonnée X et la position de l'abscisse au coordonnées X de chaque point. Et vous aurrez effectué une rotation.
Ceci peut fonctionner pour des figures plus compliquée ou même une image, il suffit de faire l'opération pour chaque point ainsi une image de 256 pxl aura 65536 points à changés (heureusement ce sera le microprocesseur qui se tapera le boulot )
Exemple PB:
Code : Tout sélectionner
; Tuto algèbre linéaire
; Les rotations
; Variables/structure globale
Structure Vecteur
X.i
Y.i
EndStructure
Global NewList myForm.Vecteur()
Global Abscisse,Ordonnee,AngleAlpha
; Déclaration de procédure
Declare OpenForm()
Declare Draw()
Declare Event()
Declare Exit()
Procedure OpenForm()
OpenWindow(0,0,0,800,600,"Tuto algèbre linéaire (La rotation)",#PB_Window_SystemMenu|#PB_Window_Maximize)
CanvasGadget(0,0,0,WindowWidth(0),WindowHeight(0),#PB_Canvas_Keyboard)
; Calcul de l'abscisse et de l'ordonnée au centre de l'écran
Ordonnee=WindowWidth(0)/2
Abscisse=WindowHeight(0)/2
; Création d'un carré au centre de l'écran de 400 pxl
With myForm()
; A
AddElement(myForm())
\X=Ordonnee-200
\Y=Abscisse+200
;B
AddElement(myForm())
\X=Ordonnee+200
\Y=Abscisse+200
;C
AddElement(myForm())
\X=Ordonnee+200
\Y=Abscisse-200
; A
AddElement(myForm())
\X=Ordonnee-200
\Y=Abscisse-200
EndWith
Draw()
BindEvent(#PB_Event_CloseWindow,@Exit())
BindGadgetEvent(0,@Event())
MessageRequester("Info","Tounez la molette de la souris pour faire tourné le carré")
SetActiveGadget(0)
EndProcedure
Procedure Draw()
Protected X,Y
With myForm()
; Calcul des points en function de l'abscisse et l'ordonnée
ForEach myForm()
X=\X-Ordonnee
Y=\Y-Abscisse
\X=(Cos(Radian(AngleAlpha))*X)+(-Sin(Radian(AngleAlpha))*Y)
\y=(Sin(Radian(AngleAlpha))*X)+(Cos(Radian(AngleAlpha))*Y)
\X+Ordonnee
\Y+Abscisse
Next
EndWith
StartVectorDrawing(CanvasVectorOutput(0))
; Efface le canvas
VectorSourceColor($FFFFFFFF)
FillVectorOutput()
; Dessin du carré
With myForm()
FirstElement(myForm())
MovePathCursor(\X,\Y)
While NextElement(myForm())
AddPathLine(\X,\Y)
Wend
FirstElement(myForm())
AddPathLine(\X,\Y)
EndWith
VectorSourceColor($FF228B22)
StrokePath(2,#PB_Path_Preserve)
VectorSourceColor($FF00FF00)
FillPath()
StopVectorDrawing()
EndProcedure
Procedure Event()
Protected Delta
Static Angle
Select EventType()
Case #PB_EventType_MouseWheel
Delta=GetGadgetAttribute(0,#PB_Canvas_WheelDelta)
Select Delta
Case 1
Angle+1
If Angle>360
Angle=0
EndIf
AngleAlpha=0+Angle
Case -1
Angle-1
If Angle<=0
Angle=360
EndIf
AngleAlpha=0-(Angle)
EndSelect
Draw()
EndSelect
EndProcedure
Procedure Exit ()
End
EndProcedure
OpenForm()
Repeat:WaitWindowEvent():ForEver