'OPEN "maxfek3.dat" FOR OUTPUT AS #1
'OPEN "maxhajt.dat" FOR OUTPUT AS #2
'OPEN "gurul3.dat" FOR OUTPUT AS #3
DIM t(100): DIM o(100): DIM oo(100)
DIM pal(15): DIM Piros(15): DIM Zold(15): DIM Kek(15)
DATA 0,5,11,28,45,54,63,62,57,51,42,36,31,27
DATA 24,31,41,50,54,59,63,54,43,34,27,23,20,17
'Ezek a terkep magassagi szinei. A feher azt jelenti, hogy a biciklista atlepte a hohatart.
Piros(15) = 63: Zold(15) = 63: Kek(15) = 63
pal(15) = 65536 * Kek(15) + 256 * Zold(15) + Piros(15)
FOR i = 1 TO 14: READ Piros(i): NEXT
FOR i = 1 TO 14: READ Zold(i): NEXT
FOR i = 1 TO 15: pal(i) = 65536 * Kek(i) + 256 * Zold(i) + Piros(i): NEXT
SCREEN 12
FOR n = 0 TO 15: PALETTE n, pal(n): NEXT

ikszkozep = 400: ipszkozep = 320
pi = 3.1415925#
hanyszorfelezzen = 10
fazistervonal = 4: helyfinomsag2 = 64: sebugras = .8
utszorzo = 1.5: sebszorzo = 15
alapszint = 10000
sulypmagassag = 1.2: tengelytav = 1.5: hatraules = .05
elsotav = tengelytav / 2 + hatraules
hatsotav = tengelytav / 2 - hatraules
gordeho = .002: tapeho = .3: legellteny = .005: g0 = 9.81
maxtelj = 3

DEF fns1 = 100
DEF fns2 = 200
'DEF fns1 = 100 + SIN(polarszog / 2) * 50
'DEF fns2 = 200 + SIN(polarszog / 2) * 100
'DEF fns1 = 80 / (1 + .5 * COS(polarszog))
'DEF fns2 = 140 / (1 + .5 * COS(polarszog))
'DEF fns1 = 100 / SQR(1 + 3 * SIN(polarszog) ^ 2)
'DEF fns2 = 200 / SQR(1 + 8 * SIN(polarszog) ^ 2)
'DEF fns1 = 150 / SQR(1 + 5 * COS(polarszog) ^ 2)
'DEF fns2 = 300 / SQR(1 + 8 * COS(polarszog) ^ 2)

'lejtotlen palyak
'DEF fnf = 0
'DEF fnf = (sugar - fns1) / 3 - 50
'DEF fnf = 2 ^ ((sugar - fns2) / 10) * 20 + 50
'DEF fnf = 2 ^ ((fns1 - sugar) / 10) * 20 + 2 ^ ((sugar - fns2) / 10) * 20
'DEF fnf = -SQR((fns1 - fns2) ^ 2 / 4 - (sugar - (fns1 + fns2) / 2) ^ 2)
'DEF fnf = -SQR((fns1 - fns2) ^ 2 - (sugar - (fns1 + fns2) / 2) ^ 2) + 70
'DEF fnf = -SQR((fns1 - fns2) ^ 2 - (sugar - (2 * fns1 + fns2) / 3) ^ 2) + 70
'DEF fnf = (sugar - fns1 + 1) ^ 1.5 / 30 - 50

'lejtos palyak
'DEF fnf = -polarszog * 30 + 50
'DEF fnf = -polarszog * 10 + sugar * .087 - 20
DEF fnf = -polarszog * 10 + 2 ^ ((sugar - fns2) / 10) * 30 + 30
'DEF fnf = -polarszog * 10 + 2 ^ ((fns1 - sugar) / 10) * 20 + 2 ^ ((sugar - fns2) / 10) * 20
'DEF fnf = -polarszog * 10 - SQR((fns1 - fns2) ^ 2 / 4 - (sugar - (fns1 + fns2) / 2) ^ 2 + 100) + 30
'DEF fnf = -polarszog * 10 - SQR((fns1 - fns2) ^ 2 - (sugar - (fns1 + fns2) / 2) ^ 2) + 100
'DEF fnf = -polarszog * 10 - SQR((fns1 - fns2) ^ 2 - (sugar - (2 * fns1 + fns2) / 3) ^ 2) + 100

