Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: [vb6] Värikoodit yksinkertaisemmiksi

Sivun loppuun

JussiR [15.10.2008 16:43:25]

#

Moi

Mun ohjelma hakee nyt 64:n kohdan värikoodin yhdestä ikkunasta GetPixelillä ja se saattaa palauttaa vaikka "16774007" ja tuo koodi vaihtuu aika paljon jos värin sävy on yhtään muuttunut.. Mun pitäis vaan tietää että onko se väri ihan simppelisti vaan esim. punainen, vaaleansinen vai valkoinen?

Ku eikai sitä nyt näin kannata tehdä?? Tuntuu tyhmältä ja vie aikaa.

Public Function ConvertCol(Col As String)
Select Case Col
    Case 1061359
        ConvertCol = "puna"
    Case 2771955
        ConvertCol = "puna"
    Case 8101119
        ConvertCol = "puna"
    Case 16772938
        ConvertCol = "vsini"
    Case 16774007
        ConvertCol = "vsini"
End Select
End Function

sqwiik [15.10.2008 17:11:56]

#

Pura väri komponentteihinsa (RGB tai BRG riippuen onko big- vai small endian) ja tee sen pohjilta jonkinlainen valinta-algoritmi; esim. jos punainen komponentti on hallitsevin niin pikselin sävy on vahvasti punertava.

JussiR [15.10.2008 17:19:01]

#

Joo tota mä mietenki mutta eikö siitä tule aika hidas kun joutuu muuntamaan ne kaikki erikseen rgb:ksi?

Newb [15.10.2008 17:21:51]

#

JussiR kirjoitti:

Joo tota mä mietenki mutta eikö siitä tule aika hidas kun joutuu muuntamaan ne kaikki erikseen rgb:ksi?

Nopeempi se on ku sun purkkaviritelmäsi.

JussiR [15.10.2008 17:34:07]

#

Joo testasin ja hyvin se toimii :P

Tässä tämänhetkinen kokeilu:

Public Sub ConCol(col As Long, Ai As Long, Bi As Long)
r = col Mod 256
B = Int(col / 65536)
g = (col - (B * 65536) - r) / 256

If r > 145 And g < 35 And B < 15 Then
    JewelCol(Ai, Bi) = "R"
ElseIf r > 200 And g > 200 And B > 200 Then
    JewelCol(Ai, Bi) = "W"
ElseIf r < 50 And B > 120 Then
    JewelCol(Ai, Bi) = "B"
ElseIf g > 200 And B > 200 Then
    JewelCol(Ai, Bi) = "B"
End If
End Sub

Grez [15.10.2008 17:42:50]

#

JussiR kirjoitti:

r = col Mod 256
B = Int(col / 65536)
g = (col - (B * 65536) - r) / 256

Itse tekisin näin:

r = col And 255
g = (col \ 256) And 255
b = col \ 65536

JussiR [15.10.2008 18:48:19]

#

Onpas vaikeaa erottaa punainen ja oranssi toisistaan.. :S

Grez [15.10.2008 19:27:57]

#

Itselle tulisi äkkiseltään mieleen muuttaa RGB HSV:ksi, jolloin Huesta saisi suoraan haettua sävyn

Function Sävy(Color As Long) As String
    Dim R As Integer, G As Integer, b As Integer
    Dim MaxC As Integer, MinC As Integer
    Dim H As Double, Dyn As Integer

    R = Color And 255
    G = (Color \ 256) And 255
    b = Color \ 65536

    If R > G Then MaxC = R: MinC = G Else MaxC = G: MinC = R
    If b < MinC Then MinC = b
    If b > MaxC Then MaxC = b

    If MaxC = MinC Then
        Sävy = "Harmaa, ei voi määrittää sävyä"
        Exit Function
    End If

    Dyn = (MaxC - MinC)

    If MaxC = R Then
        H = (G - b) / Dyn * 60
        If H < 0 Then H = H + 360
    ElseIf MaxC = G Then
        H = 120 + (b - R) / Dyn * 60
    Else
        H = 240 + (R - G) / Dyn * 60
    End If

    Select Case H
    Case Is < 15, Is > 345
        Sävy = "Punainen"
    Case 15 To 45
        Sävy = "Oranssi"
    Case 45 To 75
        Sävy = "Keltainen"
    Case 75 To 105
        Sävy = "Keltavihreä"
    Case 105 To 135
        Sävy = "Vihreä"
    Case 135 To 165
        Sävy = "Sinertävänvihreä"
    Case 165 To 195
        Sävy = "Syaani"
    Case 195 To 225
        Sävy = "Vihertävänsininen"
    Case 225 To 255
        Sävy = "Sininen"
    Case 255 To 285
        Sävy = "Sinivioletti"
    Case 285 To 315
        Sävy = "Violetti"
    Case 315 To 345
        Sävy = "Punavioletti"
    End Select

