Option Explicit Dim i, j, n, pontok As Byte Dim lepes, db_lepes, valogatas As Integer Dim x, y, u, sulyok(), pont() As Single ' pont(0-5;0-3) -> 6 db pont; 0, 1 -> x, y koordináták ' 2, 3 -> x, y irányú sebességkomponensek ' sulyok(0-5;0-1;0-74) -> 6 db pont; 75 db suly; 0 -> érték ' 1 -> ha (érték>0.0001) akkor j, egyébként 0 ' billentyűparancs definiálása Sub Form_KeyDown(ascii As Integer, Shift As Integer) Select Case ascii Case vbKeyEscape: Unload Me End Select End Sub Sub form_click() Unload Me End Sub Sub Form_Activate() With Form1 .ScaleWidth = 500 .ScaleHeight = 500 End With ' Bézier-súlyfüggvények kiszámolása j db esetre pontok = 12 ' 0 és 171 már hibát okozna db_lepes = 15 * pontok ReDim Preserve sulyok(pontok, 1, db_lepes), pont(pontok, 3) For j = 0 To pontok For lepes = 0 To db_lepes sulyok(j, 0, lepes) = suly(lepes / db_lepes, pontok, j) Next Next ' kis súlyok eliminációjának előkészítése For lepes = 0 To db_lepes valogatas = 0 For j = 0 To pontok If sulyok(j, 0, lepes) > 0.001 Then sulyok(valogatas, 1, lepes) = j ' Debug.Print lepes, j, valogatas, sulyok(j, 0, lepes), sulyok(valogatas, 1, lepes) valogatas = valogatas + 1 End If Next Next ' támpontok kezdőértékének generálása Randomize For i = 1 To pontok - 1 pont(i, 0) = Int(500 * Rnd) pont(i, 1) = Int(500 * Rnd) ujra: pont(i, 2) = Rnd pont(i, 3) = (1 - (pont(i, 2) ^ 2)) ^ 0.5 If Abs(pont(i, 2) - pont(i, 3)) > 0.6 Then GoTo ujra If Rnd > 0.5 Then pont(i, 2) = -pont(i, 2) If Rnd > 0.5 Then pont(i, 3) = -pont(i, 3) Next End Sub ' 0.02 másodpercenként lefutó parancsok, amik mozgásérzetet keltenek Sub Timer1_Timer() Form1.Cls For i = 1 To pontok - 1 pont(i, 0) = pont(i, 0) + 5 * pont(i, 2) ' az x sebessége 5 * -ös pont(i, 1) = pont(i, 1) + 5 * pont(i, 3) ' az y sebessége 5 * -ös If pont(i, 0) > 500 Or pont(i, 0) < 0 Then pont(i, 2) = -pont(i, 2) If pont(i, 1) > 500 Or pont(i, 1) < 0 Then pont(i, 3) = -pont(i, 3) Next For i = 0 To 1 pont(0, i) = (pont(1, i) + pont(pontok - 1, i)) / 2 pont(pontok, i) = pont(0, i) Next rajzolas End Sub ' aktuális koordiánáták súlyozása, utána rajzolás Sub rajzolas() Form1.CurrentX = pont(0, 0): Form1.CurrentY = pont(0, 1) For lepes = 0 To db_lepes lepes = lepes + Int((db_lepes / 2 - Abs(lepes - db_lepes / 2) + 10) / 40) y = 0: x = 0: valogatas = 0 Do x = x + sulyok(sulyok(valogatas, 1, lepes), 0, lepes) * pont(sulyok(valogatas, 1, lepes), 0) y = y + sulyok(sulyok(valogatas, 1, lepes), 0, lepes) * pont(sulyok(valogatas, 1, lepes), 1) valogatas = valogatas + 1 If valogatas = pontok + 1 Then Exit Do Loop Until sulyok(valogatas, 1, lepes) = 0 Form1.Line -(x, y), RGB((255 * Rnd), (255 * Rnd), (255 * Rnd)) Next ' For i = 0 To pontok ' Form1.Circle (pont(i, 0), pont(i, 1)), 1, QBColor(15) ' Next End Sub ' faktoriális függvény Function fakt(szam) i = szam fakt = 1 If szam < 1 Then Exit Function Do Until i = 0 fakt = fakt * i i = i - 1 Loop End Function ' a Bézier-súlyfüggvény Function suly(u, n, i) If n < i Then Exit Function suly = (fakt(n) / (fakt(i) * fakt(n - i))) * (u ^ i) * ((1 - u) ^ (n - i)) End Function