SCREEN 12
CLS

'DIM SHARED mouse AS INTEGER
'DIM SHARED m1 AS INTEGER
'DIM SHARED m2 AS INTEGER
'DIM SHARED m3 AS INTEGER
'DIM SHARED m4 AS INTEGER

' DEF SEG = 0
' MSEG = 256 * PEEK(51 * 4 + 3) + PEEK(51 * 4 + 2)
' mouse = 256 * PEEK(51 * 4 + 1) + PEEK(51 * 4) + 2
' DEF SEG = MSEG
' m1 = 3: CALL absolute(m1, m2, m3, m4, mouse)
' mx = m3
' my = m4

xu = -100: yu = -100
DIM x(50): DIM y(50)
DIM xtkp(50): DIM ytkp(50)
DIM omega(50)
DIM vxtkp(50): DIM vytkp(50)
DIM fi(50)
DIM l(50)
DIM r(50)
DIM m(50)
DIM valasztek(12)
DIM szin(50)
pi = 3.1415926536#
iksz = 600
ipszilon = 450

RANDOMIZE TIMER
n = 2 * INT(RND * 13) + 15
dt = .03 * SQR(n)
'g = 2

FOR i = 1 TO 12
valasztek(i) = i
NEXT i

FOR i = 1 TO (n - 1) / 2
szin(i) = i - 7 * INT(i / 7) + 9
szin(n - i) = szin(i)
NEXT i

FOR i = 1 TO (n - 1) / 2
xtkp(i) = (i - 5 * INT(i / 5)) * 100 + 50
ytkp(i) = INT(i / 5) * 80 + 100
omega(i) = RND * .6 - .3
vxtkp(i) = RND * 36 - 16: vytkp(i) = RND * 36 - 16
l(i) = (RND * 30 + 20)
r(i) = l(i) / 2
m(i) = r(i) ^ 2 / 1000
fi(i) = pi / 2: fi(n - i) = -pi / 2
xtkp(n - i) = xtkp(i): ytkp(n - i) = ytkp(i)
omega(n - i) = omega(i)
vxtkp(n - i) = vxtkp(i): vytkp(n - i) = vytkp(i)
l(n - i) = l(i)
r(n - i) = r(i)
m(n - i) = m(i)
NEXT i

kiiras: ' ************** K I I R A S  *********************

d$ = INKEY$
IF d$ <> "" THEN END

FOR i = 1 TO (n - 1) / 2
CIRCLE (x(i), ipszilon - y(i)), r(i), 0
CIRCLE (x(n - i), ipszilon - y(n - i)), r(i), 0
xtkp(i) = xtkp(i) + vxtkp(i) * dt: ytkp(i) = ytkp(i) + vytkp(i) * dt - g / 2 * dt ^ 2
xtkp(n - i) = xtkp(i): ytkp(n - i) = ytkp(i)
fi(i) = fi(i) + omega(i) * dt
fi(n - i) = fi(n - i) + omega(n - i) * dt
vytkp(i) = vytkp(i) - g * dt
vytkp(n - i) = vytkp(i)

x(i) = xtkp(i) + l(i) / 2 * COS(fi(i))
x(n - i) = xtkp(i) + l(i) / 2 * COS(fi(n - i))
y(i) = ytkp(i) + l(i) / 2 * SIN(fi(i))
y(n - i) = ytkp(i) + l(i) / 2 * SIN(fi(n - i))
IF fi(i) > 2 * pi THEN fi(i) = fi(i) - 2 * pi
IF fi(i) < 0 THEN fi(i) = fi(i) + 2 * pi
IF fi(n - i) > 2 * pi THEN fi(n - i) = fi(n - i) - 2 * pi
IF fi(n - i) < 0 THEN fi(n - i) = fi(n - i) + 2 * pi

CIRCLE (x(i), ipszilon - y(i)), r(i), szin(i)
CIRCLE (x(n - i), ipszilon - y(n - i)), r(i), szin(i)
NEXT i


' ***************** UTKOZESVIZSGALAT *********************

' m1 = 3: CALL absolute(m1, m2, m3, m4, mouse)
' IF m2 <> 0 THEN END
'  IF m3 <> mx OR m4 <> my THEN END

FOR i = 1 TO n - 1

'********** utkozes a fallal *******************

IF y(i) < r(i) THEN GOSUB lent
IF x(i) < r(i) THEN GOSUB bal
IF y(i) > ipszilon - 60 - r(i) THEN GOSUB fent
IF x(i) > iksz - r(i) THEN GOSUB jobb

'******* utkozes egymassal **************

FOR j = i + 1 TO n - 1
IF j = n - i THEN GOTO tovabb: ' (nem utkozhet veluk)
r = r(i) + r(j)
dx = x(j) - x(i)
dy = y(j) - y(i)
tav = SQR(dx ^ 2 + dy ^ 2)
IF tav > r THEN GOTO tovabb: ' (messze vannak)

