数列の発散、収束を計算していた関数と、それに関連する部分を少しだけ変えたプログラムを次に示す。発散する点においては、発散するまでに計算した回数を利用して色付けした。
#include <complex>
#include <eggx.h>
using namespace std;
#define BASE_SCALE 300
#define RE_START -2
#define RE_END 1
#define RE_LENGTH (RE_END - RE_START)
#define RE_STEP ((double)RE_LENGTH/WIDTH)
#define RE2X(r) (int)((r-RE_START)*BASE_SCALE)
#define IM_START -1
#define IM_END 1
#define IM_LENGTH (IM_END - IM_START)
#define IM_STEP ((double)IM_LENGTH/HEIGHT)
#define IM2Y(i) (int)((i-IM_START)*BASE_SCALE)
#define WIDTH (BASE_SCALE * RE_LENGTH)
#define HEIGHT (BASE_SCALE * IM_LENGTH)
#define INF 2
#define MAX_ITER 1000
#define EGGX_BLACK 0
int calc(complex<double> c)
{
int n;
complex<double> z;
for (n = 0; n < MAX_ITER; n++) {
z = z*z + c;
if (abs(z) >= INF)
return n%15+1;
}
return EGGX_BLACK;
}
void draw(int win)
{
double re, im;
for (re = RE_START; re <= RE_END; re += RE_STEP) {
for (im = IM_START; im <= IM_END; im += IM_STEP) {
int color = calc(complex<double>(re, im));
newpen(win, color);
pset(win, RE2X(re), IM2Y(im));
}
}
}
int main()
{
int win;
gsetinitialbgcolor("gray");
win = gopen(WIDTH, HEIGHT);
draw(win);
ggetch();
gclose(win);
return 0;
}

0 件のコメント:
コメントを投稿