Kirjautuminen

Haku

Tehtävät

Koodit: QB: Pyöritettävä 3d-pallo

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)

Kommentit

T.M. [22.11.2003 21:34:30]

#

Heh, tosi siisti :) Screen 12 -tilassa tiheysasteikolla 1 on siistein. Tommonen olis näytönsäästäjänä aika veikee :)

Gwaur [23.11.2003 02:13:51]

#

Pistin pyörimään niin lujaa ettei sen pyörimistä edes huomaa ;)

sooda [23.11.2003 08:55:44]

#

Tosi upea! kun hyväksikäyttelee vähän SVGA:ta niin vieläkin hienompi sellaisessa 1280*1024 tilassa...vauu!

hunajavohveli [23.11.2003 20:58:27]

#

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?

sooda [24.11.2003 09:11:57]

#

svga toimii hyvin interrupteilla. http://koti.mbnet.fi/koodaaja/SVGALIB2.BAS

rndprogy [24.11.2003 15:07:03]

#

Katso myös tämä keskustelu
https://www.ohjelmointiputka.net/keskustelu/2792-qbasic-svga

hunajavohveli [24.11.2003 15:46:44]

#

'$include: 'qb.bi' ei löydä aliohjelmaa tossa SVGALIB2:ssa. FutureLibissä ei löydy niitä Set640*480 ynnä muita.

sooda [24.11.2003 17:03:18]

#

nappaa "qbx.exe /l"

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta