2017-10-31 5 views
0

私はジュリアの画像を作り、これをCでプログラミングしようとしています。私はJuliaセットの画像を作成するアルゴリズムを研究しようとしましたが、ほとんどの例がオンラインで混乱しています(ほとんどの例はコピーされているようですが、ステップごとに何が起こるかほとんど説明していません)。ジュリアは実数で計算する

私は自分のコードをオンラインで見つかったアルゴリズムに合わせて数回書き直しましたが、ほとんど成功しませんでした。現在、私は次のように、各ピクセルの色を定義するために反復機能を使用しています:ループは、私がオンラインで見つける第2のアルゴリズムであるが、また間違っていながら

// Loop through each pixel to work out new image set 
int x, y; 
for(x = 0; x < SIZE; x++){ 
    for(y = 0; y < SIZE; y++){ 

     int i = iterate(x, y, maxIterations, c); 
     image[x][y] = i % 256 + 255 + 255 * (i < maxIterations); 

    } 
} 

/* Iterate function */ 
int iterate(int x, int y, int maxI, double c[]){ 
    double z, zx, zy, oldRe, oldIm; //real and imaginary parts of new and old 
    double xmin = -1.0, xmax = 1.0, ymin = -1.0, ymax = 1.0; 
    int k; // number of times iterated 

    //calculate the initial real and imaginary part of z 
    // z0 = (x + yi)^2 + c = (0 + 0i) + c = c 
    zx = 1.5*(x - SIZE/2)/(0.5*SIZE); 
    zy = 1.0*(y - SIZE/2)/(0.5*SIZE); 

    //start the iteration process 
    for(k = 1; k < maxI; k++){ 
     //remember value of previous iteration 
     oldRe = zx; 
     oldIm = zy; 
     z = zx*zx - zy*zy + c[0]; 

     //the actual iteration, the real and imaginary part are calculated 
     zx = oldRe * oldRe - oldIm * c[1] + c[0]; 
     zy = 2 * oldRe * oldIm + c[1]; 
     zy = 2.0*zx*zy + c[1]; 
     zx = z; 

     //if the point is outside the circle with radius 2: stop 
     if((zx * zx + zy * zy) > 4) break; 
} 

/* 
while(((zx * zx + zy * zy) > 4) && (k < maxI)) { 
    //remember value of previous iteration 
    z = zx*zx - zy*zy + c[0]; 
    zy = 2*x*y-c[1]; 
    zx = z; 
    //if the point is outside the circle with radius 2: stop 
} 
return k; 

} */ コメントアウト。私は方程式から何が欠けているのか分かりません。どんな推測?

(私は解決策を探していません。実数、虚数の複素数をバウンディングボックスの位置(この場合は-1,1)に変換できる擬似コードです)。ここで

+0

複素数型は、C言語でタイプに内蔵されています – Adam

答えて

0

は、私はちょうど

YOUR_CRとYOUR_CIを検証してしまった学校のプロジェクトの読み取り可能なコードでretranscriptionであるあなたがしたいジュリアのための2つの可能な変数、 lower_limitであるとUPPER_LIMIT(XとY)は、ウィンドウに対応このコードでは、フラクタルを描画したいウインドウとズームレベルに出力を正しくスケールする必要があります(限界スケールはピクセルではなくフラクタルの数学的限界にあります)。それは代わりzx,zyの虚数部の計算にx,yを使用するように

# define X 0 
# define Y 1 

# define ZR 0 
# define ZI 1 
# define CR 2 
# define CI 3 

static int   iterations(long double coords[]) 
{ 
    long double  pos[4]; 
    int    i; 
    double   tmp; 

    pos[CR] = YOUR_CR; 
    pos[CI] = YOUR_CI; 
    pos[ZR] = coords[X]; 
    pos[ZI] = coords[Y]; 
    i = 0; 
    while (i < MAX_ITERATIONS && (PYTHAGORE(pos[ZR], pos[ZI]) < 4)) 
    { 
     tmp = pos[ZR]; 
     pos[ZR] = pos[ZR] * pos[ZR] - pos[ZI] * pos[ZI] + pos[CR]; 
     pos[ZI] = 2 * pos[ZI] * tmp + pos[CI]; 
     i++; 
    } 
    return (i); 
} 

# define TRANSLATE_X_PIXEL(a, b) ((int)(((a - LOWER_LIMIT_X)/(UPPER_LIMIT_X - LOWER_LIMIT_X)) * WIDTH)) 
# define TRANSLATE_Y_PIXEL(a, b) ((int)(((a - LOWER_LIMIT_Y)/(UPPER_LIMIT_Y - LOWER_LIMIT_Y)) * HEIGHT)) 

void    julia() 
{ 
    long double  coords[2]; 
    int    itera; 

    coords[X] = LOWER_LIMIT_X; 
    while ((coords[X] += ((UPPER_LIMIT_X - LOWER_LIMIT_X)/
        (double)(WIDTH + 1))) <= UPPER_LIMIT_X) 
    { 
     coords[Y] = LOWER_LIMIT_Y; 
     while ((coords[Y] += ((UPPER_LIMIT_Y - LOWER_LIMIT_Y)/
         (double)(HEIGHT + 1))) <= UPPER_LIMIT_Y) 
     { 
       itera = iterations(coords); 
       set_pixel(TRANSLATE_X_PIXEL(coords[Y]), TRANSLATE_Y_PIXEL(coords[Y]), itera * DESIRED_COLOR); 
     } 
    } 
} 
0

アウトコメントwhileコードが間違っています。あなたのコードは、あるアプローチをとり、その途中で別のアプローチを貼り付けたかのように見えます。

あなたは、古典的な二次ジュリア反復欲しい、それはzxzy両方が両方式で使用して維持する必要があるので、あなたはその場で交換を行うことはできません

znext = z*z + c = (zx+*zy)*(zx+i*zy)+(cx+*cy) 
     = (zx*zx-zy*zy+cx) + i*(2*zx*zy+cy) 

の実数成分で実現であります彼らの古い価値がそこにある。正しいコードは次のようになります

for(k = 1; k < maxI; k++){ 
    // compute the new real part, store temporarily in helper variable 
    double z = zx*zx - zy*zy + c[0]; 
    // compute the imaginary part, since no further operations, do it in place 
    zy = 2.0*zx*zy + c[1]; 
    //store the new real part in the real part variable 
    zx = z; 
    //if the point is outside the circle with radius 2: stop 
    if((zx * zx + zy * zy) > 4) break; 
} 

あなたが正方形を保存する場合は、以下multplicationsが必要になり、1は、z = Z * Z + Cを使用できるように

for(k = 1; k < maxI; k++){ 
    double sqzx = zx*zx, sqzy = zy*zy; 
    // compute the imaginary part first, since the real part only uses the squares, not zy 
    zy = 2.0*zx*zy + c[1]; 
    // compute the new real part using the pre-computed squares 
    zx = sqzx - sqzy + c[0]; 
    //if the point is outside the circle with radius 2: stop 
    if((sqzx + sqzy) > 4) break; 
} 
関連する問題