Created
November 21, 2019 10:57
-
-
Save mt1682/22cb8461372de2938f24cda635ed1954 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <math.h> | |
#define NUM 1000 //出力画像の1辺のピクセル数 | |
#define re_range_min 1.012 //出力画像として切り出す部分の横軸範囲 | |
#define re_range_max 1.015 //出力画像として切り出す部分の横軸範囲 | |
#define im_range_min 0.255 //出力画像として切り出す部分の縦軸範囲 | |
#define im_range_max 0.258 //出力画像として切り出す部分の縦軸範囲 | |
#define calc 1000 //計算回数 | |
typedef struct{ | |
double re; | |
double im; | |
}COMPLX ; | |
COMPLX c_set(double a, double b); | |
COMPLX c_pow2(COMPLX x); | |
COMPLX c_opr(COMPLX a, char mode, COMPLX b); | |
double c_abs(COMPLX x); | |
int main(void) | |
{ | |
COMPLX z, alpha; | |
int x, y, j, time=0; | |
double bit_re, bit_im; | |
int colour_r, colour_g, colour_b; | |
//複素数平面の設定:ここから | |
for(y=0; y<NUM; y++){ | |
for(x=0 ;x<NUM; x++){ | |
bit_re = re_range_min+(re_range_max - re_range_min) * (double)x / (double)NUM; | |
bit_im = im_range_min+(im_range_max - im_range_min) * (double)y / (double)NUM; | |
//複素数平面の設定:ここまで | |
alpha = c_set(bit_re, bit_im); | |
z = alpha; | |
time = 0; | |
for(j=0; j<calc; j++){ | |
z = c_opr(c_pow2(z), '-' , alpha); //{Z_n+1 = (Z_n)^2 - α}の計算 | |
time++; | |
if(c_abs(z) >= 2.0){ | |
break; | |
} | |
} | |
colour_r = (time + 'r'/4 * 'R'/4)%255; //1000回未満の時の色設定:赤 | |
colour_g = (time + 'g'/2 * 'G'/2)%255; //1000回未満の時の色設定:緑 | |
colour_b = (time + 'b'/3 * 'B'/3)%255; //1000回未満の時の色設定:青 | |
if(time < calc) | |
printf("%d,%d,%d\n", colour_r, colour_g, colour_b); | |
else | |
printf("0,0,0\n"); //1000回を超えた時(マンデルブロの中身)の色設定 | |
} | |
} | |
return 0 ; | |
} | |
//複素数の設定 | |
COMPLX c_set(double a, double b) | |
{ | |
COMPLX result; | |
result.re = a; | |
result.im = b; | |
return result; | |
} | |
//複素数の二乗を求める関数 | |
COMPLX c_pow2(COMPLX x) | |
{ | |
COMPLX result; | |
result.re = x.re * x.re - x.im * x.im; | |
result.im = 2.0 * x.re * x.im; | |
return result; | |
} | |
//複素数の絶対値を求める関数 | |
double c_abs(COMPLX x) | |
{ | |
double a, b; | |
a = pow(x.re, 2); | |
b = pow(x.im, 2); | |
return sqrt(a + b) ; | |
} | |
//複素数の四則演算を定義する関数 | |
COMPLX c_opr(COMPLX a, char mode, COMPLX b) | |
{ | |
COMPLX c ; | |
switch( mode ) { | |
case '+' : c.re = a.re + b.re; | |
c.im = a.im + b.im; | |
return c ; | |
case '-' : c.re = a.re - b.re; | |
c.im = a.im - b.im; | |
return c ; | |
case '*' : c.re = a.re*b.re - a.im*b.im; | |
c.im = a.im*b.re + a.re*b.im ; | |
return c ; | |
case '/' : c.re = (a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im); | |
c.im = (a.im*b.re+a.re*b.im)/(b.re*b.re+b.im*b.im); | |
return c ; | |
default : return a ; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment