' 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