Tuto algèbre linéaire

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Tuto algèbre linéaire

Message par microdevweb »

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 : 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Tuto algèbre linéaire

Message par microdevweb »

Voila j'ai ajouté une petit :wink: t exemple en PB
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Tuto algèbre linéaire

Message par venom »

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






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Tuto algèbre linéaire

Message par Micoute »

Moi, ça m'a donné des idées, merci pour le partage.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Tuto algèbre linéaire

Message par Kwai chang caine »

Merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre