2

さて、これは私が問題を抱えている奇妙なものです(ところでgccでコンパイルされています)

以下は、コマンド プロンプト用のマンデルブロ フラクタル ジェネレーターのソースです。私は以前にこれを行ったことがあり、コマンドプロンプトでマンデルブロフラクタルを実際に生成するために必要なコードをどれだけ速く生成できるかを確認するために、自分でスピードテストを行いたいと思いました。ときどき私はこれをやって、楽しみのために自分自身をテストします

とにかく、私は新しい問題に遭遇しましたが、何が問題なのかよくわかりません。フラクタルがレンダリングされると、反復回数や設定した escapeValue に関係なく、常に楕円として表示されます! それを行うべきではありません。

mandelbrot/cpp オタクの皆さん、私が「mandelbrot」の形にならない理由を特定するのを手伝ってくれませんか?

#include <stdio.h>
#include <math.h>

#define DOSWidth 80
#define DOSHeight 25

int iterations = 1024;
float escapeValue = 3.0f;

struct ivar {
    ivar(float _x, float _i) {
        x = _x;
        i = _i;
    }
    void log() {printf("(%g%c%gi)", x, (i<0)?'-':'+', fabs(i));}
    float magnitude() {return sqrtf(x*x+i*i);}
    ivar square() {return ivar(x, i)*ivar(x, i);}

    ivar operator + (ivar v) {return ivar(x+v.x, i+v.i);};
    ivar operator - (ivar v) {return ivar(x-v.x, i-v.i);};
    ivar operator * (ivar v) {return ivar(x*v.x-(i*v.i), x*v.i+i*v.x);};

    float x, i;
};

struct rect {
    rect(float _x, float _y, float _width, float _height) {
        x = _x;y = _y;width = _width;height = _height;
    }

    void setCenter(float cx, float cy) {
        x = cx-width/2.0f;
        y = cy-width/2.0f;
    }

    void log() {printf("(%f, %f, %f, %f)", x, y, width, height);}

    float x, y;
    float width, height;
};

int main() {
    rect region = rect(0, 0, 2.5f, 2.0f);
    region.setCenter(0, 0);
    float xSize = region.width / (float)DOSWidth;
    float ySize = region.height / (float)DOSHeight;
    for(int y=0;y<DOSHeight;y++) {
        for(int x=0;x<DOSWidth;x++) {
            ivar pos = ivar(x*xSize+region.x, y*ySize+region.y);
            bool escapes = false;
            for(int i=0;i<iterations;i++) {
                if(pos.magnitude() > escapeValue) {
                    escapes = true;
                    break;
                }
                pos = pos.square();
            }
            if(escapes)printf(" ");
            else printf("X");
        }
    }
}

ここまでたどり着いてくれてありがとう、助けてくれてありがとう!

4

2 に答える 2

3

posその大きさが制限を超えるまで、再帰的に二乗しています。それはフラクタルを生成しません。単位円になります。

反復ごとに (x,y) 座標を二乗値に追加する必要があります。ウィキペディアを参照してください。

編集: いくつかの小さな変更と出来上がり

于 2012-12-25T10:04:36.417 に答える
0

エスケープ値が低すぎるため、4.00f にする必要があります。

于 2012-12-25T10:01:28.033 に答える