Witam serdecznie,
bez zbędnego wstępu napiszę o co mi chodzi.
Mam 2 klasy: Rysunek i Logo.
class Rysunek
{
public:
Rysunek(const char* nazwaPliku, int szerokosc, int wysokosc, kolor tlo=kBialy);
~Rysunek();
void punkt(int x, int y, kolor k=kCzarny);
void odcinek(int x0, int y0, int x1, int y1, kolor k);
kolor piksel(int x, int y);
void zapisz();
int wysokosc() { return cy; }
int szerokosc() { return cx; }
protected:
const int cx, cy;
private:
RGBTRIPLE* bmp;
char* nazwaPliku;
};
Logo:
class Logo
{
public:
Logo(Rysunek* rys, kolor pisak=kCzarny);
~Logo();
void naprzod(double ile);
void cofnij(double ile);
void prawo(double kat);
void lewo(double kat);
void podnies() { pisanie=false; }
void opusc() { pisanie=true; }
void ustawKolor(kolor _pisak) { pisak = _pisak; }
void floodFill(int x, int y, kolor kFill);
private:
double x; //< pozycja x zolwia
double y; //< pozycja y zolwia
double kat; //< kat zolwia w stopniach
bool pisanie; //< tryb pisania wlaczony/wylaczony
kolor pisak; //< kolor pisaka
kolor tlo; //< kolor tla
Rysunek* rys;
};
Konstruktor:
Rysunek::Rysunek(const char* nazwaPliku, int szerokosc, int wysokosc, kolor tlo)
: cx(szerokosc), cy(wysokosc)
{
this->nazwaPliku = new char[strlen(nazwaPliku)+1];
strcpy(this->nazwaPliku, nazwaPliku);
this->bmp = new RGBTRIPLE[cx*cy];
for (int i=0; i<cx*cy; ++i) bmp[i] = tlo;
}
I tu zaczyna się moje zadanie: chodzi o napisanie metody: kolor Rysunek::pobierzPiksel(int x, int y), która zwróciłaby mi kolor konkretnego piksela o współrzędnych x i y. Problem jest jednak taki, że autor kodu (nie to nie ja go pisałem...) zamiast przedstawić bitmapę jako dynamiczną tablicę dwuwymiarową, zrobił to z tablicą jednowymiarową. I teraz mam zagwozdkę: jak odwołać się do konkretnego piksela w tym kodzie? Ewentualnie (byłoby to bardzo pomocne) jak przerobić ten kod, żeby odwoływanie się do pikseli było możliwe w taki sposób bitmapa[x][y] ? Wiąże się to pewnie z dość znaczną modyfikacją kodu, mylę się?
Wkleję może jeszcze co to jest za typ danych kolor:
typedef struct RGBTRIPLE kolor;
struct RGBTRIPLE
{
RGBTRIPLE(BYTE R, BYTE G, BYTE B) {r=R; g=G; b=B;}
RGBTRIPLE() { }
BYTE b, g, r;
friend bool operator==(RGBTRIPLE x, RGBTRIPLE y) //potrzebuję przeładować operator porównania do pewnej funkcji
{
if(x.r == y.r && x.g == y.g && x.b == y.b) return true;
else return false;
}
};
Ponadto jest jeszcze jeden problem: mianowicie nie jestem w stanie wywołać metody klasy Rysunek w metodzie klasy Logo. Potrzebuję tego do metody Logo::floodFill(int x, int y, kolor kFill); która ma za zadanie wypełniać cały obszar zadanym kolorem poczynając od piksela o współrzędnych x i y, po uprzednim sprawdzeniu czy kolor tego piksela jest różny od koloru docelowego.
Dziękuję za każdą pomoc.
Pozdrawiam