SCREEN 12
CLS
FOR i = 0 TO 50
 polarszog = i * pi / 50
 IF INT(i / 5) = i / 5 THEN sugarszin = 15 ELSE sugarszin = 4
 sugarlepes = (fns2 - fns1) / 20
 FOR j = 0 TO 20
  sugar = fns2 - sugarlepes * j
  IF INT(j / 5) = j / 5 THEN polarszogszin = 12 ELSE polarszogszin = 8
  a = sugar * COS(polarszog): b = sugar * SIN(polarszog)
  IF fnf < alapszint THEN alapszint = fnf
  t = a + ikszkozep: o = ipszkozep - fnf - b * .4 - 100: oo = ipszkozep - b
  IF j > 0 THEN LINE (t - 200, o)-(t1 - 200, o1), sugarszin
  IF j > 0 AND sugarszin = 15 THEN LINE (t, oo)-(t1, oo1), 15
  IF i > 0 THEN LINE (t(j) - 200, o(j))-(t - 200, o), polarszogszin
  IF i > 0 AND polarszogszin = 12 THEN LINE (t(j), oo(j))-(t, oo), 15
  t(j) = t: o(j) = o: oo(j) = oo: t1 = t: o1 = o: oo1 = oo
 NEXT j
NEXT i

FOR i = 0 TO 200
 polarszog = i * pi / 200
 sugarlepes = (fns2 - fns1) / 100
 FOR j = 0 TO 100
  sugar = fns2 - sugarlepes * j
  IF sugar < fns1 THEN GOTO ujszog
  szint = fnf
  o$ = INKEY$: IF o$ <> "" THEN GOTO nearnyekolj
  szin = INT((szint - alapszint) / 5) + 1
  a = sugar * COS(polarszog): b = sugar * SIN(polarszog)
  t = a + ikszkozep: oo = ipszkozep - b
  PSET (t, oo), szin
nemszintvonal: NEXT j
ujszog: NEXT i

nearnyekolj:
DIM SHARED mouse AS INTEGER
DIM SHARED m1 AS INTEGER
DIM SHARED m2 AS INTEGER
DIM SHARED mx AS INTEGER
DIM SHARED my 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 = 8:  mx = 0: my = ipszkozep: CALL absolute(m1, m2, mx, my, mouse)
hany = 20
DIM x(hany): DIM y(hany)
DIM ujx(hany): DIM ujy(hany)
DIM ux(hany): DIM uy(hany)
DIM beszuras(hany)
m1 = 1: CALL absolute(m1, m2, mx, my, mouse)

eleje: '************* kirajzolja a palyat, felulnezetben *****************
mx = 500: my = 450: i = 1
AlappontotVar: ' ********** be lehet adni az utvonal vazlatat *************
'LOCATE 28, 2: PRINT "Lepeshossz: 1-9    Uj pont: Szokoz     Vege: Enter"
'x = 500: y = 450
' KEY(11) ON: KEY(12) ON: KEY(13) ON: KEY(14) ON
'i = 1

'innen:
'IF i > 1 THEN x = x(i - 1)
'IF i > 1 THEN y = y(i - 1)

'lepked:
'ON KEY(11) GOSUB fel
'ON KEY(12) GOSUB bal
'ON KEY(13) GOSUB jobb
'ON KEY(14) GOSUB le
'PSET (x, y), 15

'o$ = INKEY$
'IF VAL(o$) > 0 THEN ugras = VAL(o$)
'IF o$ = " " THEN GOTO kov
'IF o$ = CHR$(13) THEN n = i - 1: GOTO elore
'GOTO lepked

'fel: PSET (x, y), 0: y = y - ugras: RETURN
'bal: PSET (x, y), 0: x = x - ugras: RETURN
'jobb: : PSET (x, y), 0: x = x + ugras: RETURN
'le: PSET (x, y), 0: y = y + ugras: RETURN

'kov:
'IF x = x(i - 1) AND y = y(i - 1) THEN SOUND (2000), .1: GOTO lepked
'x(i) = x: y(i) = y
'IF i > 1 THEN LINE (x(i - 1), y(i - 1))-(x(i), y(i)), 5
'i = i + 1: GOTO innen

'elore:
'FOR i = 2 TO n: PSET (x(i), y(i)): NEXT i
IF i > 1 THEN mx = x(i - 1)
IF i > 1 THEN my = y(i - 1)

