Stránka 1 z 1
Mandelbrotova množina
Napsal: 04 črc 2023, 17:53
od Diego
Ahoj, zkousel tu nekdo programovat Mandelbrotovu mnozinu na arduinu?
Zkusil jsem to podle tohoto navodu
http://warp.povusers.org/Mandelbrot/ jen jsem upravil vypis pixelu na muj lcd.
Sice to funguje ale neni vycentrovany, vedel by nekdo proc?
Re: Mandelbrotova množina
Napsal: 04 črc 2023, 20:20
od kiRRow
Mazec ... ale jelikož výpočet a vykreslování vypadá správně, podezříval bych právě tu úpravu. Nikdo ti asi nebude umět pomoct bez zveřejnění upraveného kódu, nebo křišťálové koule ...
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 06:21
od Diego
V úpravě to nebude-
Originální kód:
Kód: Vybrat vše
double MinRe = -2.0;
double MaxRe = 1.0;
double MinIm = -1.2;
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30;
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
bool isInside = true;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = false;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside) { putpixel(x, y); }
}
}
upravený kód:
Kód: Vybrat vše
int ImageHeight = 288; //rozlišení obrazu na výšku
int ImageWidth = 480; //rozlišení obrazu na šířku
double MinRe = -2.0;
double MaxRe = 1.0; //1.0
double MinIm = -1.2; //-1.2
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30; //počet iterací
for(unsigned y=0; y<ImageHeight; ++y)
{
double c_im = MaxIm - y*Im_factor;
for(unsigned x=0; x<ImageWidth; ++x)
{
double c_re = MinRe + x*Re_factor;
double Z_re = c_re, Z_im = c_im;
bool isInside = true;
for(unsigned n=0; n<MaxIterations; ++n)
{
double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
if(Z_re2 + Z_im2 > 4)
{
isInside = false;
break;
}
Z_im = 2*Z_re*Z_im + c_im;
Z_re = Z_re2 - Z_im2 + c_re;
}
if(isInside)
{
delay(5); //čekej 5ms - pro zobrazovač
GPUx1 = x;
GPUy1 = y;
GPUbod(); //nakresli bod
}
}
}
Jak jsem psal jediný co sem upravil je zobrazení pixelů na mim LCD
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 10:18
od kiRRow
hmm .. tak tam přidej nějaký konstantní offSetX, offSetY a přičti ho k vypočtenému X a Y ... asi nejjednodužší jak to celé posunout.
Kód: Vybrat vše
if(isInside)
{
delay(5); //čekej 5ms - pro zobrazovač
GPUx1 = x + offSetX;
GPUy1 = y + offSetY;
GPUbod(); //nakresli bod
}
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 10:21
od SkullKeep
Zkusil si prohodit hodnoty šířky a délky obrazovky? Přijde mi jakoby byly prohozeny.
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 10:35
od kiRRow
Dobrej postřeh
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 13:04
od Diego
SkullKeep píše: ↑05 črc 2023, 10:21
Zkusil si prohodit hodnoty šířky a délky obrazovky? Přijde mi jakoby byly prohozeny.
zkusil, pak to je eště horší
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 13:15
od Diego
kiRRow píše: ↑05 črc 2023, 10:18
hmm .. tak tam přidej nějaký konstantní offSetX, offSetY a přičti ho k vypočtenému X a Y ... asi nejjednodužší jak to celé posunout.
Kód: Vybrat vše
if(isInside)
{
delay(5); //čekej 5ms - pro zobrazovač
GPUx1 = x + offSetX;
GPUy1 = y + offSetY;
GPUbod(); //nakresli bod
}
takhle sice posunu obraz ale stejně mu bude kus chybět..
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 14:59
od AstroMiK
Na tohle jsem asi ve škole chyběl, ale když koukám na to, jak by to mělo vypadat, tak se mi zdá, že je to symetrické podle reálné osy.
Takže na imaginární ose bych tak nějak předpokládal stejné minimum a maximum (s opačnými znaménky).
Když je v programu napevno zadané...
... tak proč se potom vypočítává maximum imaginární osy 'MaxIm' ze šířky a výšky obrazovky a koncových bodů reálné osy?
Kód: Vybrat vše
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
Po výpočtu to vychází:
MaxIm = +0.6
A od tohodle je pak všechno ujetý kus nahoru.
Já bych zkusil tu hodnotu 'MaxIm' nastavit taky napevno:
Re: Mandelbrotova množina
Napsal: 05 črc 2023, 18:26
od Diego
AstroMiK píše: ↑05 črc 2023, 14:59
Na tohle jsem asi ve škole chyběl, ale když koukám na to, jak by to mělo vypadat, tak se mi zdá, že je to symetrické podle reálné osy.
Takže na imaginární ose bych tak nějak předpokládal stejné minimum a maximum (s opačnými znaménky).
Když je v programu napevno zadané...
... tak proč se potom vypočítává maximum imaginární osy 'MaxIm' ze šířky a výšky obrazovky a koncových bodů reálné osy?
Kód: Vybrat vše
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
Po výpočtu to vychází:
MaxIm = +0.6
A od tohodle je pak všechno ujetý kus nahoru.
Já bych zkusil tu hodnotu 'MaxIm' nastavit taky napevno:
Supr. To bylo ono. Já se v tom taky nevyznam tak sem se v tom nechtěl moc hrabat
Díky