Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: 3D-kuutio

Sivun loppuun

kurz [20.08.2003 17:57:06]

#

Elikkä tää on minun ensimmäinen 3d homma, joten koodista aika moni löytää puutteita. Esimerkiksi laatikolla ei ole omaa x:ää ja y:tä vaan nurkilla on, sekin olisi ollut helppo korjata, mutta laiskuus yllätti. Toinen on että nopeus on konekohtainen koska hidastuksena on käytetty silmukkaa. Koodiin voi muuttaa nopeutta riviltä "FOR slow = 1 TO 50000: NEXT slow". Tämä on testattu AMD Athlon 1,6 Ghz koneella.

Lisäys:
Ja eihän 15 vuotiaalta koodaajalta voi täydellisyyttä odattaakkaan, kun aika menee vielä pääosin lentopallon parissa:)

... ja lisäys: tässä on vähän viisaammin tehty versio

Main Program

DECLARE FUNCTION DrawCube! (x, y, z, size.x, size.y, size.z, c, scale, origox, origoy)
SCREEN 12
DIM SHARED dnurkka.x(1 TO 8), dnurkka.y(1 TO 8), lap
DIM SHARED nurkka.x(1 TO 8), nurkka.y(1 TO 8), nurkka.z(1 TO 8)

cube.x = 50
cube.y = 50
cube.z = 150

varmuus = DrawCube(cube.x, cube.y, cube.z, 50, 50, 30, 1, 255, 250, 150)

DO
    x$ = INKEY$
    i = i + .1
    varmuus = DrawCube(cube.x, cube.y, cube.z, 50, 50, 30, 0, 255, 250, 150) 'pyyhkiminen
    cube.y = cube.y + COS(i) * 7 'lasketaan uus sijainti
    cube.z = cube.z + SIN(i) * 10
    varmuus = DrawCube(cube.x, cube.y, cube.z, 50, 50, 30, 1, 255, 250, 150) 'ja piirto
LOOP UNTIL x$ = CHR$(27)

Functio DrawCube

FUNCTION DrawCube (x, y, z, size.x, size.y, size.z, c, scale, origox, origoy)
 IF origox = 0 THEN origox = 60
 IF origoy = 0 THEN origoy = 280
 IF scale = 0 THEN scale = 255
 nurkka.x(1) = x - (size.x / 2) 'pistetään nurkat kohdilleen...
 nurkka.y(1) = y + (size.y / 2)
 nurkka.z(1) = z + (size.z / 2)

 nurkka.x(2) = x + (size.x / 2)
 nurkka.y(2) = y + (size.y / 2)
 nurkka.z(2) = z + (size.z / 2)

 nurkka.x(3) = x + (size.x / 2)
 nurkka.y(3) = y - (size.y / 2)
 nurkka.z(3) = z + (size.z / 2)

 nurkka.x(4) = x - (size.x / 2)
 nurkka.y(4) = y - (size.y / 2)
 nurkka.z(4) = z + (size.z / 2)

 nurkka.x(5) = x - (size.x / 2)
 nurkka.y(5) = y + (size.y / 2)
 nurkka.z(5) = z - (size.z / 2)

 nurkka.x(6) = x + (size.x / 2)
 nurkka.y(6) = y + (size.y / 2)
 nurkka.z(6) = z - (size.z / 2)

 nurkka.x(7) = x + (size.x / 2)
 nurkka.y(7) = y - (size.y / 2)
 nurkka.z(7) = z - (size.z / 2)

 nurkka.x(8) = x - (size.x / 2)
 nurkka.y(8) = y - (size.y / 2)
 nurkka.z(8) = z - (size.z / 2)

 FOR i = 1 TO 8
  dnurkka.x(i) = nurkka.x(i) * scale / nurkka.z(i) + origox
  dnurkka.y(i) = nurkka.y(i) * scale / nurkka.z(i) + origoy ' *** Lasketaan nurkat ***
 NEXT i
 IF c = 0 THEN FOR slow = 1 TO 5000: NEXT slow '(purkkahidastus)
 LINE (dnurkka.x(1), dnurkka.y(1))-(dnurkka.x(2), dnurkka.y(2)), c  '...ja piirretään ne
 LINE (dnurkka.x(2), dnurkka.y(2))-(dnurkka.x(3), dnurkka.y(3)), c
 LINE (dnurkka.x(3), dnurkka.y(3))-(dnurkka.x(4), dnurkka.y(4)), c
 LINE (dnurkka.x(4), dnurkka.y(4))-(dnurkka.x(1), dnurkka.y(1)), c

 LINE (dnurkka.x(5), dnurkka.y(5))-(dnurkka.x(6), dnurkka.y(6)), c
 LINE (dnurkka.x(6), dnurkka.y(6))-(dnurkka.x(7), dnurkka.y(7)), c
 LINE (dnurkka.x(7), dnurkka.y(7))-(dnurkka.x(8), dnurkka.y(8)), c
 LINE (dnurkka.x(8), dnurkka.y(8))-(dnurkka.x(5), dnurkka.y(5)), c

 LINE (dnurkka.x(1), dnurkka.y(1))-(dnurkka.x(5), dnurkka.y(5)), c
 LINE (dnurkka.x(2), dnurkka.y(2))-(dnurkka.x(6), dnurkka.y(6)), c
 LINE (dnurkka.x(3), dnurkka.y(3))-(dnurkka.x(7), dnurkka.y(7)), c
 LINE (dnurkka.x(4), dnurkka.y(4))-(dnurkka.x(8), dnurkka.y(8)), c
END FUNCTION

polestar [21.08.2003 19:01:07]

#