UjAlappontotVar:
m1 = 3: CALL absolute(m1, m2, mx, my, mouse)
o$ = INKEY$
IF m2 = 1 THEN GOTO MegneziAzUjAlappontot
IF o$ = CHR$(13) OR m2 = 3 THEN n = i - 1: GOTO FinomitasiLepes
m3 = mx: m4 = my
GOTO UjAlappontotVar

MegneziAzUjAlappontot:
IF (mx - x(i - 1)) ^ 2 + (my - y(i - 1)) ^ 2 < 100 THEN SOUND (1000), .1: GOTO UjAlappontotVar
' (nem szabad ket szomszedos pontnak tul kozel lenni)
IF i < 3 THEN GOTO NemKellElessegkorlatozas
IF (mx - x(i - 1)) * (x(i - 1) - x(i - 2)) + (my - y(i - 1)) * (y(i - 1) - y(i - 2)) <= 0 THEN SOUND (1000), .1: GOTO UjAlappontotVar
' (nem szabad tul meredek kanyart beadni az alappontokkal)

NemKellElessegkorlatozas:
x(i) = mx: y(i) = my
m1 = 2: CALL absolute(m1, m2, mx, my, mouse)
IF i > 1 THEN LINE (x(i - 1), y(i - 1))-(x(i), y(i)), 15
m1 = 1: CALL absolute(m1, m2, mx, my, mouse)
SOUND (2000), .1
i = i + 1
IF i > 20 THEN n = 20: GOTO FinomitasiLepes
GOTO AlappontotVar

FinomitasiLepes: ' ********* kirajzolja az eppen legfinomabb pontsort **********
finomitasszam = 0

' ********* felezomerolegesek szerkesztese **********
' felezomeroleges egyenlete fx * x + fy * y = s
' Az (fx,fy) vektor az elmozdulas vektora a megfelelo pontok kozott.
' A "bal" es "jobb" a ket szogfelezot jelenti.

FOR i = 3 TO n - 1
IF (x(i - 1) - x(i)) ^ 2 + (y(i - 1) - y(i)) ^ 2 < helyfinomsag2 THEN GOTO MarTulFinom
fx1bal = x(i) - x(i - 2): fy1bal = y(i) - y(i - 2)
fx2bal = x(i - 1) - x(i - 2): fy2bal = y(i - 1) - y(i - 2)
fx1jobb = x(i - 1) - x(i + 1): fy1jobb = y(i - 1) - y(i + 1)
fx2jobb = x(i) - x(i + 1): fy2jobb = y(i) - y(i + 1)
fx = x(i) - x(i - 1): fy = y(i) - y(i - 1)
x0 = (x(i) + x(i - 1)) / 2: y0 = (y(i) + y(i - 1)) / 2
ss = fx * x0 + fy * y0: 'a normalvektoros egyenlet konstans oldala

' ********* szogfelezok szerkesztese **********
' e vektor az i-edik szogfelezo iranyvektora
' a szogfelezok egyenlete ey * x - ex * y = t

exbal = fx1bal / SQR(fx1bal ^ 2 + fy1bal ^ 2) + fx2bal / SQR(fx2bal ^ 2 + fy2bal ^ 2)
eybal = fy1bal / SQR(fx1bal ^ 2 + fy1bal ^ 2) + fy2bal / SQR(fx2bal ^ 2 + fy2bal ^ 2)
exjobb = fx1jobb / SQR(fx1jobb ^ 2 + fy1jobb ^ 2) + fx2jobb / SQR(fx2jobb ^ 2 + fy2jobb ^ 2)
eyjobb = fy1jobb / SQR(fx1jobb ^ 2 + fy1jobb ^ 2) + fy2jobb / SQR(fx2jobb ^ 2 + fy2jobb ^ 2)
tbal = eybal * x(i - 2) - exbal * y(i - 2)
tjobb = eyjobb * x(i + 1) - exjobb * y(i + 1)

' az i-edik felezomerolegest (amely az i-edik pont elotti
' szakaszhoz tartozik) elmetsszuk az i-2-edik ill. az i+1-edik
' ponthoz tartozo szogfelezovel. A mtp-ok: g es h, egy nevezetes
' tetel szerint a korulirt korokon vannak. Az ilyen modon szerkesztett
' metszespont akkor nem egyertelmu, ha a haromszog, ami kore a kort
' irjuk, egyenlo szaru. Ezert erdemes megtiltani, hogy az utvazlat
' harom szomszedos alappontja derekszognel elesebb szoget hatarozzon meg.
' Az uj pont (u) a ket korivfelezo pont kozt van ugy, hogy az uj gorbulet
' a ket regi gorbulet atlaga legyen. Igy jon letre a finomitas.

