簡體   English   中英

分形生成代碼不起作用

[英]Fractal generating code just not working

我已經從互聯網上復制了此代碼,但似乎沒有用。

它所做的只是在它制作的黑色圖片的一側畫一條紅線。

我已經玩了很長時間了,發現當我打印r1,r2和r3的內容時,它寫道:(0,0)(0.866025,0)(-0.866025,0)所以這似乎是一回事,它以錯誤的順序顯示復數的各個部分,但是為什么在r1明顯不是的情況下卻顯示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;
}

您沒有正確初始化復數。 您要么需要使用

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 )是使用逗號運算符,其值為最后一個表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM