2015-12-20 4 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