Bitmapa, pobranie koloru piksela

0

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

0

autor tego dobrze zrobil ze zaalokowal to jako tablice jednowymiarową, jako ze ta bitmapa dzieki temu bedzie stanowic ciagly fragment pamieci. w zaleznosci od intencji autora (lub Twoich) kolor odczytujesz albo tak:
bmp[yszerokosc+x]
albo tak:
bmp[x
wysokosc+y]

podejrzewam ze jest to jednak pierwsza opcja. zastanow sie jak jest zapisana bitmapa w pamieci wtedy bedziesz wiedzial dlaczego tak a nie inaczej

0

Tak właśnie sam to napisałem, ale mam problem z wywołaniem tej metody w innej klasie... :/ Poradzisz coś na to?

1 użytkowników online, w tym zalogowanych: 0, gości: 1