End Function

JussiR [18.10.2008 12:02:09]

#

Kiitos! Tuo näyttää sopivalta. Testaamaan->

Yritin tehdä tätä ohjelmaa myös C++:lla, mutta samat väriongelmat tuli..

EDIT: Ei onnistu tälläkään kertaa.. Tuokin luulee oranssia keltaiseksi ja toisinpäin. Ehkä olis aika lähettää ne värit tänne kuvana? :D

EDIT2: Eli tässä on peli mihin teen taas bottia. Siinä ei ole hiscore listaa eikä siitä voi voittaa mitään eli lähes huvikseni vaan teen.
http://www.popcap.com/webgames/bejeweled/flash/en/bejeweled.swf

Ja tässä on kuva missä näkyy mistä kohdasta mun VB-botti ne värit ottaa:
http://img186.imageshack.us/my.php?image=bjyi9.png

Muuten olis botti C++:lla ja Visual Basicilla valmis, mutta värit sekoo.

Lähetän kohta mistä kohdasta C++ botti ottaa värit.

JussiR [18.10.2008 14:24:27]

#

Sain nyt C++ version mun ohjelmasta toimimaan. Mutta jostain ihmeen syystä siitä tuli melkein 2 kertaa hitaampi kuin Visual Basic versiosta? :S Kumpikin toimii GetPixelillä.
Sleep komentoja ei ole turhissa kohdissa.

Deffi [18.10.2008 15:06:06]

#

Jaa'a, aika huonosti oot C++-version tehny jos Visual Basic-versio on nopeempi ja kummatki käyttää samaa APIa :D Mut kuitenki, tee palvelus itselles ja kaikille muille äläkä käytä GetPixeliä, jos nopeudella on tippaakaan merkitystä. GetDIBits on paljon nopeempi ja parempi kun etitään suuremmalta alueelta värejä. Tarkemmin ottaen 3000 kertaa nopeempi verrattuna GetPixeliin, kun kävin koko näyttöni (1440x900) läpi.

edit. oho joo ois voinu kattoo ton kuvan. Käytä vaan GetPixeliä, paljon parempi tossa kun tarkistat vaan pari pikseliä sieltä täältä.

JussiR [18.10.2008 16:28:49]

#

GetDIBits on vaikee käyttää.

Mut taisin löytää mikä tossa hidastaa. C++ versio ottaa sen hanskan mistä Getpixeli kattoo sitten tietyt pikseli näin "GetDC(0)" elikkäs koko ruudun kahva. Onko hitaampaa katsoa muutama tietty piste jos kahva on isompi? Kyseessä ei ole siis for looppi joka katsoo koko ruudun jokaisen pikselin..

Visual Basicilla tehty ottaa kahvan vain pelin ikkunasta jonka hwnd se tietää hiiren sijainnista WindowFromPoint APIlla.

Eli käyn katsomassa googlesta kuinka windowfrompointia käytetään C++:Ssa.

Mutta vastatkaa silti hidastaako tuo oikeesti mitään?


EDIT: OHO ei oo taas ollu If hallussa.. SIellä oli sellanen Sleep(3000) väärässä kohdassa..


Sivun alkuun

Vastaus

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

Tietoa sivustosta