2015-12-20 19 views
0

我已經從互聯網上覆制這段代碼,但它似乎沒有工作。分形生成代碼只是不工作

它所做的只是在黑色圖片的一個邊緣上畫一條紅線。

我一直在玩它相當長的一段時間,發現當我打印R1,R2和R3的內容,它寫道: (0,0) (0.866025,0) (-0.866025,0 ) 因此,看起來像是一件事情,它顯示錯誤順序的複數的部分,但爲什麼它顯示r1爲零,當它顯然不是?

此外,它似乎是這個代碼不起作用的原因?

GLuint CMyApp::NewtonFractalTexture() 
{ 
const int pic_size = 256; 
unsigned char tex[pic_size][pic_size][3]; 

int MaxCount = 255; 
int color_multiplier = 15; 
float precision = 0.0001; 
std::complex<double> r1 = (1, 0); 
std::complex<double> r2 = (-0.5, sin(2 * PI/3)); 
std::complex<double> r3 = (-0.5, -sin(2 * PI/3)); 

std::cout << r1 << " " << r2 << " " << r3 << std::endl; 
std::cout << abs(r1) << " " << abs(r2) << " " << abs(r3) << std::endl; 

/* 
std::complex<double> roots[birds_num]; 
for (int i = 0; i < birds_num; ++i){ 
    roots[i] = (bird_positions[i][0], bird_positions[i][2]); 
} 
*/ 

for (int i = 0; i < pic_size; ++i){ 
    for (int j = 0; j < pic_size; ++j) 
    { 
     // 
     std::complex<double> z = (i, j); 
     // 
     int count = 0; 
     while (count < MaxCount && abs(z - r1) >= precision && abs(z - r2) >= precision && abs(z - r3) >= precision){ 
      /* 
      std::complex<double> my_numerator = (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]); 
      std::complex<double> my_denominator = (z - roots[0])*(z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[6])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[7])*(z - roots[8]) + 
             (z - roots[0])*(z - roots[1])*(z - roots[2])*(z - roots[3])*(z - roots[4])*(z - roots[5])*(z - roots[6])*(z - roots[7])*(z - roots[8])*(z - roots[8]); 
      */ 
      std::complex<double> my_numerator = z*z*z - 1.0; 
      std::complex<double> my_denominator = z*z * 3.0; 
      if (abs(z) > 0){ 
       z = z - my_numerator/my_denominator; 
      } 
      ++count; 
     } 
     // 
     tex[i][j][0] = 0; 
     tex[i][j][1] = 0; 
     tex[i][j][2] = 0; 
     // 
     if (abs(z - r1) < precision){ 
      tex[i][j][0] = 255 - count * color_multiplier; 
     } 
     if (abs(z - r2) <= precision){ 
      tex[i][j][1] = 255 - count * color_multiplier; 
     } 
     if (abs(z - r3) <= precision){ 
      tex[i][j][2] = 255 - count * color_multiplier; 
     } 
     // 
    } 
} 

GLuint tmpID; 

// generáljunk egy textúra erőforrás nevet 
glGenTextures(1, &tmpID); 
// aktiváljuk a most generált nevű textúrát 
glBindTexture(GL_TEXTURE_2D, tmpID); 
// töltsük fel adatokkal az... 
gluBuild2DMipmaps( GL_TEXTURE_2D,   // aktív 2D textúrát 
        GL_RGB8,    // a vörös, zöld és kék csatornákat 8-8 biten tárolja a textúra 
        pic_size, pic_size,  // kép méretének megadása 
        GL_RGB,     // a textúra forrása RGB értékeket tárol, ilyen sorrendben 
        GL_UNSIGNED_BYTE,  // egy-egy színkopmonenst egy unsigned byte-ról kell olvasni 
        tex);     // és a textúra adatait a rendszermemória ezen szegletéből töltsük fel 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // bilineáris szűrés kicsinyítéskor 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // és nagyításkor is 
glBindTexture(GL_TEXTURE_2D, 0); 

return tmpID; 
} 

回答

1

你沒有正確初始化你的複數。你要麼需要使用

std::complex<double> r1(1, 0); 

std::complex<double> r1 {1, 0}; 

(注意這裏的大括號)。

r1(1,0)是一個構造呼叫,r1{1,0}是均勻的初始化,r1 = (1,0)相同r1 = 0因爲(1,0)是一種利用逗號運算符的,其值是最後一個表達式。

+0

哦,那傷害我沒有注意到,也許我最好休息一下。 :S – user1733

+0

@juanchopanza'r1(1,0)'是一個構造函數調用,'r1 {1,0}'是一致初始化,'r1 =(1,0)'與'r1 = 0'相同,因爲'(1,0)'是逗號運算符的用法,其值是最後一個表達式。 – 1201ProgramAlarm

+0

你不必向我解釋(我知道)。我的意思是如果你解釋這個,你的答案會更好,更有用。 – juanchopanza