PureBasic

Forums PureBasic
Nous sommes le Mar 25/Juin/2019 13:10

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 
Auteur Message
 Sujet du message: Cinématique inverse
MessagePosté: Ven 06/Juil/2018 20:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 1121
Vous pouvez modifier les constantes correspondantes au nombre d'os et leur longueur.

En dépit des apparences, cela n'a rien à voir avec le double pendule.

C'est ce qui est utilisé (dans le principe) en modélisation 3D pour bouger un squelettes ou pour animer un bras robotique en le déplaçant par son extrémité.
Code:
#x=600:#y=400
#nbBones=5 ;nombres de segments
#lengthBone=50 ;longueur des segments
#FixX=#X/2:#FixY=#Y/2 ;Coordonnées du point fixe

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or OpenWindow(0, 0, 0, #X, #Y, "Backward kinematic", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)=0 Or OpenWindowedScreen(WindowID(0),0,0,#X,#Y,0,0,0,#PB_Screen_WaitSynchronization)=0
    MessageRequester("Error", "Can't open the sprite system", 0)
    End
EndIf
Structure Bone
    x1.i
    y1.i
    x2.i
    y2.i
    length.i
    Angle.f
EndStructure
NewList Bone.Bone()

Procedure AddBone(List Bone.Bone(),length.i,angle.f)
    If ListIndex(Bone())=-1
        AddElement(Bone())
        Bone()\x1=#FixX
        Bone()\y1=#FixY
    Else
        xold.i=Bone()\x2
        yold.i=Bone()\y2
        AddElement(Bone())
        Bone()\x1=xold
        Bone()\y1=yold
    EndIf
    Bone()\Angle=angle:Bone()\length=length
    Bone()\x2=Bone()\x1+Bone()\length*Cos(angle)
    Bone()\y2=Bone()\y1+Bone()\length*Sin(angle)
EndProcedure

Procedure follow(List Bone.Bone(),targetX.i,targetY.i)
    Bone()\Angle=ATan2(targetX-Bone()\x1,targetY-Bone()\y1)
    Bone()\x2=Bone()\x1+Bone()\length*Cos(Bone()\Angle)
    Bone()\y2=Bone()\y1+Bone()\length*Sin(Bone()\Angle)
    a.i=Bone()\x2-Bone()\x1
    b.i=Bone()\y2-Bone()\y1
    Bone()\x2=targetx
    Bone()\y2=targety
    Bone()\x1=targetx-a
    Bone()\y1=targety-b
EndProcedure

Procedure Update(List Bone.Bone(),xold.i,yold.i)
    If LastElement(Bone())
        Repeat
            follow(Bone(),xold,yold)
            xold=Bone()\x1
            yold=Bone()\y1
        Until PreviousElement(Bone())=0
        ;shift back to fix point
        deltax.i=Bone()\x1-#FixX
        deltay.i=Bone()\y1-#FixY
        ForEach Bone()
            Bone()\x1-deltax
            Bone()\y1-deltay
            Bone()\x2-deltax
            Bone()\y2-deltay
        Next
    EndIf
EndProcedure

;create some bones...
For i=1 To #nbBones
    AddBone(Bone(),#lengthBone,Radian(-90))
Next i

Dx.i=2:Dy.i=2:x.i=Random(#X):y.i=Random(#Y)
Repeat
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
    ExamineKeyboard()
    ;bouncing box
    If x>#x Or x<0:Dx=-Dx:EndIf
    If y>#y Or y<0:Dy=-Dy:EndIf
    x+Dx:y+Dy
   
    Update(Bone(),x,y)
    StartDrawing(ScreenOutput())
    Circle(x,y,10,#Red)
    ForEach Bone()
        LineXY(Bone()\x1,Bone()\y1,Bone()\x2,Bone()\y2,#Blue)
        Circle(Bone()\x2,Bone()\y2,2,#White)
    Next   
    Circle(#FixX,#FixY,3,#Green)
    StopDrawing()
     Repeat:Event = WindowEvent():If event= #PB_Event_CloseWindow:End:EndIf:Until event=0
Until KeyboardPushed(#PB_Key_Escape)

_________________
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 5.45LTS - 32 bits


Dernière édition par Fig le Sam 07/Juil/2018 11:47, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Cinématique inverse
MessagePosté: Sam 07/Juil/2018 9:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6623
Localisation: Isere
C'est vraiment joli, j'y connais rien, mais c'est un peu comme les aquariums ou le feu, on se surprend à regarder ça pendant un certain temps
Merci 8)

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

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Cinématique inverse
MessagePosté: Sam 07/Juil/2018 16:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
8O

TOI,
tu dois travailler chez google :)

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Cinématique inverse
MessagePosté: Lun 09/Juil/2018 8:02 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Juin/2015 16:18
Messages: 257
joli code
tres propre


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Cinématique inverse
MessagePosté: Lun 09/Juil/2018 8:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8674
Concis et beau rendu. Bravo.

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Cinématique inverse
MessagePosté: Mar 28/Aoû/2018 22:15 
Hors ligne

Inscription: Dim 01/Juil/2018 22:38
Messages: 28
cool, beaucoup d'inspiration pour mon projet :)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 6 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