2016-05-02 8 views
6

मैं सी में निम्नलिखित कोड पर काम कर रहा हूं। अब तक यह सब काम कर रहा है और यह सही स्तर पर ज़ूम किया गया है, हालांकि मैं रंगों को काम करने के लिए संघर्ष कर रहा हूं। आदर्श रूप में मैं रंग की परवाह किए बिना कुछ इस तरह से खत्म करना चाहते हैं:सी मंडेलब्रॉट सेट रंग

Mandelbrot Set w/ correct colors

लेकिन मेरे कार्यक्रम में यह नीचे है जैसा कि वर्तमान में कुछ इस तरह का उत्पादन:

Current Mandelbrot Set

इसलिए, मैं करूंगा जैसा कि मैं उन्हें चाहता हूं रंगों को बदलने के साथ मिलकर किसी भी मदद की सराहना करता हूं।

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define ITERMAX 100.0 
#define DIVERGING 1.1 
#define XMAX 500 
#define YMAX 500 
#define COLORINTENSITY 255 

/* allow up to ITERMAX feedbacks searching for convergence 
for the feedback 
    z0 = 0 + 0i 
    znew = z^2 + c 
If we have not diverged to distance DIVERGING before ITERMAX feedbacks 
we will assume the feedback is convergent at this value of c. 
We will report divergence if |z|^2 > DIVERGING 
*/ 

/* We will print color values for each pixel from (0, 0) to (XMAX, YMAX) 
The color of pixel (cx, cy) will be set by convergent() 
            or by divergent() 
depending on the convergence or divergence of the feedback 
when c = cx + icy 
*/ 

/* The max value of the red, green, or blue component of a color */ 

void convergent(); /* one color for convergence */ 
void divergent(); /* a different color for divergence */ 

void feedback(double *x, double *y, double cx, double cy); 
void pixel(char red, char green, char blue); 
FILE *fp; 


int main() 
{ 
    fp = fopen("mandelbrot.ppm", "wb"); 
    double x, y, cx, cy; 
    int iteration,squarex, squarey, pixelx, pixely; 
    double grow=1.0; 

/* header for PPM output */ 
fprintf(fp, "P6\n# CREATOR: EK, BB, RPJ via the mandel program\n"); 
fprintf(fp, "%d %d\n%d\n",XMAX, YMAX, COLORINTENSITY); 

for (pixely = 0; pixely < YMAX; pixely++) { 
    for (pixelx = 0; pixelx < XMAX; pixelx++) { 
     cx = (((float)pixelx)/((float)XMAX)-0.5)/grow*3.0-0.7; 
     cy = (((float)pixely)/((float)YMAX)-0.5)/grow*3.0; 
     x = 0.0; y = 0.0; 
     for (iteration=1;iteration<ITERMAX;iteration++) { 
        feedback(&x, &y, cx, cy); 
        if (x*x + y*y > 100.0) iteration = 1000; 
     } 
     if (iteration==ITERMAX) { 
      iteration = x*x + y*y; 
      pixel((char) 0, (char) 0, (char) 0); 
     } 
     else { 
      iteration = sqrt(x*x + y*y); 
      pixel((char) iteration, (char) 0, (char) iteration); 
       } 
      } 
    } 
} 

void feedback(double *x, double *y, double cx, double cy) { 
/* Update x and y according to the feedback equation 
xnew = x^2 - y^2 + cx 
ynew = 2xy + cy 
(these are the real and imaginary parts of the complex equation: 
    znew = z^2 + c) 
*/ 
double xnew = (*x) * (*x) - (*y) * (*y) + cx; 
double ynew = 2 * *x * *y + cy; 
*x = xnew; 
*y = ynew; 
} 

void pixel(char red, char green, char blue) { 
/* put a r-g-b triple to the standard out */ 
fputc(red, fp); 
fputc(green, fp); 
fputc(blue, fp); 
} 
+5

आपका रंग हमेशा एक जैसा होता है क्योंकि आप हमेशा आर और बी मानों को पुनरावृत्ति संख्या में सेट करते हैं, और जी से शून्य तक। उस पर पुनर्विचार करें कि ... –

+1

'आर = 0, जी = 0, बी = 255' से' आर = 255, जी = 255, बी = 255' से पुनरावृत्ति सीमा पर फीका करने के लिए 'ITERMAX' तत्वों का एक रंग सरणी प्रीसेट करें । यह 'संरचना' की एक सरणी हो सकती है, या प्रत्येक रंग के लिए एक सरणी हो सकती है। लेकिन यदि आप ज़ूम के बावजूद * हर * नक्शा नीले से सफेद तक जाने के लिए चाहते हैं, तो आपको प्रत्येक मानचित्र में पुनरावृत्तियों की सबसे छोटी संख्या मिलनी होगी, और वहां से रंगों को रेंज करना होगा। –

+0

कोडिंग शैली के बारे में बस एक तरफ: आपको प्रति ब्लॉक स्तर पर एक इंडेंट राशि चुननी चाहिए और इसके साथ चिपकना चाहिए। 4 प्रति ब्लॉक स्तर काफी आम है। – lurker

उत्तर

3

बैंडिंग सुलझाने के लिए आपको पुनरावृत्ति संख्या के लिए अपनी अधिकतम मूल्य खोजने के लिए अपने टेबल से अधिक पुनरावृति करने के लिए है, तो अपने अन्य मूल्यों पैमाने पर इस अधिकतम के सापेक्ष होने की जरूरत है (यानी। मूल्यों को सामान्य)। आप रंग परिवर्तन के ढलान समायोजित करने के लिए मूल्यों को लॉगरिदमिक रूप से पुन: सहेजना भी चाह सकते हैं।

और शायद आप सीधे आरजीबी स्पेस में काम नहीं करना चाहते हैं। यदि आप एचएसबी स्पेस में अपने रंगों को परिभाषित करते हैं, तो आप निरंतर रंग और संतृप्ति सेट कर सकते हैं, और सामान्यीकृत पुनरावृत्ति गणना के लिए आनुपातिक रूप से चमक बदल सकते हैं।

+0

पहली छवि स्मोथ रंग ढाल का उपयोग करती है: http://stackoverflow.com/questions/369438/smooth- स्पेक्ट्रम-for-mandelbrot-set-rendering, द्वितीय स्तर सेट विधि – Adam

संबंधित मुद्दे