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