k = fx * exbal + fy * eybal: l = fx * exjobb + fy * eyjobb
gx = (ss * exbal + fy * tbal) / k: gy = (ss * eybal - fx * tbal) / k
hx = (ss * exjobb + fy * tjobb) / l: hy = (ss * eyjobb - fx * tjobb) / l
p1 = SQR((gx - x0) ^ 2 + (gy - y0) ^ 2) * SGN((gx - x0) * fy - (gy - y0) * fx)
p2 = SQR((hx - x0) ^ 2 + (hy - y0) ^ 2) * SGN((hx - x0) * fy - (hy - y0) * fx)
tav = SQR(fx ^ 2 + fy ^ 2) / 2
IF p1 + p2 = 0 THEN finomitasszam = finomitasszam + 1: beszuras(finomitasszam) = i: ux(finomitasszam) = x0: uy(finomitasszam) = y0: GOTO FinomitoPontKiirasa
tenyezo = (p1 ^ 2 + tav ^ 2) * (p2 ^ 2 + tav ^ 2) / (p1 * p2 + tav ^ 2) / (p1 + p2)
IF tenyezo < 0 THEN pe = tenyezo + SQR(tenyezo ^ 2 - tav ^ 2)
IF tenyezo >= 0 THEN pe = tenyezo - SQR(tenyezo ^ 2 - tav ^ 2)
finomitasszam = finomitasszam + 1
ux(finomitasszam) = x0 + fy * pe / tav / 2
uy(finomitasszam) = y0 - fx * pe / tav / 2
beszuras(finomitasszam) = i
'azaz az i-edik regi pont ele a "finomitasszam"-adik uj pontot kell beszurni.

FinomitoPontKiirasa:
PSET (ux(finomitasszam), uy(finomitasszam))
MarTulFinom: NEXT i
IF finomitasszam = 0 THEN GOTO simitas

' ***********  uj pontok besorolasa ****************
hany = n + finomitasszam
REDIM ujx(hany): REDIM ujy(hany)
marbeszurt = 0
ujx(1) = x(1): ujy(1) = y(1): ujx(2) = x(2): ujy(2) = y(2)

FOR i = 3 TO n - 1
IF marbeszurt >= finomitasszam THEN GOTO EzNemBeszuras

VanMegBeszuras:
IF beszuras(marbeszurt + 1) <> i THEN GOTO EzNemBeszuras
ujx(i + marbeszurt) = ux(marbeszurt + 1)
ujy(i + marbeszurt) = uy(marbeszurt + 1)
marbeszurt = marbeszurt + 1

EzNemBeszuras:
ujx(i + marbeszurt) = x(i): ujy(i + marbeszurt) = y(i)
ujproba: NEXT i

NincsTobbBeszuras:
ujx(hany - 1) = x(n - 1): ujy(hany - 1) = y(n - 1)
ujx(hany) = x(n): ujy(hany) = y(n)
REDIM x(hany): REDIM y(hany): REDIM ux(hany): REDIM uy(hany): REDIM beszuras(hany)
n = hany
FOR j = 1 TO n: x(j) = ujx(j): y(j) = ujy(j): NEXT j
GOTO FinomitasiLepes

simitas:
FOR i = 1 TO n - 2: x(i) = x(i + 1): y(i) = y(i + 1): NEXT i
n = n - 2
'FOR i = 1 TO n - 1: x(i) = (x(i) + x(i + 1)) / 2: y(i) = (y(i) + y(i + 1)) / 2: NEXT i
'n = n - 1
DIM z(n)

'*************************************************************
'** lepesrol lepesre vegigmegy a vegleges finomitott gorben **
'*************************************************************

FOR j = 1 TO n
 sugar = SQR((x(j) - ikszkozep) ^ 2 + (y(j) - ipszkozep) ^ 2)
 IF x(j) = ikszkozep THEN polarszog = pi / 2: GOTO megvan1
 polarszog = ATN((ipszkozep - y(j)) / (x(j) - ikszkozep))
 IF polarszog < 0 THEN polarszog = polarszog + pi
megvan1: z(j) = fnf
NEXT j

regiviztav = SQR((x(1) - x(2)) ^ 2 + (y(1) - y(2)) ^ 2): i = 2

