Kirjoittaja: hunajavohveli
Kirjoitettu: 22.11.2003 – 02.03.2019
Tagit: grafiikka, matematiikka, demo, koodi näytille, vinkki
Näyttää kolmiulotteisen pyöritettävän pallon, joka tietenkin koostuu harvoista pisteistä. Muutenhan pallon pyörimistä ei edes huomaisi. Vähän kun käpälöi koodia, voi muuttaa pallon mm. lieriöksi tai renkaaksi. Toki voi tehdä siihen ihan omankin pisteiden asetustavan. Pisteillähän on kolme koordinaattia x, y ja z, jotka ohjelma muuttaa 2d-koordinaateiksi.
Edit 2019 by mod: Vaihdettu hidastukseen TIMER ja korjattu muuttujien nimiä niin, että vinkki toimii FreeBASICilla asetuksella -lang qb.
SCREEN 13 rad = ATN(1) * 4 / 180 'radiaanisuhde... DO INPUT "Tiheys 1-3 ", d LOOP UNTIL d >= 1 AND d <= 3 IF d = 1 THEN points = 649: qr = 10 IF d = 2 THEN points = 1716: qr = 7.5 IF d = 3 THEN points = 2599: qr = 5 PRINT "Pyöritys nuolinäppäimistä. ESC lopettaa." PRINT "Paina jotain aloittaaksesi." INPUT$(1) CLS 'alustus DIM pos3d(1 TO points, 1 TO 4) DIM pos2d(1 TO points, 1 TO 2) 'luodaan pisteiden paikat a = 0 b = 0 FOR c = 1 TO points a = a + 1 IF a > 36 THEN a = 1: b = b + 1 IF b > 72 THEN EXIT FOR 'lasketaan koordinaatit sinillä ja kosinilla pos3d(c, 1) = 100 * SIN(a * qr * rad) * SIN(b * qr * rad) pos3d(c, 2) = 100 * COS(b * qr * rad) pos3d(c, 3) = 100 * COS(a * qr * rad) * SIN(b * qr * rad) 'väri, voi generoida myös RANDOMIZELLA. pos3d(c, 4) = 15 NEXT c x = 160: y = 100 kx = 135 ky = 65 t# = TIMER DO t# = t# + 0.05 WHILE TIMER < t#: WAIT &h3da, &h8: WEND 'keskipiste PSET (x, y), 15 FOR a = 1 TO points 'kumita muistiin luettu 2d-koordinaatti. PSET (pos2d(a, 1), pos2d(a, 2)), 0 'nämä rivit laskevat 3d-koordinaateista 2d-koordinaatin. px1 = x + pos3d(a, 1) * COS(kx * rad) py1 = y + pos3d(a, 1) * SIN(kx * rad) * COS(ky * rad) px2 = px1 + pos3d(a, 2) * COS((kx + 90) * rad) py2 = py1 + pos3d(a, 2) * SIN((kx + 90) * rad) * COS(ky * rad) px3 = px2 py3 = py2 + pos3d(a, 3) * -COS((ky + 90) * rad) 'tallennetaan 2d-koordinaatti pos2d(a, 1) = px3 pos2d(a, 2) = py3 'piirretään piste PSET (px3, py3), pos3d(a, 4) NEXT a a$ = INKEY$ IF MID$(a$, 2, 1) = "H" THEN kym = kym - 1 IF MID$(a$, 2, 1) = "P" THEN kym = kym + 1 IF MID$(a$, 2, 1) = "M" THEN kxm = kxm - 1 IF MID$(a$, 2, 1) = "K" THEN kxm = kxm + 1 ky = ky + kym kx = kx + kxm LOOP UNTIL a$ = CHR$(27)
Heh, tosi siisti :) Screen 12 -tilassa tiheysasteikolla 1 on siistein. Tommonen olis näytönsäästäjänä aika veikee :)
Pistin pyörimään niin lujaa ettei sen pyörimistä edes huomaa ;)
Tosi upea! kun hyväksikäyttelee vähän SVGA:ta niin vieläkin hienompi sellaisessa 1280*1024 tilassa...vauu!
Joo, tästä tuli tosiaan aika kätevä. Tein sellaisenkin ohjelman missä saa vetää viivoja pisteestä toiseen ja tehdä 3d-esineitä, mutta sitä on niin mutkikas käyttää etten viitsinyt laittaa tänne. Jos vaan sais hiiren toimimaan... Mutta mitenkäs QBasicissa saa 1280*1024 tilan? Toimiiko siinä muka SVGA? Eikös 640*480 ole maksimi?
svga toimii hyvin interrupteilla. http://koti.mbnet.fi/koodaaja/SVGALIB2.BAS
Katso myös tämä keskustelu
https://www.ohjelmointiputka.net/keskustelu/2792-qbasic-svga
'$include: 'qb.bi' ei löydä aliohjelmaa tossa SVGALIB2:ssa. FutureLibissä ei löydy niitä Set640*480 ynnä muita.
nappaa "qbx.exe /l"