La section hors sujet non officielle.

Vous n'êtes pas identifié(e).

#1 24-04-2020 22:48:04

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Simulation - Comportement social

Je me permets de vous présenter ce petit code source qui simule un comportement ressemblant à celui possible en société.

Les 'individus' se déplacent sur une surface homogène.

Les remarques motivent à corriger le code, donc n'hésitez pas.

;{ Head }
InitSprite()
InitKeyboard()
InitMouse()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "")
;}

Global ScrW = ScreenWidth()
Global scrH = ScreenHeight()
Global ScrW2 = ScrW / 2
Global scrH2 = ScrH / 2
Global ScrXmax = ScrW - 1
Global ScrYmax = ScrH - 1

oSize = 16
CreateSprite(0, oSize, oSize, #PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(0) )
        W = OutputWidth()
        H = OutputHeight()
        DrawingMode(#PB_2DDrawing_AllChannels)
        Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
        Divs = oSize / 8
        For I = 0 To (Divs - 1)
                G1 = (256 / Divs) * I
                G2 = I * (W / 2 - 1) / Divs
                G3 = I * (H / 2 - 1) / Divs
                Ellipse(W / 2 - 0, H / 2 - 0, W / 2 - 1 - G2, H / 2 - 1 - G3, RGBA(0, 0, 0, 255) )
        Next
        StopDrawing()
EndIf


SprLimit = 127 ; max = 8191
Dim X.D(SprLimit)
Dim Y.D(SprLimit)
Dim W.D(SprLimit)
Dim H.D(SprLimit)
Dim VX.D(SprLimit)
Dim VY.D(SprLimit)
Dim AX.D(SprLimit)
Dim AY.D(SprLimit)
Dim Freez(SprLimit)
For I = 0 To SprLimit
        W(I) = oSize
        H(I) = oSize
        X(I) = Random(ScrXmax + W(I) ) - W(I)
        Y(I) = Random(ScrYmax + H(I) ) - H(I)
        VX(I) = (Random(ScrXmax) - ScrW2) / 1000.0
        VY(I) = (Random(ScrYmax) - ScrH2) / 1000.0
Next

Procedure.D Hyp(x1.D, y1.D, x2.D, y2.D)
        Define.D R
        DX.D = x2 - x1
        DY.D = y2 - y1
        R = ((DX*DX) + (DY*DY ) )
        ProcedureReturn R
EndProcedure

Repeat
        ExamineKeyboard()
        ExamineMouse()
        ClearScreen(-1)
        For I = 0 To SprLimit
                If Freez(I) = 0
                        AX(I) = 0.0
                        AY(I) = 0.0
                        For J = I + 1 To SprLimit
                                DX.D = X(J) - X(I)
                                DY.D = Y(J) - Y(I)
                                Hyp.D = ((DX*DX) + (DY*DY ) )
                                Angle.D = ATan2(DX, DY)
                                If Sqr(Abs(Hyp) ) > oSize
                                        Force.D = 100.0 / Hyp
                                Else          
                                        Force.D = 0.0
                                        Angle2.D = ATan2(VX(I), VY(I) )
                                        Angle3.D = Angle2 - Angle
                                        Force2.D = Sqr(Hyp(0, 0, VX(I), VY(I) ) )
                                        VX(I) = Cos(Angle3) * Force2
                                        VY(I) = Sin(Angle3) * Force2
                                        
                                        Angle2.D = ATan2(VX(J), VY(J) )
                                        Angle3.D = Angle2 - Angle
                                        Force2.D = Sqr(Hyp(0, 0, VX(J), VY(J) ) )
                                        VX(J) = Cos(Angle3) * Force2
                                        VY(J) = Sin(Angle3) * Force2
                                        
                                EndIf
                                AX(I) + Cos(Angle) * Force
                                AY(I) + Sin(Angle) * Force
                                AX(J) - Cos(Angle) * Force
                                AY(J) - Sin(Angle) * Force
                        Next
                        VX(I) + AX(I)
                        VY(I) + AY(I)
                        X(I) + VX(I)
                        Y(I) + VY(I)
                        CoefA.D = 0.2
                        If X(I) < 0.0 - 2*W(I): X(I) + ScrW + W(I): VX(I) * CoefA: VY(I) * CoefA: EndIf
                        If Y(I) < 0.0 - 2*H(I): Y(I) + ScrH + H(I): VX(I) * CoefA: VY(I) * CoefA: EndIf
                        If X(I) > ScrXmax+W(I): X(I) - ScrW - W(I): VX(I) * CoefA: VY(I) * CoefA: EndIf
                        If Y(I) > ScrYmax+H(I): Y(I) - ScrH - H(I): VX(I) * CoefA: VY(I) * CoefA: EndIf
                EndIf
                DisplayTransparentSprite(0, X(I), Y(I) )
        Next
        FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)

Hors ligne



#2 24-04-2020 22:51:30

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Simulation - Comportement social

Si vous avez des difficultés à récupérer le code, une fois identifié, cliquez sur [citer]. Vous disposez alors de la totalité du code source.

Hors ligne

#3 25-04-2020 07:52:25

~ Ar-S ~
Admin
Inscription : 17-02-2020
Messages : 178
Site Web

Re : Simulation - Comportement social

C'est excellent smile


~ Ar-S ~  babacool

Hors ligne

#4 25-04-2020 20:02:00

Naheulf
PureBasicien
Lieu : ici
Inscription : 13-03-2020
Messages : 27

Re : Simulation - Comportement social

Perso je trouve qu'en ajoutant le tableau

[== PureBasic ==]
Dim Color.q(SprLimit)"

à initialiser dans la boucle For (ligne 50) avec :

[== Undefined ==]
Repeat
        Color(I) = RGB(Random(255), Random(255), Random(255))
Until Red(Color(I)) + Green(Color(I)) + Blue(Color(I)) < 512

Et enfin à utiliser en remplaçant

[== PureBasic ==]
DisplayTransparentSprite(0, X(I), Y(I) )

par

[== PureBasic ==]
DisplayTransparentSprite(0, X(I), Y(I), 255, Color(I))

C'est plus sympas à regarder.


Remarque : Le comportement lorsque deux points rentrent en collision est trop chelou.

Dernière modification par Naheulf (25-04-2020 20:05:28)

Hors ligne

#5 26-04-2020 10:30:05

~ Ar-S ~
Admin
Inscription : 17-02-2020
Messages : 178
Site Web

Re : Simulation - Comportement social

Bien en couleur.
Oui les rencontes sont excellentes. ça fait très fourmis.


~ Ar-S ~  babacool

Hors ligne



#6 26-04-2020 15:04:11

Olliv
PureBasicien
Inscription : 21-02-2020
Messages : 206

Re : Simulation - Comportement social

Tiens c'est spécial comme méthode de colorisation ça Naheulf.

Si le jeu de couleurs RGB formait un cube, ce serait comme le couper en 2, et lui enlever 1/4 de son volume.

Hors ligne



#7 26-04-2020 17:54:35

kwai chang caine
PureBasicien
Inscription : 18-02-2020
Messages : 64

Re : Simulation - Comportement social

Coool !!!! Super joli
Bon...on sait pas trop vu d'en haut et la rapidité du geste, si les boules sont plutôt familieres des Léporidés ou s'embrassent tout simplement...mais c'est rigolo à voir comme comportement cool

Mais dis donc OLLIVIER je rêve ou avec ton code t'es en hors-sujet dans le hors sujet mrgreen
Tu devrais être locké icon_lol icon_lol

Merci beaucoup pour ce partage et merci à MAHEUF pour avoir renouvelé la prouesse 50 ans après icon_eek
870x489_premiere-couleur.webp
https://www.francebleu.fr/infos/medias- … 1506624937

Ars a écrit :

ça fait très fourmis.

Mais alors qu'aurait bien bouffé pendant le confinement  mrgreen

Dernière modification par kwai chang caine (26-04-2020 17:58:02)

Hors ligne

#8 26-04-2020 19:48:17

~ Ar-S ~
Admin
Inscription : 17-02-2020
Messages : 178
Site Web

Re : Simulation - Comportement social

@KCC regarde les "Dinoponera grandis", tu vas flipper  mrgreen


~ Ar-S ~  babacool

Hors ligne

Pied de page des forums