Metaballs 2d (effet graphique de fusion, backbuffer)

Description

Voici un petit code qui fait des metaballs!
Mais qu'est-ce qu'une metaballe? Pour résumer, c'est des balles qui fusionnent entre elles lorsque elles sont proche l'une de l'autre (un peu comme une Lava-lamp)

A l'origine, c'est une classe pour dessiner des points, ligne et cercles en VB, dans un backbuffer (4 fois plus rapide que les méthode standard picture.line etc...)
Puis j'ai codé la "démo" MetaBalls, histoire de faire un benchmark :)

ATTENTION ! Dans le zip, vous trouverez 2 versions compilé. D'une part ce programme est 5 fois plus rapide lorsque il est compilé en natif, d'autre part en optimisant l'exe j'arrive a le rendre 7 fois plus rapide :)

Source / Exemple :


'Plutôt que de mettre l'ensemble du code de la source, voici juste le Kernel :

'==== Dessine une meta dans un DC donné ====
'MyMetas() est de type Long, (nummeta,xymeta)
'M_StartRender et M_StopRender sont des fonctions matrixbuffer
Public Function DrawMetaballsHere(MyDC As Long, xLeft As Long, yTop As Long, xWidth As Long, yHeight As Long, Diam As Long, Radius As Double, Couleur As Long, MyMetas() As Long)
M_StartRender xWidth, yHeight
Dim TotMeta As Long
Dim i As Long, j As Long, k As Long
Dim Distance As Long, Intensite As Long
Dim Prc1 As Single, Prc2 As Single
TotMeta = UBound(MyMetas(), 1) - LBound(MyMetas(), 1)

For i = 0 To xWidth
    For j = 0 To yHeight
        For k = 1 To TotMeta
            Distance = Pytagore(Abs(MyMetas(k, 1) - i), Abs(MyMetas(k, 2) - j)) + 1
            Intensite = Intensite + CLng(Radius / (Distance / Diam))
        Next k
        If Intensite < 255 Then
            Prc1 = Intensite / 255
            Prc2 = 1 - Prc1
            MxBuf(i, j) = Cumul2Color(Couleur, Prc1, 0&, Prc2)
        Else
            MxBuf(i, j) = vbWhite
        End If
        Intensite = 0
    Next j
Next i

M_StopRender MyDC, 32, xLeft, yTop
End Function

'==== Sub Cumul2Color ====
Public Function Cumul2Color(Cl1 As Long, Prc1 As Single, Cl2 As Long, Prc2 As Single) As Long
'crée la couleur comprise entre Cl1 et Cl2 en fonction de Prc1
Static LTB1(1 To 4) As Byte
Static LTB2(1 To 4) As Byte
'1/ copie de la valeur des couleurs dans un tableau
RtlMoveMemory LTB1(1), Cl1, 4&
RtlMoveMemory LTB2(1), Cl2, 4&
'2/ calcul de la couleur résultante et renvoi
Cumul2Color = RGB(LTB1(3) * Prc1 + LTB2(3) * Prc2, LTB1(2) * Prc1 + LTB2(2) * Prc2, LTB1(1) * Prc1 + LTB2(1) * Prc2)
End Function

Conclusion :


les MàJ
- J'ai intégré des fonctions pour faire un benchmark du graphisme 2D GDI avec différentes méthodes.
- Le code dessinant les metaballes est séparé de la fonction calculant la position des metaballes (pour ceux qui voudraient codé un autre déplacement) (la source est celle ci-dessus)
- Le code dessinant les metaballes est amélioré
- Le form de démo dispose de scrollbar pour changer les paramètres des metaballes.
- Vous pouvez choisir la couleur des metaballs :)
- exes compilés en fast-code et en fast-code avec "advanced optimisation"

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.