Kirjoittaja: hunajavohveli
Kirjoitettu: 21.05.2004 – 21.05.2004
Tagit: grafiikka, koodi näytille, vinkki
Kun nämä metapallot nyt tuntuvat olevan jälleen muodissa, niin lukaisinpa minäkin pekin oppaan ja tekaisin oman versioni metapalloista. Ajattelin aluksi pistää QB-version, mutta väriskaala oli ikävän karkea.
Tässä koodissa käyttäjä pääsee itse käsittelemään metapalloja, eli vaihtamaan niiden paikkaa, kokoa sekä myös väriä. Metapalloista voi tehdä joko punaisia, vihreitä tai sinisiä. Kun erivärisiä metapalloja vie toistensa lähelle, värit sekoittuvat. Esimerkiksi punaisen ja sinisen metapallon päällekkäin osuvat kohdat ovat väriltään violetteja. Kun jokaista kolmea väriä osuu samaan kohtaan, väri on loogisesti valkoinen.
Koodi sijoittaa kaikki oliot automaattisesti oikeille paikoilelen. Käyttäjän tarvitsee vain luoda kolme CommandButtonia, kaksi TextBoxia ja kaksi HScrollBaria. Formin kokoa koodi ei muuta, mutta kannattaa vetää vähän yli 400x300 pikselin kokoon.
Ohjelmaa voi olla vähän vaikea käyttää, mutta muokattava metapallo valitaan ensimmäisellä ScrollBarilla, ja tuo metapallo näkyy silloin mustana. Paikkaa vaihdetaan klikkaamalla hiiren vasemmalla napilla. Väriä vaihdetaan oikealla. Kokoa vaihdetaan toisesta ScrollBarista. CLEAR tyhjää formin, RANDOM arpoo pallot satunnaisesti, ja RENDER näyttää kuvan, jonka metapallot muodostavat.
Kuten peki minulle huomautti, värien sekoittuminen pilaa varsinaisen yhdistymisefektin, joten sitä on paras kokeilla käyttämällä vain yksivärisiä metapalloja.
Huom! Formin ScaleModeksi on syytä asettaa Pixel Twipin sijaan. AutoRedraw kannattaa myös olla True.
Dim M(1 To 8, 1 To 4) As Integer Dim ch As Integer Dim QB(1 To 3) As Integer
Private Sub Command1_Click() Dim G(1 To 3) As Long Max = 8 'metapallojen renderöinti For b = 1 To 300 'Y-akseli DoEvents For a = 1 To 400 'X-akseli G(1) = 0: G(2) = 0: G(3) = 0 For c = 1 To Max 'Metapallot 'metapallojen laskukaava 1/x^2 (jokainen metapallo voimistaa oman värinsä "sähkökenttää") G(M(c, 4)) = G(M(c, 4)) + M(c, 3) / Sqr(((a - M(c, 1)) ^ 2) + ((b - M(c, 2)) ^ 2) + 1) Next c PSet (a, b), RGB(G(1), G(2), G(3)) 'piiretään piste värien sähkökenttien voimakkuuksien mukaan Next a Next b End Sub
Private Sub Command2_Click() 'arvotaan metapallot For a = 1 To 8 Form1.Circle (M(a, 1), M(a, 2)), M(a, 3) / 100, Point(M(a, 1), M(a, 2)) M(a, 1) = Int(Rnd * 400) + 1 'x M(a, 2) = Int(Rnd * 300) + 1 'y M(a, 3) = Int(Rnd * 3000) + 500 'koko M(a, 4) = Int(Rnd * 3) + 1 'väri Form1.Circle (M(a, 1), M(a, 2)), M(a, 3) / 100, QBColor(QB(M(a, 4))) Next a End Sub Private Sub Command3_Click() Form1.Cls End Sub Private Sub Form_Load() Randomize 'värit QB(1) = 12 QB(2) = 10 QB(3) = 9 ch = 1 Call Command2_Click 'helpotetaan käyttäjän elämää :) Command1.Caption = "RENDER": Command1.Left = 8: Command1.Top = 320: Command1.Width = 129: Command1.Height = 57 Command2.Caption = "RANDOM": Command2.Left = 320: Command2.Top = 320: Command2.Width = 73: Command2.Height = 25 Command3.Caption = "CLEAR": Command3.Left = 320: Command3.Top = 352: Command3.Width = 73: Command3.Height = 25 HScroll1.Left = 144: HScroll1.Top = 320: HScroll1.Width = 105: HScroll1.Height = 25: HScroll1.Value = 1: HScroll1.Max = 8: HScroll1.Min = 1 HScroll2.Left = 144: HScroll2.Top = 352: HScroll2.Width = 105: HScroll2.Height = 25: HScroll2.Value = 1000: HScroll2.Max = 20000: HScroll2.Min = 0 Text1.Text = 1: Text1.Left = 256: Text1.Top = 320: Text1.Width = 57: Text1.Height = 25: Text1.Locked = True Text2.Text = 1000: Text2.Left = 256: Text2.Top = 352: Text2.Width = 57: Text2.Height = 25: Text2.Locked = True End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then 'vasen nappi (vaihdetaan valitun metapallon paikaa) Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, Point(M(ch, 1), M(ch, 2)) M(ch, 1) = X M(ch, 2) = Y For a = 1 To 8 Form1.Circle (M(a, 1), M(a, 2)), M(a, 3) / 100, QBColor(QB(M(a, 4))) Next a End If If Button = 2 Then 'oikea nappi (vaihdetaan valitun metapallon väriä) M(ch, 4) = M(ch, 4) + 1 If M(ch, 4) = 4 Then M(ch, 4) = 1 Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, QBColor(QB(M(ch, 4))) End If End Sub Private Sub HScroll1_Change() 'vaihdetaan valittua metapalloa Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, QBColor(QB(M(ch, 4))) Text1.Text = HScroll1.Value ch = HScroll1.Value Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, 0 End Sub Private Sub HScroll2_Change() 'vaihdetaan valitun metapallon kokoa Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, Point(M(ch, 1), M(ch, 2)) Text2.Text = HScroll2.Value M(ch, 3) = HScroll2.Value Form1.Circle (M(ch, 1), M(ch, 2)), M(ch, 3) / 100, 0 End Sub
Hyvää työtä kaikin puolin!
exeä kiitos.
Itse en voi pistää Exeä, kun on vain VB5, mutta jos joku tahtoo, niin aivan vapaasti voi tehdä tuosta Exen nettiin. Jos muuten käytette VB3:a, niin tuon pitäisi toimia silläkin, kunhan pistää Form_Load-proseduurin alkuun Form1.Show, poistaa ne Locked-kohdat, joista VB valittaa, ja vaihtaa Static niiden Dim-käskyjen kohdalle, joista valittaa.
Hieano mutta sisennä ihmeessä! Exe: http://koti.mbnet.fi/koodaaja/jotaki/
Ihan hieno. :)
Kannattaisi varmaan tehdä mahdollisuus säätää metapallojen thresold arvoa. eli rajoittaa minimi kirkkautta.
Pallojen rajat näkyvät silloin paremmin.
Aika hieno
saakos tolla tehtyjä kyvia käyttää itse
Aivan vapaasti voit käyttää mihin vain haluat.