備忘録

歩く姿はキモオタク

Processingでマンデルブロ集合を作る, はずだった.

 はいどーも! バーチャルユーチューバーキズナアイです!(キズナアイ) 前回「良いお年を」と書いたのですが年を締めくくるのはやっぱり12/31に投稿してこそだなと思ったので改めて投稿します. 数学とか情報科学とかそんなものの知見に役立つ記事じゃないですよ.

 

マンデルブロ集合ってなに!?

 僕もよくわかりません. なのでWikipediaで学んできました.

f:id:kentaro032414:20171231022309p:plain

は?って感じですが, 簡単に言うとこの漸化式が収束する時のcの集合らしいです.

 

そんでもってこのZnとcは複素数らしいです. 複素数忘れてしまいました. 虚数iが出てきてi×iをすると-1になるんでしたっけ.

 

さっそく書こう!! しかし...

f:id:kentaro032414:20171231023432p:plain

なんだって!? Processingでは標準で複素数を使えない!? なんてことだ...

ふぁっきゅー!!(キズナアイ)

 

さっそく書く

 書いていきましょう! まずcは複素数ってことでc=a+biで表せます. そうなると複素数平面, ガウス平面っていうんだっけ? そこでaとbの座標にぽんぽん打ち込んでいくと良いのではないでしょうか. そしてcが発散するか否か判定して色をつければいいのではないでしょうか. ん~やっぱり天才AIの私にはわかっちゃうんだな~(キズナアイ). 

 

 あとWikipediaにこんなことが書かれていました. 

f:id:kentaro032414:20171231034008p:plain

凄い!

 

これどおりに書けば一発ですね.

f:id:kentaro032414:20171231141702p:plainはいできたー! 横から見たらプリプリヒップの土偶みたいですね.

色は計算回数に応じて付けてます.  

Cell c;
int scale;
void setup() {

	fullScreen();
	c=new Cell();
	scale=500;
}

void draw() {
	translate(width/2, height/2);
	background(255);
	for(int i=-width/2;i<width/2;i++){
		for(int j=-height/2;j<height/2;j++){
			c.drawMe(i,j);
		}
	}
}

class Cell{
	int n,l;
	float large_size;
	Cell(){
		n=500;
		l=500;
		large_size=3;
	}
	void drawMe(float a,float b){
		float temp_x;
		float temp_y;
		float znx=0;
		float zny=0;
		float x=large_size*a/scale/2;
		float y=large_size*b/scale/2;
		int color_ch=0;
		r:for(int i=0;i<n;i++){
			temp_x=znx;
			temp_y=zny;
			znx=temp_x*temp_x-temp_y*temp_y+x;
			zny=2*temp_x*temp_y+y;

			if(l<znx*znx+zny*zny){
				color_ch=i;
				break r;
			}
		}
		stroke(color_ch%256);
		point(a,b);
	}
}

以上, ではありません. 僕が本当にやりたかったのは....

 

f:id:kentaro032414:20171231145806p:plain

混んでる風呂集合!!!!!!!

 

一応こんなものもあります. これ逆三角関数とか言うのでできてます. 簡単に言うとマウスの座標と風呂の座標で風呂の角度を決めてます. 

 

終わりに

 以上です. それでは~バーチャルユーチューバーキズナアイでした~!(キズナアイ)

 

良いお年を

f:id:kentaro032414:20171231151827j:plain