[VC++ 2008] Rysowanie zbioru Mandelbrota

0

Witam,

Bazując na pseudokodzie z Wiki:

For each pixel on the screen do:
{
x0 = scaled x co-ordinate of pixel (must be scaled to lie somewhere in the interval (-2.5 to 1)
y0 = scaled y co-ordinate of pixel (must be scaled to lie somewhere in the interval (-1, 1)

x = 0
y = 0

iteration = 0
max_iteration = 1000

while ( xx + yy <= (22) AND iteration < max_iteration )
{
xtemp = x
x - yy + x0
y = 2
x*y + y0

x = xtemp

iteration = iteration + 1

}

if ( iteration == max_iteration )
then
color = black
else
color = iteration

plot(x0,y0,color)
}

Próbuje napisać program rysujący fraktal Mandelbrota. Na chwile obecną mój kod wygląda tak:

 
                                  Int16 res_x, res_y, i = 0, i_MAX=1000, x, y, xtemp;
			 Color kolor;
			 Bitmap^ srcBmp = gcnew Bitmap(310,310);
			 for(res_x = 1; res_x <=300; res_x++)
			 {
			 x = 0;
			 y = 0;
			 i = 0;
			 while(x*x + y*y < 4 && i < i_MAX)
				{
				xtemp = x*x - y*y +res_x;
				y = 2*x*y + res_y;
				x = xtemp;
				i++;
				}
			if(i == i_MAX) { kolor = System::Drawing::Color::FromArgb(0,0,0); }
			else { kolor = System::Drawing::Color::FromArgb(200,200,200); }
			srcBmp->SetPixel(res_x,res_y,kolor);
			for(res_y = 1; res_y<=300; res_y++)
			 {
			 x = 0;
			 y = 0;
			 i = 0;
				while(x*x + y*y < 4 && i < i_MAX)
					{
					xtemp = x*x - y*y +res_x;
					y = 2*x*y + res_y;
					x = xtemp;
					i++;
					}
				if(i == i_MAX) { kolor = System::Drawing::Color::FromArgb(0,0,0); }
				else { kolor = System::Drawing::Color::FromArgb(200,150,120); }
				srcBmp->SetPixel(res_x,res_y,kolor);
				}
			 } 
			 srcBmp->Save("test.bmp");
			 pictureBox1->Load("test.bmp");

Jednak po wielu próbach modyfikacji ciągle otrzymuje jednolity obraz powstały z System::FromArgb(200,150,120). W czym problem? Może ktoś mnie oświecić ?

0

res_x res_y u ciebie zmieniają się od 1 do 300, a instrukcja wyraźnie podaje, że

x0 = scaled x co-ordinate of pixel (must be scaled to lie somewhere in the interval (-2.5 to 1)
y0 = scaled y co-ordinate of pixel (must be scaled to lie somewhere in the interval (-1, 1)

więc musisz konwertować współrzędne ekranowe na współrzędne fraktala.

od razu dodam, że twój sposób będzie bardzo powolny, a to z powodu

srcBmp->SetPixel(res_x,res_y,kolor);

program będzie działał znacznie szybciej, gdy zaLock

ujesz obszar bitmapy i będziesz pisał do niej poprzez wskaźnik.
0
Azarien napisał(a)

res_x res_y u ciebie zmieniają się od 1 do 300, a instrukcja wyraźnie podaje, że

x0 = scaled x co-ordinate of pixel (must be scaled to lie somewhere in the interval (-2.5 to 1)
y0 = scaled y co-ordinate of pixel (must be scaled to lie somewhere in the interval (-1, 1)

więc musisz konwertować współrzędne ekranowe na współrzędne fraktala.

od razu dodam, że twój sposób będzie bardzo powolny, a to z powodu

srcBmp->SetPixel(res_x,res_y,kolor);

program będzie działał znacznie szybciej, gdy zaLock

ujesz obszar bitmapy i będziesz pisał do niej poprzez wskaźnik.


Czy możesz mnie pokierować w jaki sposób przekonwertować pixel -> coordinate?
0

pokierować.
aby przeskalować z zakresu [0;200) na [-1;+1) trzeba podzielić liczbę przez 100, to nam da zakres [0;2) i odjąć 1, co nam da [-1;1).

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