Skip to content

Instantly share code, notes, and snippets.

@mt1682
Created November 21, 2019 10:57
Show Gist options
  • Save mt1682/22cb8461372de2938f24cda635ed1954 to your computer and use it in GitHub Desktop.
Save mt1682/22cb8461372de2938f24cda635ed1954 to your computer and use it in GitHub Desktop.
#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