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
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++?)
"WAIT &H3DA, 8" on hieman silmukkaa parempi. Ainakin itselläni tuo piirto vaikutti paremmalta kun vaihdoin silmukan tuohon.
-Grey-
äh, tietenkin sinejä ja cosinejä voi käyttää qbasicis! ei basicit nyt ihan niin alkeellisia ole! hittu
kyllä QB:llä voi tehä vaikka miten hienoja juttuja, jos osaa... harva taas osaa, ja C++ on se lyhin tie osaamiseen :)
koodin pituuskin vähenisi reilusti kun muuttijia pistettäisiin taulukkoon, kuten nuo nurkkaxxx muuttujat jne.
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ä)
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.
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ää :)
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
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).
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.
aika huono toteutus :___(
Toimii nopeasti tällä mun hitaalla koneella.. No tossahan onkin pelkkiä viivoja, ja nehän se LINE piirtää aika nopeesti =)
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.
miten ton saa toimii kertokaa tyhmälle
jos kirjottaa ton notepadiin niin mihin muotoon se pitää tallentaa niin et se toimii
.BAS-muotoon.
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.
lainaus:
vastasit sen vievän noin 40 riviä
jaa-a.. riippuu varmaankin siitä miten sen tekee :D
voi se onnistua lyhyemmälläkin koodilla :>
Aihe on jo aika vanha, joten et voi enää vastata siihen.