PDA

View Full Version : [c] mi servono numeri con piu cifre...


mamo139
21-04-2008, 17:10
purtroppo costanti e variabili di questo programma (ad esempio const double Y1 = 0.6501800130615235;) stanno iniziando ad essere troppo poco precise e il programma funziona peggio...
devo usare numeri con piu cifre, ma da come potete vedere devo usare e poter lavorare senza problemi con i numeri complessi...
come posso fare??

grazie mille per ogni aiuto!!!:)


#include "ppm_image.h"
#include <complex>
#include <math.h>
#include <windows.h>

using namespace std;


#define WIDTH 2000
#define HEIGHT 2000

#define DEPTH 4000

const double Y1 = 0.6501800130615235;
const double X0 = -0.0984813251342773;
const double X1 = -0.0984810866699219;
const double Y0 = 0.6501797746582032;



unsigned int * hsv_rgb(unsigned int *);

int main()
{

complex<double> value, point;

double r, i, modulo;
long cnt;

//dati utili per colorare
long cnt_tot=0, media_cnt=0, media_cnt_n=0, c_cnt=0;


// Creo un'immagine vuota di dimensione WIDTH*HEIGHT
PpmImage img(WIDTH, HEIGHT);

for(int x=0; x<WIDTH; x++){
r = X0+((double(x)*(X1-X0))/ double(WIDTH));
for(int y=0; y<HEIGHT; y++){
i = Y0+((double(y)*(Y1-Y0))/double(HEIGHT));

point = complex<double>(r,i);
value = point;

// iniziamo il ciclo

for(cnt=0; cnt<DEPTH; cnt++){
value = value*value+point;
modulo = abs(value);
if(modulo>2)break;
}


if(modulo<=2){
img.SetPixel(x,(HEIGHT-y),0,0,0);
}
else{
// invece di disegnare un pixel bianco ne disegno uno colorato che dipende da cnt
unsigned int red, green, blue; //colore, contrasto, luminosità

unsigned int *col;
col = new unsigned int[3];
unsigned int *col2;


//cnt_tot=cnt_tot+cnt;
//media_cnt_n++;
c_cnt = cnt/4;

red = (c_cnt)%360;
green = 250;
blue = 250;

if(red>359) red=359;
if(green>255) green=255;
if(blue>255) blue=255;

col[0]=red;
col[1]=green;
col[2]=blue;

col2 = hsv_rgb(col);
delete []col;

img.SetPixel(x, (HEIGHT-y), col2[0], col2[1], col2[2]);
delete []col2;
}
}
printf("%d - %d%%\n",x,x*100/WIDTH);
}

// Salvo l'immagine
img.SaveToFile("mandelbrot.ppm");

//media_cnt=cnt_tot/media_cnt_n;
//printf("cnt medio: %d\n",media_cnt);

printf("zoom consigliati:\n\n");
printf("(Y)\n");
printf("1: %.16f\n",(double)Y1);
printf("2: %.16f\n",(double)(((Y1+Y0)/2)+Y1)/2 );
printf("3: %.16f\n",(double)(Y1+Y0)/2);
printf("4: %.16f\n",(double)(((Y1+Y0)/2)+Y0)/2 );
printf("5: %.16f\n",(double)Y0);

printf("\n(X)\n");
printf("1: %.16f\n",(double)X0);
printf("2: %.16f\n",(double)(((X0+X1)/2)+X0)/2 );
printf("3: %.16f\n",(double)(X0+X1)/2);
printf("4: %.16f\n",(double)(((X0+X1)/2)+X1)/2 );
printf("5: %.16f\n",(double)X1);

system("pause");
return 0;
}









unsigned int * hsv_rgb(unsigned int hsv[3]){

//printf("REVERSE:\nH:%d\nS:%d\nV:%d\n",hsv[0],hsv[1],hsv[2]);
double *dRGB;
dRGB = new double[3];

double H = ((double)hsv[0]);
double S = ((double)hsv[1])/255;
double V = ((double)hsv[2])/255;

double hi = ((int)(H/60))%6;
double f = (H/60) - (double)hi;
double p = V*(1-S);
double q = V*(1-(f*S));
double t = V*(1-(1-f)*S);

if (hi == 0){ dRGB[0]=V;dRGB[1]=t;dRGB[2]=p;}
else if (hi == 1){ dRGB[0]=q;dRGB[1]=V;dRGB[2]=p;}
else if (hi == 2){ dRGB[0]=p;dRGB[1]=V;dRGB[2]=t;}
else if (hi == 3){ dRGB[0]=p;dRGB[1]=q;dRGB[2]=V;}
else if (hi == 4){ dRGB[0]=t;dRGB[1]=p;dRGB[2]=V;}
else if (hi == 5){ dRGB[0]=V;dRGB[1]=p;dRGB[2]=q;}
else printf("ERRORE!");

//printf("R:%f\nG:%f\nB:%f\n",dRGB[0],dRGB[1],dRGB[2]);

unsigned int *RGB;
RGB = new unsigned int[3];

RGB[0] = (int)(dRGB[0]*255);
RGB[1] = (int)(dRGB[1]*255);
RGB[2] = (int)(dRGB[2]*255);

delete[]dRGB;

//printf("R:%d\nG:%d\nB:%d\n",RGB[0],RGB[1],RGB[2]);
return RGB;
}

cionci
21-04-2008, 19:09
Se ti servono più cifre dovresti usare una qualche libreria che ti permetta di utilizzare numeri con precisione arbitraria. Per il C librerie di questo tipo sono un po' scomode da usare.