ujhely: 'terben tovabblep *************
sebesseg = 0
IF i = n THEN END

'************ pontbeli vizszintes gorbuletet szamol ****************
ujviztav = SQR((x(i) - x(i + 1)) ^ 2 + (y(i) - y(i + 1)) ^ 2)
sugar = SQR((x(i) - ikszkozep) ^ 2 + (y(i) - ipszkozep) ^ 2)
IF x(i) = ikszkozep THEN polarszog = pi / 2: GOTO megvan2
polarszog = ATN((ipszkozep - y(i)) / (x(i) - ikszkozep))
IF polarszog < 0 THEN polarszog = polarszog + pi
megvan2:

lejtoszog = ATN((z(i - 1) - z(i)) / regiviztav)
LOCATE 2, 1: PRINT "lejtofok:"; INT(lejtoszog / pi * 1800) / 10; "   "
a = sugar * COS(polarszog)
b = sugar * SIN(polarszog)
t = a + ikszkozep
o = ipszkozep - z(i) - b * .4 - 100
CIRCLE (t - 200, o), 2, 15
CIRCLE (x(i), y(i)), 2, 15
ikszbalra = x(i) + (y(i) - y(i - 1)) / regiviztav
ipszbalra = y(i) - (x(i) - x(i - 1)) / regiviztav
sugar = SQR((ikszbalra - ikszkozep) ^ 2 + (ipszbalra - ipszkozep) ^ 2)
IF ikszbalra = ikszkozep THEN polarszog = pi / 2: GOTO megvan3
polarszog = ATN((ipszkozep - ipszbalra) / (ikszbalra - ikszkozep))
IF polarszog < 0 THEN polarszog = polarszog + pi
megvan3: zbalra = fnf
oldalszog = ATN(z(i) - zbalra)
LOCATE 3, 1: PRINT "oldalfok="; INT(oldalszog / pi * 1800) / 10; "   "
'pozitiv, ha balra van a volgy
vizvekszorzat = (x(i) - x(i - 1)) * (y(i + 1) - y(i)) - (y(i) - y(i - 1)) * (x(i + 1) - x(i))
vizszinusz = -vizvekszorzat / (regiviztav * ujviztav)
'az arc sin fv-t Taylor-sorral tudjuk csak kiszamolni
vizszog = 0
FOR j = 0 TO 10
 tag = 1 / (2 * j + 1) * vizszinusz ^ (2 * j + 1)
 FOR jj = 1 TO j: tag = tag * (2 * jj - 1) / (2 * jj): NEXT jj
 vizszog = vizszog + tag:
NEXT j
vizszgorb = vizszog / (regiviztav + ujviztav) * 2
' (az ivhossz, a gorbuleti sugar es a kozepponti szog kozti
' s=R*fi kepletbol). A gorbulet pozitiv, ha balra kanyarodik.
LOCATE 5, 1: PRINT "vizszgorb: "; INT(vizszgorb * 10000) / 10000; "   "

'************ pontbeli fuggoleges gorbuletet szamol ******************
regitav = SQR(regiviztav ^ 2 + (z(i - 1) - z(i)) ^ 2): s = s + regitav
vetulet = ((x(i + 1) - x(i)) * (x(i) - x(i - 1)) + (y(i + 1) - y(i)) * (y(i) - y(i - 1))) / regiviztav
ferdevetulet = SQR(vetulet ^ 2 + (z(i) - z(i + 1)) ^ 2)
fuggvekszorzat = regiviztav * (z(i + 1) - z(i)) - (z(i) - z(i - 1)) * vetulet
fuggszinusz = fuggvekszorzat / (regitav * ferdevetulet)
fuggszog = 0
FOR j = 0 TO 10
 tag = 1 / (2 * j + 1) * fuggszinusz ^ (2 * j + 1)
 FOR jj = 1 TO j: tag = tag * (2 * jj - 1) / (2 * jj): NEXT jj
 fuggszog = fuggszog + tag:
NEXT j
fuggorb = fuggszog / (regitav + ferdevetulet) * 2
LOCATE 4, 1: PRINT "fuggorb: "; INT(fuggorb * 10000) / 10000; "   "
'pozitiv, ha godron megy at.
regiviztav = ujviztav

'******************************************************************
MaxBiztFekerotSzamol: '********************************************
'******************************************************************