Hmm... käytiin SIN COS ja TAN koulussa vuosi sitten läpi mutten tiennyt että niitä voi käyttää hyväksi QBasicissakin! :) Hyvä ekaksi 3D-koodiwinkiksi.
P.S. Tämä toimii ihan kohtalaisella vauhdilla minun 466mHz koneellakin, kuutiolta menee n. 10 sekkaa yhteen kieppiin (no jos sitä voi sanoa edes kohtalaiseksi). Minä olen edelleen sitä mieltä että 3D hommat pitäisi tehdä jollain muulla kielellä. (C++?)

Grey [21.08.2003 19:34:53]

#

"WAIT &H3DA, 8" on hieman silmukkaa parempi. Ainakin itselläni tuo piirto vaikutti paremmalta kun vaihdoin silmukan tuohon.

-Grey-

Gwaur [21.08.2003 23:01:40]

#

äh, tietenkin sinejä ja cosinejä voi käyttää qbasicis! ei basicit nyt ihan niin alkeellisia ole! hittu

T.M. [21.08.2003 23:41:47]

#

kyllä QB:llä voi tehä vaikka miten hienoja juttuja, jos osaa... harva taas osaa, ja C++ on se lyhin tie osaamiseen :)

trinit [22.08.2003 13:09:10]

#

koodin pituuskin vähenisi reilusti kun muuttijia pistettäisiin taulukkoon, kuten nuo nurkkaxxx muuttujat jne.

Gwaur [22.08.2003 13:10:37]

#

Muuta qbllä tulee yksinkertaisesti ja suoraan sanottuna yksinkertaisin kieli.

kun C++:lla vie noin kuusi riviä pelkän "Hello World":n printtaamiseen, kun taas basicilla siihen riitttää vain yksi rivi (Tää on vissiin eniten käytetty vertaus näiden kielien välissä)

kurz [22.08.2003 14:08:32]

#

Joo toi luuppihidastus on aika epäkäytännöllinen. Mulla oikeestaan olikin semmonen versio siitä että siinä oli laatikon x ja y, niistä sitten laskettiin nurkat etc. mutta se hävis ja en jaksanu uudestaan tehdä. Tämä on myös jonkun verran vanha, sillon en vielä käyttäny taulukoita, nykyisin näyttää aika tökerölle tuo. Aktiivisesti olen ohjelmoinut n. 2 vuotta.

HtH [22.08.2003 14:10:55]

#

Saasta: Minusta C++-kielinen koodi on reilusti selkeämpää Basic koodiin verrattuna koska C++:ssa monet asiat voidaan kuvata yksinkertaisella symboleilla, esim. tavallinen ehtolauseke, if on C-kielessä if (ehto) { ... } kun Basicissa IF EHTO THEN ... END IF . Sellainen ihminen joka osaa hyvin C-kieltä hahmottaa C-kielisen koodin reilusti nopeammin kuin Basic-kielisestä koodista sellainen ihminen joka osaa Basic kieltä hyvin.

Yhden "Hello World" rivin koodaamiseen C++ kielellä menee 4-6 riviä, mutta kun halutaan tulostaa vielä toinen merkkijono, niin rivejä ei tule kuin yksi lisää :)

Gwaur [22.08.2003 19:50:13]

#

HtH, niin, mutta kuten odys kerran IRCissä kysyi että kuinka monta riviä menee jos piirtää vaikka pienen lilan neliön keskelle ja sitten siirtää vähän oikealle, vastasit sen vievän noin 40 riviä. ja kuinkas paljon tämä viekään basicilla... :P

kurz [22.08.2003 21:22:14]

#

Vaikka koodaankin nykyään qbasicilla, niin kyllä silti tiedän kokemuksesta että C on paljon nopeampi ja loogisempi. Ja se ei todellakaan meinaa että kieli olisi huono, jos siinä pitää kirjoittaa paljon, melkein päinvastoin. Tietysti on eriasia soveltuuko esim. joku assembleri alottelijoille. Mutta siitä ei ole tarkoitus ruveta näillä kommenteilla väittelemään(kai).

Gwaur [23.08.2003 22:04:23]

#

Niin, ja C-koodari ei ehkä tajua basicia, mutta eipä tajua basic koodari välttämättä c:täkään (ainakaan minä)
eikä qbasicilla mitään turhia kirjasoja ihmeellisesti icludettaa jos haluaa piirtää vaikka grafiikkaa.

ruuvari [27.08.2003 11:54:01]

#

aika huono toteutus :___(

tejeez [27.08.2003 15:59:39]

#

Toimii nopeasti tällä mun hitaalla koneella.. No tossahan onkin pelkkiä viivoja, ja nehän se LINE piirtää aika nopeesti =)

kurz [28.08.2003 14:31:44]

#

Oikeestaan mulla on nyt parempi versio, kun yks yö jäi vaivaamaan tämä huonompi versio, se pitäis laittaa tähän tilalle. Siinä tuo neliön piirto on omassa functiossaan.

kwuwjdox [29.08.2003 15:48:32]

#

miten ton saa toimii kertokaa tyhmälle

jos kirjottaa ton notepadiin niin mihin muotoon se pitää tallentaa niin et se toimii

kurz [02.09.2003 12:55:10]

#

.BAS-muotoon.

kurz [10.09.2003 17:33:02]

#

Elikkä tässä on vähän paremmin toimiva versio. Piti se tänne laittaa vaikka onkin vanha vinkki, kun muuten ei saa öitä nukuttua kun on niin tökerö se edellinen versio.

tejeez [25.10.2003 09:36:12]

#

lainaus:

vastasit sen vievän noin 40 riviä

jaa-a.. riippuu varmaankin siitä miten sen tekee :D
voi se onnistua lyhyemmälläkin koodilla :>


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta