PureBasic
https://www.purebasic.fr/french/

Tuto algèbre linéaire
https://www.purebasic.fr/french/viewtopic.php?f=21&t=16328
Page 1 sur 1

Auteur:  microdevweb [ Sam 15/Oct/2016 16:31 ]
Sujet du message:  Tuto algèbre linéaire

Bonjour à tous,

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)

Image

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.

Image

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 :lol: )

Exemple PB:
Code:
; 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

Auteur:  microdevweb [ Lun 17/Oct/2016 14:35 ]
Sujet du message:  Re: Tuto algèbre linéaire

Voila j'ai ajouté une petit :wink: t exemple en PB

Auteur:  venom [ Lun 17/Oct/2016 21:24 ]
Sujet du message:  Re: Tuto algèbre linéaire

Je n'en ai pas l'utilité, mais bravo et merci pour le travail. 8)






@++

Auteur:  Micoute [ Mar 18/Oct/2016 6:22 ]
Sujet du message:  Re: Tuto algèbre linéaire

Moi, ça m'a donné des idées, merci pour le partage.

Auteur:  Kwai chang caine [ Mar 18/Oct/2016 9:44 ]
Sujet du message:  Re: Tuto algèbre linéaire

Merci 8)

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/