vyi = vytkp(i) + l(i) / 2 * omega(i) * COS(fi(i))
vxi = vxtkp(i) - l(i) / 2 * omega(i) * SIN(fi(i))
vyj = vytkp(j) + l(j) / 2 * omega(i) * COS(fi(j))
vxj = vxtkp(j) - l(j) / 2 * omega(j) * SIN(fi(j))
IF (vxj - vxi) * dx + (vyj - vyi) * dy >= 0 THEN GOTO tovabb: ' (tavolodnak)

arany = m(i) / m(j)

'                  utkozesi pont
xu = (r(j) * x(i) + r(i) * x(j)) / r
yu = (r(j) * y(i) + r(i) * y(j)) / r

'        vetuletek a kozos erinto egyenesere
xi = ((xtkp(i) - x(i)) * dy - (ytkp(i) - y(i)) * dx) / tav
xj = ((xtkp(j) - x(j)) * dy - (ytkp(j) - y(j)) * dx) / tav

vtkpxi = (vxtkp(i) * dy - vytkp(i) * dx) / tav
vtkpxj = (vxtkp(j) * dy - vytkp(j) * dx) / tav
vtkpyi = (vxtkp(i) * dx + vytkp(i) * dy) / tav
vtkpyj = (vxtkp(j) * dx + vytkp(j) * dy) / tav

szamlalo = 2 * (vtkpyj - vtkpyi) + xi * omega(i) - xj * omega(j)
nevezo = (xi / l(i)) ^ 2 + arany * (xj / l(j)) ^ 2 + arany + 1
ujvtkpyi = vtkpyi + szamlalo / nevezo
ujvtkpyj = vtkpyj + arany * (vtkpyi - ujvtkpyi)

omega(i) = omega(i) + 2 * xi * (vtkpyi - ujvtkpyi) / l(i) ^ 2
omega(j) = omega(j) + 2 * xj * (vtkpyj - ujvtkpyj) / l(j) ^ 2
omega(n - j) = omega(j)
omega(n - i) = omega(i)

vxtkp(i) = (vtkpxi * dy + ujvtkpyi * dx) / tav
vxtkp(j) = (vtkpxj * dy + ujvtkpyj * dx) / tav
vytkp(i) = (-vtkpxi * dx + ujvtkpyi * dy) / tav
vytkp(j) = (-vtkpxj * dx + ujvtkpyj * dy) / tav

vxtkp(n - i) = vxtkp(i)
vxtkp(n - j) = vxtkp(j)
vytkp(n - i) = vytkp(i)
vytkp(n - j) = vytkp(j)

tovabb: NEXT j
NEXT i

GOTO kiiras

lent: ' * * * * * * * * * * * * * * * * * * * * * * * * * *
c = vytkp(i) + l(i) / 2 * omega(i) * COS(fi(i))
IF c >= 0 THEN RETURN
viz = (x(n - i) - x(i)) / 2

k = vytkp(i)
vytkp(i) = k + l(i) ^ 2 * (omega(i) * viz - 2 * k) / (l(i) ^ 2 + viz ^ 2)
omega(i) = omega(i) + 2 * viz * (k - vytkp(i)) / l(i) ^ 2
omega(n - i) = omega(i)
vytkp(n - i) = vytkp(i)
RETURN

fent: ' * * * * * * * * * * * * * * * * * * * * * * * * * *

c = -vytkp(i) - l(i) / 2 * omega(i) * COS(fi(i))
IF c >= 0 THEN RETURN
viz = (x(i) - x(n - i)) / 2


k = -vytkp(i)
vytkp(i) = -k - l(i) ^ 2 * (omega(i) * viz - 2 * k) / (l(i) ^ 2 + viz ^ 2)
omega(i) = omega(i) + 2 * viz * (k + vytkp(i)) / l(i) ^ 2
omega(n - i) = omega(i)
vytkp(n - i) = vytkp(i)
RETURN

jobb: ' * * * * * * * * * * * * * * * * * * * * * * * * * *

c = -vxtkp(i) + l(i) / 2 * omega(i) * SIN(fi(i))
IF c >= 0 THEN RETURN
viz = (y(n - i) - y(i)) / 2


k = -vxtkp(i)
vxtkp(i) = -k - l(i) ^ 2 * (omega(i) * viz - 2 * k) / (l(i) ^ 2 + viz ^ 2)
omega(i) = omega(i) + 2 * viz * (k + vxtkp(i)) / l(i) ^ 2
omega(n - i) = omega(i)
vxtkp(n - i) = vxtkp(i)
RETURN

bal: ' * * * * * * * * * * * * * * * * * * * * * * * * * *

c = vxtkp(i) - l(i) / 2 * omega(i) * SIN(fi(i))
IF c >= 0 THEN RETURN
viz = (y(i) - y(n - i)) / 2


k = vxtkp(i)
vxtkp(i) = k + l(i) ^ 2 * (omega(i) * viz - 2 * k) / (l(i) ^ 2 + viz ^ 2)
omega(i) = omega(i) + 2 * viz * (k - vxtkp(i)) / l(i) ^ 2
omega(n - i) = omega(i)
vxtkp(n - i) = vxtkp(i)
RETURN

