'bicikli kerekerol lerepulo sarak milyen surusegben boritjak be a foldet.
'A legellenallast elhanyagoljuk.

n = 20

DIM x(n)
DIM y(n)
DIM x0(n)
DIM y0(n)
DIM vx(n)
DIM vy(n)
DIM joszog(100)
DIM kul(1000)
DIM hely(300)
pi = 3.14
r = 100
g = 10

RANDOMIZE TIMER

CLS
SCREEN 12
LOCATE 1, 1: PRINT "A roptavolsag a levalasi szog fuggvenyeben kul. sebessegekre"
LOCATE 4, 1: PRINT "sebesseg  -  jo szog"
FOR v = 5 TO 60 STEP 5
max = 0
FOR fi = 0 TO pi / 2 STEP .005
h = v * SIN(fi) / g
marha = r * SIN(fi)
mm = v * COS(fi)
er = (h ^ 2 + 2 * r * (1 - COS(fi)))
iksz = marha + mm * (h + SQR(er) / g)
PSET (fi * 300 + 100, 450 - iksz), v / 5
IF iksz > max THEN max = iksz: maxhely = fi
t$ = INKEY$: IF t$ <> "" THEN GOTO itt
NEXT fi
LOCATE v / 5 + 5, 1 + .5 * (ABS(SGN(v - 6)) - SGN(v - 6)): PRINT v; "        "; maxhely / pi * 180
NEXT v

cc: c$ = INKEY$
IF c$ = "" THEN GOTO cc

itt:
CLS
OPEN "sarhmax.dat" FOR INPUT AS #3
LOCATE 1, 1: PRINT "A jo levalasi szog a sebesseg fuggvenyeben  (0 < v < 100)"
LOCATE 2, 1: PRINT "Felso vonal: 90 fok"
LOCATE 3, 1: PRINT "Also vonal: 45 fok"
LOCATE 4, 1: PRINT "Osszehasonlitasul alatta ott egy 1/x fuggveny"

LINE (1, 700 - pi * 200)-(500, 700 - pi * 200)
LINE (1, 700 - pi * 100)-(500, 700 - pi * 100)

FOR i = 1 TO 100
INPUT #3, v, joszog(i)
PSET (v * 5, 700 - pi * 100 - 1000 / i), 12
PSET (v * 5, 700 - joszog(i) * 400), 10

NEXT i
CLOSE #3

ww: w$ = INKEY$
IF w$ = "" THEN GOTO ww


' az elmeleti gorbe kepzese

' Veszunk egy roptavhatart, ehhez megkeressuk azokat a szogeket,
' amelyekbol "eppen" oda ropul a sardarabka. Ezen szogek kulonbsege
' megmondja, hogy az adott roptavhatarig a sarak hanyada repul el.
' Ez egy csokkeno fuggveny. Ha "jobbrol indulva" derivaljuk,
' megkapjuk a surusegfv-t. Ez az elmeleti megfeleloje annak a
' tapasztalati szamlalonak, hogy "az x-tol x+dx-ig huzodo tartomanyba
' a sargolyok mekkora hanyada potyog bele.
' Modszer:

CLS
INPUT "    sebesseg (<60)"; v
LOCATE 1, 3: PRINT "Sarga: Szelessegfuggveny, azaz az illeto tavig elrepulo sarak reszaranya"
LINE (1, 400)-(600, 400)
LINE (1, 400)-(1, 1)

hatar = 2
balfi = 0
jobbfi = pi / 2
tav = pi / 2
ide:
IF ABS(balfi - jobbfi) < .001 THEN GOTO oda
balh = v * SIN(balfi) / g
pp = balh ^ 2 + 2 * r * (1 - COS(balfi)) / g
baliksz = r * SIN(balfi) + v * COS(balfi) * (balh + SQR(pp))
jobbh = v * SIN(jobbfi) / g
pp = jobbh ^ 2 + 2 * r * (1 - COS(jobbfi)) / g
jobbiksz = r * SIN(jobbfi) + v * COS(jobbfi) * (jobbh + SQR(pp))
IF baliksz < hatar THEN balfi = balfi + .001: GOTO ide
IF jobbiksz < hatar THEN jobbfi = jobbfi - .001: GOTO ide
tav0 = tav
tav = jobbfi - balfi
PSET (hatar, 400 - tav * 200), 14
kul(hatar / 2) = tav0 - tav
hatar = hatar + 2
GOTO ide

oda:

LOCATE 2, 3: PRINT "Piros: Surusegfuggveny, azaz az illeto tav kozelebe repulo sarak reszaranya"

FOR i = 2 TO hatar STEP 2
PSET (i, 400 - kul(i / 2) * 2000), 12
NEXT i

hh: h$ = INKEY$: IF h$ = "" THEN GOTO hh
CLS

l = 150
finomsag = 5
m = INT(85 * v / finomsag) + 1
dt = .05
megvan = 1
luk$ = "                                                                           "

FOR i = 1 TO n
y(i) = 401
NEXT i

RANDOMIZE TIMER

CIRCLE (r, 400 - l - r), r, 2
LINE (1, 401 - l)-(600, 401 - l), 6
LOCATE 27, 1: PRINT "Beesesi suruseg, elotte az elmeleti gorbe."
forog:


FOR i = 1 TO n

IF y(i) <= 400 - l THEN GOTO tovabb
IF vx(i) <= 0 THEN GOTO inditas
hely(INT((x(i) - r) / finomsag) + 1) = hely(INT((x(i) - r) / finomsag) + 1) + 1
osszes = osszes + 1
megvan = 0

inditas:
alfa = RND * pi / 2
y(i) = 400 - l - r * (1 - COS(alfa))
x(i) = r * (1 + SIN(alfa))
vx(i) = v * COS(alfa)
vy(i) = -v * SIN(alfa)

tovabb:

x(i) = x(i) + vx(i) * dt
y(i) = y(i) + vy(i) * dt + g / 2 * dt ^ 2
vy(i) = vy(i) + g * dt

PSET (x0(i), y0(i)), 0
PSET (x(i), y(i))
LOCATE 24, 1: PRINT osszes
x0(i) = x(i)
y0(i) = y(i)

IF INT(osszes / 20) <> osszes / 20 OR megvan = 1 THEN GOTO megtovabb
megvan = 1

FOR i = 17 TO 26
LOCATE i, 1: PRINT luk$
NEXT i

IF pup = 0 THEN GOTO nincspup

FOR i = 2 TO 16
LOCATE i, 5 + 70 * (pup - r) / (600 - r): PRINT "                           "
NEXT i
pup = 0

nincspup:
CIRCLE (r, 400 - l - r), r, 2
LINE (1, 401 - l)-(600, 401 - l), 6

LINE (r, 400)-(600, 400), 1
LINE (r, 400)-(r, 400 - l), 1

FOR j = 1 TO 120

a = r + j * finomsag
b = 400 - hely(j) / osszes * l * 40 / finomsag
c = r + (j - 1) * finomsag
d = 400 - hely(j - 1) / osszes * l * 40 / finomsag
LINE (a, 400)-(a, b), 4
IF j > 0 THEN LINE (a, b)-(c, d), 7
IF b < 400 - l AND pup = 0 THEN pup = a
NEXT j

FOR i = 2 TO hatar STEP 2
PSET (r + i, 400 - kul(i / 2) * 2000), 14
NEXT i

megtovabb:
NEXT i
a$ = INKEY$
IF a$ <> "" THEN GOTO mindjart

GOTO forog

mindjart:
END

