PDA

Visualizza la versione completa : [C++] Insieme di Mandelbrot (Mandelbrot Set)


RooccoXXI
21-03-2011, 18:42
Ciao a tutti.
Sto provando a implementare un programmino che mi permetta di disegnare l'insieme di Mandelbrot ma mi sono bloccato sull'utilizzo degli std::complex.
È possibile modificare unicamente o la parte reale o la parte immaginaria e non tutte e due assieme?!
Propio non riesco a utilizzare la libreria per i miei scopi. Potrei risolvere utilizzando due variabili separate, ma visto che c'è la libreria...

Grazie.

shodan
21-03-2011, 19:38
Modificare no.
Puoi però creare un nuovo complex a partire dai dati che ti interessano.

RooccoXXI
21-03-2011, 20:42
Originariamente inviato da shodan
Modificare no.
Puoi però creare un nuovo complex a partire dai dati che ti interessano.

E come esattamente?

Così:

complex<double> Cn(10, 10)

complex<double> Zn (real(Cn), 11)
?

shodan
21-03-2011, 20:47
Si. O anche:


complex<double> Zn (Cn.real(), 11)

RooccoXXI
21-03-2011, 20:52
Originariamente inviato da shodan
Si. O anche:


complex<double> Zn (Cn.real(), 11)


Ok, perfetto!
Grazie!

:)

RooccoXXI
21-03-2011, 22:26
Ho appena scritto questo programma in C++ per creare l'insieme di Mandelbrot in bianco e nero ma non funzione. O meglio: fa schizzare l'attività di processore e ventole alle stelle senza però produrre un bel cavolo di niente in tempi apprezzabili.

La prima esecuzione ho sbagliato io. Ho passato al programma i seguenti argomenti, palesemente troppo elevati: 1024 786 100.
Ho poi rieseguito il programma con i dati seguenti, ma con lo stesso risultato: 20 12 25.

Il programma è giusto ed è un problema di efficienza, vi sono altri problemi oppure mi tocca proprio aspettare un sacco?


#include <iostream>
using std::cout;
using std::endl;
using std::ios;

#include<cmath>
using std::pow;

#include<vector>
using std::vector;

#include <fstream>
using std::ofstream;

#include <complex>
using std::complex;

#include<cstdlib>
using std::exit;

bool** createPBM (int imageW, int imageH)
{
bool** image = new bool*[imageH];

for (int i = 0; i < imageH; i++)
{
image[i] = new bool[imageW];
}

return image;
}

void mandelbrot (int imageW, int imageH, bool** image, int iterations)
{
double const Rmin = 2, Rmax = 1;
double const Imin = -1.2, Imax = 1.2;
double const scaleR = (Rmax - Rmin) / (imageW - 1), scaleI = (Imax - Imin) / (imageH - 1);

complex<double> Z (0, 0);
complex<double> Zn (0, 0);
complex<double> C (0, 0);

for (int y = 0; y < imageH; y++)
{
complex<double> C (C.real(), Imax - y * scaleI);

for (int x = 0; x < imageW; x++)
{
complex<double> C (Rmin + x * scaleR, C.imag());
complex<double> Z (C.real(), C.imag());

for (int n = 0; n < iterations; n++)
{
complex<double> Zn (pow(Z.real(), 2), pow(Z.imag(), 2));

if (Zn.real() + Zn.imag() > 4)
{
image[x][y] = false;
break;
}

complex<double> Z (Zn.real() - Zn.imag() + C.real(), 2 * Z.real() * Z.imag() + C.imag());
}
}
}
}

void printPBM (int imageW, int imageH,bool** image, ofstream& oFile)
{
for (int i = 0; i < imageW; i++)
{
for (int j = 0; j < imageH; j++)
{
if (image[i][j])
{
oFile << 1 << ' ';
}
else
{
oFile << 0 << ' ';
}

}
}
}

int main (int argc, int const argv[])
{
ofstream oFile("mandelbrot.txt", ios::out);

if (argc =! 4)
{
cout << "Invalid arguments." << endl;
exit(1);
}

bool** image = createPBM(argv[1], argv[2]);

mandelbrot(argv[1], argv[2], image, argv[3]);

printPBM(argv[1], argv[2], image, oFile);

system("convert mandelbrot.txt mandelbrot.png");
}

shodan
21-03-2011, 23:02
Intanto correggi questo (non c'entra ma è ambiguo):


if (argc =! 4)


Hai provato a commentare qualcosa? Tipo quella system ad esempio.

alka
22-03-2011, 13:30
Ho unito le discussioni aperte sullo stesso argomento.

RooccoXXI
22-03-2011, 18:46
Originariamente inviato da alka
Ho unito le discussioni aperte sullo stesso argomento.

Ok. =).

Nessuno ha consigli allora?

Magari ho sbagliato già all'inizio, modificando gli argomenti presi dal main()!

MacApp
23-03-2011, 15:19
argv [1], argv [2], argv [3] sono char *, ma tu le tratti come se fosse int, quindi giustamente, ad esempio in "bool** createPBM (int imageW, int imageH)" imageW e imageH avranno dei valori.. indecenti ;-)
per converire da char * a int vedi ad esempio http://en.wikipedia.org/wiki/Atoi

Loading