ich habe den bekannten Metaball-Algorithmus auf einer ebene (2d) angewandt. Das Programm zeichnet Kreise, die ineinander übergehen.
Es werden 10 Metaballs auf zufälligen Positionen erzeugt, die mit den anderen interagieren.
Man kann einen MetaBall zur interaktion mit der Maus direkt bewegen.
Eventuell könnt iher es in einem Spiel oder einer Demo oder sonstwas mit einsetzen, aber nehmt mich bitte mit in den Credits mit auf.
Code: Alles auswählen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Fehler!","Konnte DirectX 7.0 nicht initialisieren!")
End
EndIf
If OpenScreen(800,600,32,"Metaball 2D") = 0
MessageRequester("Fehler!","Konnte einen 800x600 32 bit farbtiefe bildschirm nicht öffnen!")
End
EndIf
;ll für einen metaball
Structure Metaball
x.l
y.l
starke.f
EndStructure
NewList metaball.Metaball()
;Structure für die einstellungen
Structure einstellungen
pegel.f ;ist der niveau pegel zum anzeigen
x.l ;ist der rederbereich...
y.l
mausstarke.f ;ist die stärke des Maus-Metaball's...
EndStructure
Global einstellungen.einstellungen
;Procedure für den 2d abstand:
Procedure asd(x1.l,y1.l,x2.l,y2.l)
x = x1 - x2
y = y1 - y2
ProcedureReturn x*x+y*y
EndProcedure
einstellungen\x = 200
einstellungen\y = 200
einstellungen\pegel = 2
einstellungen\mausstarke = 100
;~ tzene kreieren:
For _=0 To 10
AddElement(metaball())
metaball()\x = Random(einstellungen\x)
metaball()\y = Random(einstellungen\y)
metaball()\starke = 100 + Random(100)
Next
Repeat
If ExamineMouse() <> 0
mausx.l = MouseX()
mausy.l = MouseY()
EndIf
If StartDrawing(ScreenOutput()) <> 0
For x = 1 To einstellungen\x
For y = 1 To einstellungen\y
pegel.f = 0
ForEach metaball()
pegel + 1/asd(x,y,metaball()\x,metaball()\y)*metaball()\starke
Next
pegel + 1/asd(x,y,mausx,mausy) *einstellungen\mausstarke
If pegel > einstellungen\pegel
Plot(x,y,RGB(255,0,0))
EndIf
Next
Next
Stopdrawing()
EndIf
FlipBuffers()
ClearScreen(0,0,0)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
exit = 1
EndIf
Until exit = 1