ujsebesseg: ' *********** tovabblep a fazisdiagramon v-vel **************
o$ = INKEY$: IF o$ <> "" THEN END
sebesseg = sebesseg + sebugras
IF sebesseg > 20 THEN i = i + 1: GOTO ujhely
'megallapitja azt az eroosszegt, amelyre eloszor szamolhato
'a hatso kritikus fekero.
g = g0 * COS(lejtoszog) + sebesseg ^ 2 * fuggorb
IF g <= 0 THEN i = i + 1: GOTO ujhely
dolesszog = ATN(sebesseg ^ 2 * vizszgorb / g): 'pozitiv, ha balra dol
'***** megkeresi a hatso fekero legjobboldalibb helyet.
nyomoero = g * COS(oldalszog) + sebesseg ^ 2 * vizszgorb * SIN(oldalszog)
eroosszeg = tapeho * nyomoero / 2: korrekcio = eroosszeg / 2
FOR j = 1 TO hanyszorfelezzen
 GOSUB Elojelek
 IF hatsokritfek2 > 0 THEN eroosszeg = eroosszeg + korrekcio ELSE eroosszeg = eroosszeg - korrekcio
 korrekcio = korrekcio / 2
NEXT j
eroosszeg = eroosszeg - korrekcio * 2
'(a biztonsag kedveert, hatha az utolso lepesevel tilos tartomanyba tevedt)
GOSUB Elojelek
IF hatsokritfek2 < 0 OR elsokritfek2 < 0 THEN maxfekero = -1: GOTO MaxBiztHajtoerotSzamol
IF eroosszeg < SQR(elsokritfek2) THEN maxfekero = eroosszeg: GOTO MaxBiztHajtoerotSzamol
'ha a legnagyobb fekerot a tiszta elso fekezes adja, akkor nem kell
'a csuszasvonalak metszespontjat keresni; ellenkezo esetben a metszespont
'adja a max biztonsagos fekerot.

'***** felezo gyokkereses a csuszasvonalak metszespontjahoz,
'***** az iment kiszamitott jobb oldali hatartol kezdve.
eroosszeg = eroosszeg / 2: korrekcio = eroosszeg / 2
FOR j = 1 TO hanyszorfelezzen
 GOSUB Elojelek
 IF eroosszeg < SQR(elsokritfek2) + SQR(hatsokritfek2) THEN eroosszeg = eroosszeg + korrekcio ELSE eroosszeg = eroosszeg - korrekcio
 'elso eset: a mtp-tol jobbra vagyunk
 'masodik eset: a mtp-tol balra vagyunk
 korrekcio = korrekcio / 2
NEXT j
maxfekero = eroosszeg

'******************************************************************
MaxBiztHajtoerotSzamol: ' *****************************************
'******************************************************************

' *** Lehetseges, hogy a hatso kerek nem porog ki, hanem a bicikli
' *** felagaskodik. Megkeresi ezt a pontot.
eroosszeg = -tapeho * nyomoero / 2: korrekcio = eroosszeg / 2
FOR j = 1 TO hanyszorfelezzen
 GOSUB Elojelek
 IF elsokritfek2 > 0 THEN eroosszeg = eroosszeg + korrekcio ELSE eroosszeg = eroosszeg - korrekcio
 korrekcio = korrekcio / 2
NEXT j
eroosszeg = eroosszeg - korrekcio * 2
'(a biztonsag kedveert, hatha az utolso lepesevel tilos tartomanyba tevedt)
GOSUB Elojelek
IF hatsokritfek2 < 0 OR elsokritfek2 < 0 THEN maxhajtoero = -1: GOTO MegvannakAzErok
IF eroosszeg + SQR(hatsokritfek2) > 0 THEN maxhajtoero = -eroosszeg: GOTO MegvannakAzErok

' *** Megnezi, hogy a felagaskodasi pontban a hatso kerek nem porgott-e ki.
' *** Ha igen, akkor megkeresi ezt a pontot.
eroosszeg = eroosszeg / 2: korrekcio = eroosszeg / 2
FOR j = 1 TO hanyszorfelezzen
 GOSUB Elojelek
 IF eroosszeg + SQR(hatsokritfek2) > 0 THEN eroosszeg = eroosszeg + korrekcio ELSE eroosszeg = eroosszeg - korrekcio
 korrekcio = korrekcio / 2
NEXT j
maxhajtoero = -eroosszeg
IF ABS(maxhajtoero) > maxtelj / sebesseg THEN maxhajtoero = -maxtelj / sebesseg

