'          A program gombnyomassal leallithato.

' Egy ellipszist valamilyen mintazattal kitoltunk. A mintazatot
' ellipszis-szeru, helyenkent horpadozo vagy kidudorodo pontsorok
' alkotjak, nehol vonallal osszekotve.
' A vonalak pontsorokka szakadozhatnak, ha tul kozel kerulnek egymashoz.

alfa = 1                  ' az ellipszis ferditesenek szoge (radian)
rmax = 150                ' az ellipszis fel (kis)tengelye
torz = 1.6                ' mennyire nyujtott az ellipszis
pontsortav = .6           ' (*** = erdemes valtoztatgatni)
vonalsuruseg = 9          ' *** (minel nagyobb, annal hajlamosabbak lesznek
                          ' a kozeli vonalak pontsorokka szakadozni)
torespontsuruseg = .003   ' *** a szomszedos pontjok SZOGelterese
                          ' a kozeppontbol nezve, kifele haladva ritkul
szogatfedes = 1.001       ' Hanyszorosan fedje at magat az ellipszis.
                          ' Ezt az alaperteket az elozo suruseg novelheti.
pi = 3.14159265#
ketpi = 2 * pi

'A torespontok szog szerinti surusege hogyan valtozzon kifele haladva.
'Kisebb szam = surubb pontok
DEF fnr = (.05 + rmax / LOG(ABS(r) + 2) * .02) ^ 1
'DEF fnr =(.05 + rmax / abs(r) * .5) ^ 1




'A kitolto-mintazat fuggvenye. A fi polarszoghoz rendeli az illeto sugarat.
'Celszeru periodikus fuggvenyt kesziteni, a novekvo fvek ujjlenyomatszeruek.
'Az elojelvalto fuggvenyek nem toltik ki az ellipszist, es a 0 kozeleben
'hosszu ideig szoszmotolnek. Itt a bizt. kedveert a program 0 fole
'tornassza a fv erteket. *** Erdemes a fv-eket is valtoztatni, kiserletezni.



'eltolas = pi / 15
eltolas = 0
'Ha ez nulla, akkor az abrazolas kezdohelye (fi=0) a (kis)tengelyen lesz.




'  ***             nem periodikus (pl. novekvo) fuggvenyek:

'DEF fnfi = 13 - 2 * ABS(fi - eltolas - pi)
'DEF fnfi = 3 + 3 * ABS(fi - eltolas - pi)
'DEF fnfi = 3 * ABS(LOG((fi - eltolas) + 1)) + 2
'DEF fnfi = (fi - eltolas) ^ 2 + 3
'DEF fnfi = 5 * (fi - eltolas) + 3
'DEF fnfi = 15 * 3 ^ (-((fi - eltolas - pi) ^ 2 / 6))
'DEF fnfi = -9 * 3 ^ (-((fi - eltolas - pi) ^ 2 / 6)) + 11
'DEF fnfi = -9 * 3 ^ (-((fi - eltolas - pi + 2) ^ 2 / 6)) + 11
'DEF fnfi = 3 * ((fi - eltolas) / pi * 5 - INT((fi - eltolas) / pi * 5)) + 2
'DEF fnfi = 6 * ABS(ABS(ABS(ABS((fi - eltolas) - pi) * 3 - 2) - 2) - 2) + 5






'Kvaziperiodikus fv-ek: trig. fv. az argumentumaban egy szog szerint torzito
'hatvanyfuggvennyel konjugalva, utana egy masik fuggvennyel szorozva.


'                  ***  tagoltsag: hany gerezd legyen az abraban
RANDOMIZE TIMER
tag = 5
'tag = INT(RND * 5) + 2


'                      ***      a segedfv-ek parameterei
kitevo = 2.3
szelesseg = ketpi * .3
eltolas2 = ketpi * .5


'DEF fnszorzo = 1
DEF fnszorzo = 2 ^ (-((fi - eltolas2) / szelesseg) ^ 2)
'DEF fnszorzo = 2 - ABS(fi - eltolas2) / szelesseg + .1 + ABS(2 - ABS(fi - eltolas2) / szelesseg - 1)




'Az elso torzitofv. gondoskodik a zarodo vonalakrol periodikus fv-ek eseten.

DEF fntorz = tag * (fi - eltolas)
'DEF fntorz = tag * (fi - eltolas) ^ kitevo / ketpi ^ (kitevo - 1)

'DEF fnfi = 8.5 + 5 * COS(fntorz) * fnszorzo
DEF fnfi = (9 - 8 * ABS(COS(fntorz) / 2)) * fnszorzo + 2
'DEF fnfi = (7.5 + 5 * SIN(fntorz)) * fnszorzo + 2
'DEF fnfi = (5.5 + 5 * COS(fntorz)) * fnszorzo + 2
'DEF fnfi = 5 * (SIN(tag * (fntorz)) + 3) * fnszorzo + 2
'DEF fnfi = (ABS(SIN(fntorz / 2)) + 2) * fnszorzo + 2
'DEF fnfi = (19 * (ABS((fi - eltolas) / pi * tag / 2 - INT((fi - eltolas) / pi * tag / 2) - .5)) + 2) * fnszorzo + 2
'DEF fnfi = (19 * (ABS(fntorz / pi / 2 - INT(fntorz / pi / 2) - .5)) + 2) * fnszorzo + 2
'DEF fnfi = 13 * (ABS((fi - eltolas) ^ kitevo / ketpi ^ (kitevo - 1) / pi * tag / 2 - INT((fi - eltolas) ^ kitevo / ketpi ^ (kitevo - 1) / pi * tag / 2) - .5)) + 2


