Mandelbrotova množina

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Mandelbrotova množina

Příspěvek od Diego » 04 črc 2023, 17:53

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
https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
kiRRow
Příspěvky: 1170
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mandelbrotova množina

Příspěvek od kiRRow » 04 črc 2023, 20:20

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

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Mandelbrotova množina

Příspěvek od Diego » 05 črc 2023, 06:21

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
https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
kiRRow
Příspěvky: 1170
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mandelbrotova množina

Příspěvek od kiRRow » 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
              }

Uživatelský avatar
SkullKeep
Příspěvky: 291
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Mandelbrotova množina

Příspěvek od SkullKeep » 05 črc 2023, 10:21

Zkusil si prohodit hodnoty šířky a délky obrazovky? Přijde mi jakoby byly prohozeny.
:twisted: :?: :arrow: :geek: P. Q. M.

Uživatelský avatar
kiRRow
Příspěvky: 1170
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Mandelbrotova množina

Příspěvek od kiRRow » 05 črc 2023, 10:35

Dobrej postřeh ;)

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Mandelbrotova množina

Příspěvek od Diego » 05 črc 2023, 13:04

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ší
https://arze.cz - ARduino Zapojení Elektronika

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Mandelbrotova množina

Příspěvek od Diego » 05 črc 2023, 13:15

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..
https://arze.cz - ARduino Zapojení Elektronika

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Mandelbrotova množina

Příspěvek od AstroMiK » 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;

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Mandelbrotova množina

Příspěvek od Diego » 05 črc 2023, 18:26

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
https://arze.cz - ARduino Zapojení Elektronika

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 53 hostů