Ongelmana olis vanhan VB 6.0 koodin muuttaminen C++ koodiksi..
en oikein mistään löytänyt muunnostaulukoita, joissa olis selostettu mikä VB-komento vastaa C++ vastaavaa..
VB C++
Abs = abs
Sin = sin
jne..
vaikeuksia on ollut Mod, \, ^ merkkien kanssa.
Case 3 '3 = "Charcoal" C.R = Abs(C.R * (C.G - C.B + C.G + C.R)) / 256 C.G = Abs(C.R * (C.B - C.G + C.B + C.R)) / 256 C.B = Abs(C.G * (C.B - C.G + C.B + C.R)) / 256 tCol = RGB(C.R, C.G, C.B) C.R = Abs(tCol Mod 256) C.G = Abs((tCol \ 256) Mod 256) C.B = Abs(tCol \ 256 \ 256) C.R = (C.R + C.G + C.B) / 3 ... ja Case 2 '2 = "Yellow" C.B = ((C.G - C.R) ^ 2) / 125 C.R = ((C.G - C.B) ^ 2) / 125 C.G = ((C.B + C.R) ^ 2) / 125
Näistä voisi olla apua:
Mod = %
\ = / (kunhan luvut ovat kokonaislukuja)
x ^ 2 = x * x
Antti Laaksonen kirjoitti:
^ 2 = << 1
En ole bitshiftausta juuri käyttänyt, mutta eikö tuo vastaa kahdella kertomista? Neliö kannattanee laskea suoraan kertolaskulla (C.G - C.R) * (C.G - C.R).
Juu, toi potenssiin kertominen varmaan toimii juuri noin =) vaikka for-loopilla, jos ei muuten saa :D
Toi \-jako hieman hämää...
Koklasin tehdä noi funktiot C++, ja tulos on aika erilainen kuin VB:n puolella
case 3 :// = "Charcoal" C.R = abs(C.R * (C.G - C.B + C.G + C.R)) / 256; C.G = abs(C.R * (C.B - C.G + C.B + C.R)) / 256; C.B = abs(C.G * (C.B - C.G + C.B + C.R)) / 256; tCol = RGB(C.R, C.G, C.B); C.R = abs(tCol % 256); C.G = abs((tCol / 256) % 256); C.B = abs(tCol / 256 / 256); C.R = (C.R + C.G + C.B) / 3; break;
tämä koodinpätkä ei toimi alkuunkaan..
error C2668: 'atan' : ambiguous call to overloaded function e:\grafiikka\bitmaptotext\c\bitc\draw.cpp 427
case 8 ://8 = "Unreal" if ((C.G = 0) || (C.B = 0)){ C.G = 1; C.B = 1; } C.R = abs(sin(atan(C.G / C.B)) * 125 + 20); C.G = abs(sin(atan(C.R / C.B)) * 125 + 20); C.B = abs(sin(atan(C.R / C.G)) * 125 + 20); break;
Alkuperäinen
Case 8 '8 = "Unreal" If (C.G = 0) Or (C.B = 0) Then C.G = 1 C.B = 1 End If C.R = Abs(Sin(Atn(C.G / C.B)) * 125 + 20) C.G = Abs(Sin(Atn(C.R / C.B)) * 125 + 20) C.B = Abs(Sin(Atn(C.R / C.G)) * 125 + 20)
hunajavohveli kirjoitti:
Antti Laaksonen kirjoitti:
^ 2 = << 1
En ole bitshiftausta juuri käyttänyt, mutta eikö tuo vastaa kahdella kertomista? Neliö kannattanee laskea suoraan kertolaskulla (C.G - C.R) * (C.G - C.R).
Olet oikeassa, teinpä tyhmän virheen. Korjasin nyt alkuperäisen viestini.
Muista vielä, että C++-koodissa 2/3 == 0, kun käytetään kokonaislukuja. Sen sijaan esimerkiksi 2/3.0 == 0.666... Muuta siis jakolaskuissasi jakaja desimaaliluvuksi, jos olet VB:ssä käyttänyt /-merkkiä etkä \-merkkiä. Sama ongelma on jälkimmäisessäkin koodissa. Tyyppimuunnoksen voi tehdä myös näin:
a = b / (float)c;
Kai tuon rakenteen jäsenet (R, G ja B) ovat liukulukuja? Muutenhan tuo voi mennä aivan pieleen jo välisijoituksen takia, kun luvut pyöristetään kokonaisluvuiksi.
Color arvo on tyyppiä COLORREF, josta luetaan R,G ja B- arvot
esim : rgb.R = GetRValue(Color); GetRvalue on C++:n oma.
RGB-arvot ovat ilmeisesti määritelty int-tyypiksi 0-255 arvoon.
Väriarvot on syytäkin olla kokonaislukuja =)
ainakin VB:ssä noi laskut on menny oikein.
VB:ssä
Public Type t_RGB R As Long G As Long B As Long End Type
C++
struct t_RGB{ int R,G,B; };
Kokeilemisen ja säätämisen sijaan voisit koettaa sellaista lähestymistapaa, että yrittäisit ymmärtää, mitä laskut tekevät, ja opettelisit C++:aa sen verran, että osaisit kirjoittaa vastaavat lausekkeet ihan itse. Se on luultavasti nopeampaa ja jatkonkin kannalta antoisampaa.
Potenssilasku (muun muassa) löytyy C-kielen kirjastosta math, funktio pow(). Eli esim. 45^6 = pow(45,6);
Aihe on jo aika vanha, joten et voi enää vastata siihen.