'               szabalyos sokszog: ez nem lehet ketretu

'DEF fnfi = 11 * COS(pi / (tag + 1)) / COS(fi - eltolas - ABS(INT((tag + 1) * (fi - eltolas) / ketpi + .5) * ketpi / (tag + 1)))

'               szinek

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) = 22: Zold(15) = 22: Kek(15) = 22
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

CLS
szin(0) = 1
szin(1) = 2
szin(2) = 3
szin(3) = 4
szin(4) = 5

'               a kezdeti kiserletezesek atugrasa
GOTO vege5

' **********************************************************************

'               szabvanykor

CIRCLE (100, 100), rmax


'               fuggvenykor x-y koordinatakban

FOR i = -rmax TO rmax
j = SQR(rmax * rmax - i * i)
PSET (100 + i, 205 + j)
PSET (100 + i, 205 - j)
NEXT i


'               fuggvenykor polarkoordinatakban

FOR fi = 0 TO ketpi STEP .01
FOR r = rmax TO rmax
x = r * COS(fi)
y = r * SIN(fi)
PSET (100 + x, 310 + y)
NEXT r
NEXT fi



'               ellipszis x-y koordinatakban

FOR i = -rmax TO rmax
j = torz * SQR(2500 - i * i)
PSET (205 + i, 205 + j)
PSET (205 + i, 205 - j)
NEXT i


'               ellipszis polarkoordinatakban

FOR fi = 0 TO ketpi STEP .01
FOR r = rmax TO rmax
x = r * COS(fi)
y = torz * r * SIN(fi)
PSET (205 + x, 310 + y)
NEXT r
NEXT fi


'               ferde ellipszis

FOR fi = 0 TO ketpi STEP .01
FOR r = rmax TO rmax
x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
PSET (310 + x, 310 + y)
NEXT r
NEXT fi

'               sugarasan kitoltott ferde ellipszis

FOR fi = 0 TO ketpi STEP .03
FOR r = 0 TO rmax STEP 1.6
x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
PSET (415 + x, 115 + y), 9
NEXT r
PSET (415 + x, 115 + y)
NEXT fi





vege:
'Sugariranyban kitoltott ferde ellipszis, de a sugardarabok
'kifele haladva megsokasodnak, ami elagazasos jelleget ad az abranak.
'A sokasodas mikentjet az itteni r |-> filepes (csokkeno) fvek adjak meg.

FOR r = 0 TO rmax + .1 STEP 2
'lepes = ketpi / 10 / LOG(r + 2)
'lepes = ketpi / 1 / (r + 2)
'lepes = ketpi / 20 / (INT(r / 10) + 1)
'lepes = ketpi / 10 / (INT(LOG(r + 2) / LOG(2)) + 1)
'lepes = ketpi / 1 / (2 ^ (INT(LOG(r + 2) / LOG(1.8)) + 1))
lepes = ketpi / 9 / INT(2 ^ (r / 25) + 1)
IF r > rmax THEN lepes = .01

FOR fi = 0 TO ketpi * 1.05 STEP lepes
x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
'IF fi = 0 THEN regix = x: regiy = y
PSET (315 + x, 215 + y), 15 + (SGN(r - rmax + .1)) * 6
'LINE (315 + regix, 215 + regiy)-(315 + x, 215 + y), 9
'regix = x: regiy = y
NEXT fi
NEXT r

END






vege2:
'       Valamely polarfuggveny szerint lepkedve, de sugarasan haladva
'       es osszekotes nelkul tolti ki az ellipszist.

FOR fi = 0 TO ketpi * 1.05 STEP .3
k = 0
kijjebblep:
k = k + 1
r = fnfi * k
IF r > rmax THEN GOTO ujfi

x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
PSET (315 + x, 215 + y), 9
GOTO kijjebblep

ujfi:
x0 = rmax * COS(fi)
y0 = torz * rmax * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
PSET (315 + x, 215 + y)

NEXT fi

END



vege3:
'       Keruleti iranyban vonalakat huzva adott polarfuggveny szerint
'       tolti ki az ellipszist.
FOR k = 0 TO 100
FOR fi = 0 TO ketpi * 1.05 STEP .03
r = fnfi * k
IF r <= rmax THEN kilep = 0 ELSE kilep = 1

x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
IF kilep = 0 THEN PSET (315 + x, 215 + y), 9

IF kilep = 1 OR fi = 0 THEN regix = x: regiy = y
IF kilep = 0 THEN PSET (315 + x, 215 + y), 15 + (SGN(r - rmax + .1)) * 6
IF kilep = 0 THEN LINE (315 + regix, 215 + regiy)-(315 + x, 215 + y), 9
IF kilep = 0 THEN regix = x: regiy = y
ujfi2:
NEXT fi