MegvannakAzErok: ' ***** elmegy es egyszerre kirja oket a fazisterre *****
GOSUB FazisteretRajzol
GOTO ujsebesseg

'******************************************************************
Elojelek: '********************************************************
'******************************************************************

elsofugg = g / tengelytav * (hatsotav + gordeho * COS(dolesszog) * sulypmagassag) + eroosszeg * COS(dolesszog) * sulypmagassag / tengelytav
hatsofugg = g / tengelytav * (elsotav - gordeho * COS(dolesszog) * sulypmagassag) - eroosszeg * COS(dolesszog) * sulypmagassag / tengelytav
elsovizsz = (eroosszeg + gordeho * g) * SIN(dolesszog) * sulypmagassag / tengelytav + (sebesseg * COS(lejtoszog)) ^ 2 * vizszgorb * hatsotav / tengelytav
hatsovizsz = -(eroosszeg + gordeho * g) * SIN(dolesszog) * sulypmagassag / tengelytav + (sebesseg * COS(lejtoszog)) ^ 2 * vizszgorb * elsotav / tengelytav
nyomase = elsofugg * COS(oldalszog) + elsovizsz * SIN(oldalszog)
nyomash = hatsofugg * COS(oldalszog) + hatsovizsz * SIN(oldalszog)
ferdeoldale = -elsofugg * SIN(oldalszog) + elsovizsz * COS(oldalszog)
ferdeoldalh = -hatsofugg * SIN(oldalszog) + hatsovizsz * COS(oldalszog)
elsokritfek2 = SGN(nyomase) * (tapeho * nyomase) ^ 2 - ferdeoldale ^ 2
hatsokritfek2 = SGN(nyomash) * (tapeho * nyomash) ^ 2 - ferdeoldalh ^ 2
RETURN

'***********************************************************
FazisteretRajzol:   '***************************************
'***********************************************************
'nem felulnezeti, hanem valodi sebessegek es utak

LOCATE 1, 1: PRINT "maxfekero/umg="; INT(maxfekero / nyomoero / tapeho * 1000) / 1000; "    "
gurulogyors = g0 * SIN(lejtoszog) - legellteny * sebesseg ^ 2
guruloiranyszog = ATN(gurulogyors / sebesseg * sebszorzo / utszorzo)

fekez:
IF maxfekero < 0 THEN GOTO hajt
mingyors = gurulogyors - maxfekero
miniranyszog = ATN(mingyors / sebesseg * sebszorzo / utszorzo)
LINE (s * utszorzo, 451 - sebesseg * sebszorzo)-(s * utszorzo + fazistervonal * COS(miniranyszog), 451 - sebesseg * sebszorzo - fazistervonal * SIN(miniranyszog)), 4
'WRITE #1, -100, -100
'WRITE #1, s * utszorzo, sebesseg * sebszorzo - 1
'WRITE #1, s * utszorzo + fazistervonal * COS(miniranyszog), sebesseg * sebszorzo + fazistervonal * SIN(miniranyszog) - 1

hajt:
IF maxhajtoero < 0 THEN GOTO gurul
maxgyors = gurulogyors + maxhajtoero
maxiranyszog = ATN(maxgyors / sebesseg * sebszorzo / utszorzo)
LINE (s * utszorzo, 449 - sebesseg * sebszorzo)-(s * utszorzo + fazistervonal * COS(maxiranyszog), 449 - sebesseg * sebszorzo - fazistervonal * SIN(maxiranyszog)), 7
'WRITE #2, -100, -100
'WRITE #2, s * utszorzo, sebesseg * sebszorzo + 1
'WRITE #2, s * utszorzo + fazistervonal * COS(maxiranyszog), sebesseg * sebszorzo + fazistervonal * SIN(maxiranyszog) + 1

gurul:
LINE (s * utszorzo, 450 - sebesseg * sebszorzo)-(s * utszorzo + fazistervonal * COS(guruloiranyszog), 450 - sebesseg * sebszorzo - fazistervonal * SIN(guruloiranyszog)), 10
'WRITE #3, -100, -100
'WRITE #3, s * utszorzo + fazistervonal * COS(guruloiranyszog), sebesseg * sebszorzo + fazistervonal * SIN(guruloiranyszog)
'WRITE #3, s * utszorzo, sebesseg * sebszorzo
RETURN

e:
'CLOSE #1: CLOSE #2: CLOSE #3

