Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB matematiikka C++ koodiin

Sivun loppuun

JoreSoft [03.02.2008 14:14:13]

#

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

Antti Laaksonen [03.02.2008 15:21:31]

#

Näistä voisi olla apua:

Mod = %
\ = / (kunhan luvut ovat kokonaislukuja)
x ^ 2 = x * x

hunajavohveli [03.02.2008 15:29:26]

#

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).

JoreSoft [03.02.2008 16:14:11]

#

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)

Antti Laaksonen [03.02.2008 16:22:33]

#

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.

Metabolix [03.02.2008 16:28:00]

#

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.

JoreSoft [03.02.2008 16:48:19]

#

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;
};

Metabolix [07.02.2008 16:26:41]

#

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.

TsaTsaTsaa [07.02.2008 18:14:52]

#

Potenssilasku (muun muassa) löytyy C-kielen kirjastosta math, funktio pow(). Eli esim. 45^6 = pow(45,6);


Sivun alkuun

Vastaus

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

Tietoa sivustosta