NEXT k


FOR fi = 0 TO ketpi * 1.05 STEP .03
x0 = rmax * COS(fi)
y0 = torz * rmax * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
PSET (315 + x, 215 + y)
NEXT fi


END
















vege5:
'A vegso valtozat: a polarfuggveny szerint huzodo, keruleti iranyu lepesekkel
'felrajzolt kitoltovonalakat latvanyosabban mutatja. Kifele haladva finomabb
'osszekotest tesz lehetove. Idotakarekossagra es minel kisebb kilogasra
'torekszik.


fimin = 111111
fimax = -111111
FOR fi = 0 TO ketpi * szogatfedes STEP .03
'IF fnfi <= 0 THEN BEEP:LOCATE 1, 6: PRINT "Rossz fuggveny, negativ a sugar": END
IF fimin > ABS(fnfi) + .01 THEN fimin = ABS(fnfi) + .01
IF fimax < ABS(fnfi) THEN fimax = ABS(fnfi)
NEXT fi

voltbent = -1
FOR k = 1 TO INT(rmax / fimin / pontsortav)
IF voltbent = 0 THEN GOTO szele
voltbent = 0

'A vonalak rangsora: minel magasabb 2-hatvannyal oszthato a sorszama,
'annal magasabb rangja van, vagyis annal kevesbe lesz hajlamos megszakadni.
g$ = RIGHT$(HEX$(INT(k)), 1)
SELECT CASE g$
CASE IS = "0"
rang = 4
CASE IS = "1"
rang = 0
CASE IS = "2"
rang = 1
CASE IS = "3"
rang = 0
CASE IS = "4"
rang = 2
CASE IS = "5"
rang = 0
CASE IS = "6"
rang = 1
CASE IS = "7"
rang = 0
CASE IS = "8"
rang = 3
CASE IS = "9"
rang = 0
CASE IS = "A"
rang = 1
CASE IS = "B"
rang = 0
CASE IS = "C"
rang = 2
CASE IS = "D"
rang = 0
CASE IS = "E"
rang = 1
CASE IS = "F"
rang = 0
END SELECT

fi = 0

ujfi5:
h$ = INKEY$
IF h$ <> "" THEN END
IF fnfi < .01 THEN potlas = rmax / 100 ELSE potlas = 0
r = fnfi * k * pontsortav + potlas
deltafi = ketpi * torespontsuruseg * fnr

'       ezektol a kiiirasoktol nagyon lassu lesz
'LOCATE 1, 1: PRINT deltafi
'LOCATE 2, 1: PRINT fnfi * (rang + 1)

IF ABS(r) > rmax THEN kilep = 1: elozolegkilepett = 1 ELSE kilep = 0
'IF fnfi * (k - 1) > rmax THEN GOTO ujfi5
x0 = r * COS(fi)
y0 = torz * r * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
IF kilep = 0 THEN voltbent = 1: PSET (315 + x, 215 + y), 15
IF fi = 0 THEN regix = x: regiy = y
IF fnfi * (rang + 1) < vonalsuruseg THEN GOTO nemvonalaz
'IF elozolegkilepett=0 THEN LINE (315 + regix, 215 + regiy)-(315 + x, 215 + y), szin(rang)
IF elozolegkilepett = 1 THEN regix = x: regiy = y
IF elozolegkilepett = 0 AND kilep = 0 THEN LINE (315 + regix, 215 + regiy)-(315 + x, 215 + y), szin(rang)
nemvonalaz:
regix = x: regiy = y
IF kilep = 0 THEN elozolegkilepett = 0
fi = fi + deltafi
IF fi > ketpi * szogatfedes THEN GOTO ujka5

GOTO ujfi5
ujka5:
NEXT k



LINE (1, 450)-(ketpi * 50 + 1, 450)
LINE (1, 350)-(1, 550)


szele:    '     szep keretet rajzol neki

FOR fi = 0 TO ketpi * szogatfedes STEP .01
x0 = rmax * COS(fi)
y0 = torz * rmax * SIN(fi)
x = x0 * COS(alfa) + y0 * SIN(alfa)
y = -x0 * SIN(alfa) + y0 * COS(alfa)
IF fi = 0 THEN regix = x: regiy = y
PSET (315 + x, 215 + y)
LINE (315 + regix, 215 + regiy)-(315 + x, 215 + y), 11
regix = x
regiy = y

'       felrajzolja a fv-eket ertheto alakban is

PSET (fi * 50 + 1, 450 - fnfi / fimax * 50), 7
PSET (fi * 50 + 1, 450 - fnszorzo / fimax * 500), 13
PSET (fi * 50 + 1, 450 - fntorz / fimax * 20), 1
NEXT fi

LOCATE 1, 1: COLOR 13: PRINT "A szorzofuggveny (ha van)"
LOCATE 2, 1: COLOR 1: PRINT "A torzitofuggveny (ha van)"
LOCATE 3, 1: COLOR 7: PRINT "Maga a fuggveny"
LOCATE 5, 5: COLOR 15: PRINT CHR$(25)

END



