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?
20230704_062713.jpg

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

Kód: Vybrat vše

double MinIm = -1.2;
... 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:

Kód: Vybrat vše

double MaxIm = 1.2;

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

Kód: Vybrat vše

double MinIm = -1.2;
... 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:

Kód: Vybrat vše

double MaxIm = 1.2;
Supr. To bylo ono. Já se v tom taky nevyznam tak sem se v tom nechtěl moc hrabat ;-)
Díky
20230705_182359.jpg