PureBasic

Forums PureBasic
Nous sommes le Mar 25/Juin/2019 14:49

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 
Auteur Message
 Sujet du message: Tuto algèbre linéaire
MessagePosté: Sam 15/Oct/2016 16:31 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tuto algèbre linéaire
MessagePosté: Lun 17/Oct/2016 14:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Voila j'ai ajouté une petit :wink: t exemple en PB

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tuto algèbre linéaire
MessagePosté: Lun 17/Oct/2016 21:24 
En ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2748
Localisation: Klyntar
Je n'en ai pas l'utilité, mais bravo et merci pour le travail. 8)






@++

_________________
Windows 10 x64, PureBasic 5.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tuto algèbre linéaire
MessagePosté: Mar 18/Oct/2016 6:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2137
Localisation: 50200 Coutances
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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tuto algèbre linéaire
MessagePosté: Mar 18/Oct/2016 9:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6623
Localisation: Isere
Merci 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye