Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Atomimallimikälie (?)

Sivun loppuun

sooda [19.09.2004 12:47:34]

#

(Että trigonometria o ihkuu... )
Piirtää hienon atomimallin tms, emmätiä mikä toi tarkalleen on mutta toi tollanen hieno kuvio (http://sooda.dy.fi/foo/atomi.jpg). Ensin tein tän TIkkarilleni (TI-84+) kun aattelin et siihen vois koodata jotain hienoo, hidas kieli, sikahidas efekti -> PSIONille, hidas -> koneelle, nopee :)
Toimii sillain että piirretään kolmea ellipsiä eri asteissa, niin kaks niistä menee tollain hienosti vinoon ja kun vuorotellen piirretään ja pyyhitään ni johan on kaunis :)

Heitä formille yksi kappale kuvalaatikkoa, nimeltään p.

Binääri: http://sooda.dy.fi/foo/atomi.exe

Private Sub Form_Load()

    WindowState = vbMaximized
    Show 'formi esiin, muutoin se näkyisi vasta form_loadin jälkeen ja tästähän ei poistuta ku on toi looppi
    p.Move 0, 0, ScaleWidth, ScaleHeight 'bufferin skaalaus
    p.ScaleMode = vbPixels
    p.FillStyle = vbSolid 'jotta ympyrät täyttyisi
    'keskix ja y
    kx = p.ScaleWidth / 2
    ky = p.ScaleHeight / 2
    k = kx: If k > ky Then k = ky
    k = k / 1.3 'kuva tulee vähän formia pienemmäksi -> hienompi
    p.Visible = False
    p.AutoRedraw = True
    r = Atn(1) / 45 'radiaaneiksi-muunnin
    Do
        DoEvents
        p.Circle (kx, ky), 15 'keskihommeli

        'x-suuntainen ellipsi
        x = Cos(a * r)
        y = Sin(a * r)
        'piirretään:
        '* 1.4 sitä varten ettei olisi liian "lyhyt" verrattuna noihin muihin kahteen
        'y / 5 y:n sijasta tekee siitä ellipsin
        'noi muut alemmat piirretään sitte samalla periaatteella, käännetään vaan vähän niitä
        p.Circle (kx + k * x * 1.4, ky + k * y / 5), 10, c
        'vastakkainen piste piirretään tälleen vähentämällä a:sta puoliympyrä (180 astetta)
        xb = Cos((a - 180) * r)
        yb = Sin((a - 180) * r)
        p.Circle (kx + k * xb * 1.4, ky + k * yb / 5), 10, c

        'koillinen-lounas
        X2 = Cos((a - 90) * r)
        Y2 = Sin((a - 90) * r)
        p.Circle (kx + k * (x + y / 5), ky + k * (X2 / 5 + Y2)), 10, c
        X2b = Cos((a - 270) * r)
        Y2b = Sin((a - 270) * r)
        p.Circle (kx + k * (xb + yb / 5), ky + k * (X2b / 5 + Y2b)), 10, c

        'luode-kaakko
        X2 = Cos((a + 90) * r)
        Y2 = Sin((a + 90) * r)
        p.Circle (kx + k * (X2 / 5 + Y2), ky + k * (x + y / 5)), 10, c
        X2b = Cos((a - 90) * r)
        Y2b = Sin((a - 90) * r)
        p.Circle (kx + k * (X2b / 5 + Y2b), ky + k * (xb + yb / 5)), 10, c

        PaintPicture p.Image, 0, 0
        For i = 0 To 300000: Next 'tämä pitää conffia omalle koneelle sopivaksi
        a = (a + 1) Mod 360 'kulman lisäys
        'joka toinen kerta piirretään ja ne muut sit pyyhitään -> hieno efekti
        If a = 180 Or a = 0 Then c = BackColor - c: p.FillColor = c
    Loop

End Sub

Private Sub Form_Unload(Cancel As Integer)

    End 'do-loop höskän takia

End Sub

Blaze [21.09.2004 18:51:31]

#

Ei sulla olis sitä tikkari-versiota missään? :)
Vai onkos tuon 84+:n Basic muuten miten erilainen 86:een verrattuna?

kaviaari [21.09.2004 19:06:08]

#

Varsinaisesti atomeissa elektronit vetävät rallia eri kuorilla K L M N jne. ja näille kuorille mahtuu sitten erimääriä elektroneja. Mutta ihan siisti efekti.

Heikki [22.09.2004 07:01:36]

#

Kaviaari kirjoitti:

Varsinaisesti atomeissa elektronit vetävät rallia eri kuorilla K L M N jne. ja näille kuorille mahtuu sitten erimääriä elektroneja.

Sen verran voisin viilata pilkkua, että nykykäsityksen mukaan atomit eivät ole tarkasti elektronikuorilla(K,L,M,N tai 1,2,3,4), vaan joka kuorella on muutamia orbitaaleja (s,d,p,f), jokta kuvaavat mistä voi TODENNÄKÖISESTI löytää elektronin, sillä elektroni saattaa joskus 'harhailla'.

Muistaakseni homma meni näin, korjatkaa jos olen väärässä :D

sqwiik [22.09.2004 08:11:52]

#

Heikki: oikeassa olet, mutta laitetaan hieman tarkennusta:
Radat K,L,M... ovat yksinkertaisin malli joka on. Oikeasti yksikään elektroni ei ole tarkallaan tietyllä radalla, johtuen sen aaltoluonteesta (lukekaa kvanttiteoriaa). Orbitaalit s,p,d,f... ovat ikäänkuin pilviä, jonka sisällä elektroni on tietyllä todennäköisyydellä. Nämä orbitaalit eivät täyty järjestyksessä, sillä joka kuorella (K,L,M...) on omat orbitaalinsa esim. K: 1s, L: 2s 2p jne. Pienimmälle kuorelle (K) mahtuu 2 elektronia, molemmat s-orbitaalille (joka on muuten pallonmuotoinen, p-orbitaali jakautuu 3:een rusettiin).

Itse koodista: hieno esimerkki luovasta trigonometrian käytöstä!

sooda [22.09.2004 13:08:17]

#

Blaze: se on vähän erilainen, piirtää suoraan sin ja coseilla koska en ole ehtinyt opetella siinä taulukoita vielä. Modasin koneelle paremman version :)
Tässäpä kuitenki eka versio:

0->A
While 1
cos(A)->X
sin(A)->Y
Pt-Change(X/1.3,Y/5)
Pt-Change((X+Y/5)/1.5,(cos(A-90)/5+sin(A-90))/1.2)
Pt-Change((cos(A+90)/5+sin(A+90))/1.5,(X+Y/5)/1.2)
A+3->A
End

(Sairaan hidas, siksen lisännyt vastakkaisia pisteitä tohon. Ja miks tossei voi sisentää :D)

Blaze [22.09.2004 15:08:10]

#

Söpö ^^
Toimii suoraan 86:lla, kun Pt-Changet vaihtaa PtChg:eiksi, eikä ollut edes niin hidas, kuin ensin ajattelin :)

Gwaur [22.09.2004 20:10:59]

#

Hanki sooda jotain tekemistä ;)

jrantala [24.09.2004 17:41:47]

#

Iha hassu... ;)

makeuu [26.09.2004 14:32:47]

#

Hieno ;)... <3 ihku <3

zorm [13.10.2005 20:19:17]

#

Todella hieno! :D
Osaisko joku kääntää C++:alle

sooda [14.10.2005 15:39:37]

#

No osais. Riippuu sitten, mitä rajapintaa halutaan käyttää piirtämiseen.

zorm [15.10.2005 18:23:28]

#

SDL??

sooda [15.10.2005 18:29:07]

#

No osais. Mut mitä varten pitäisi?

zorm [15.10.2005 19:15:22]

#

Ois kiva saada C++:alle kun oon opettelemas sitä ja SDL:ää.

rautamiekka [20.06.2007 19:42:16]

#

Kumpi on kevyempi: timerilla tuo koodi pyörimässä kokoajan vai tuo loop ?

vehkis91 [20.09.2008 16:45:01]

#

Hieno.


Sivun alkuun

Vastaus

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

Tietoa sivustosta