2010-04-08 15 views

回答

3

這應該足以讓你開始。這繪製了一個用ascii設置的茱莉亞。 如果您想繪製mandelbrot集合,請遍歷c而不是z。

#include <stdio.h> 

typedef struct tag_complex 
{ 
    double real, imag; 
} complex; 

static complex complex_mul(
const complex* a, 
const complex* b) 
{ 
    /* a * b = (a_real + i*a_imag)(b_real + i*b_imag) */ 
    /* i*i = -1, hence imag*imag becomes -(imag*imag) */  
    complex ret; 

    ret.real = a->real*b->real - a->imag*b->imag; 
    ret.imag = a->real*b->imag + a->imag*b->real; 
    return ret; 
} 

static complex complex_add(
const complex* a, 
const complex* b) 
{ 
    complex ret; 

    ret.real = a->real + b->real; 
    ret.imag = a->imag + b->imag; 
    return ret; 
} 

static int julia(
complex* z, 
const complex* c, 
int maxIter) 
{ 
    double lengthSquared; 
    int iter = 0; 

    while(iter < maxIter){ 
    ++iter; 
    *z = complex_mul(z, z); 
    *z = complex_add(z, c); 
    lengthSquared = z->real*z->real + z->imag*z->imag; 
    /* If the point escapes the radius 2 
     in the complex plane, it's in the set */ 
    if(lengthSquared > 4.0) 
     return iter; 
    } 
    /* Point didn't escape. Either it's not in the set, 
    or we need more iterations.*/ 
    return 0; 
} 

int main(int argc, char* argv[]) 
{ 
    const int width = 80; 
    const int height = 40; 
    const int maxIter = 512; 

    /* step in the range [0, 4] since the set 
    lives within [-2, 2] in the complex space */ 
    const double step_height = 4.0/(double)height; 
    const double step_width = 4.0/(double)width; 

    /*c is constant for julia sets. z is iterated over */ 
    const complex c = {0.285, 0.0}; 

    complex z; 
    int index; 
    char ch; 
    for(int j=0; j<height; ++j){ 
    for(int i=0; i<width; ++i){ 
     /* Get interpolants within [-2, 2] range */ 
     z.imag = ((double)j * step_height) - 2.0; 
     z.real = ((double)i * step_width) - 2.0; 
     index = julia(&z, &c, maxIter); 
     ch = (index % ('Z' - ' ')) + ' '; 
     printf("%c", ch); 
    } 
    printf("\n"); 
    fflush(stdout); 
    } 
}