/* マンデルブロ集合図形をaitendo 3.2インチ液晶に表示 色割付け改良版 ラジオペンチ 2015/01/19 http://radiopench.blog96.fc2.com/ */ #include // UTFTライブラリを使用 extern uint8_t SmallFont[]; // フォント定義 int NMAX=256; // 計算回数MAX指定(大きいほど精度上がるが計算時間がかかる) // x0,y0,xLengの値を指定。下記はデモ用の値 /* float x0 = -1; // 全体像 float y0 = 1; float xLeng = 3; // X軸の範囲 Yは X*210/320 */ /* float x0 = 0.1; // 上の丸 float y0 = 0.94; float xLeng = 0.2; */ /* float x0 = 0.125; // 上の丸の右 float y0 = 0.856; float xLeng = 0.05; */ /* float x0 = 0.125; // 上の丸の付け根付近 float y0 = 0.856; float xLeng = 0.025; */ /* float x0 = 0.2; // float y0 = 0.88; float xLeng = 0.1; */ /* float x0 = 0.35; // 本体右上の丸 float y0 = 0.7; float xLeng = 0.3; */ float x0 = 1.3; // 右の丸から上に出る炎 float y0 = 0.116; float xLeng = 0.1; UTFT myGLCD(SSD1289_8,A0,A1,A2,A3); // aitendoのM032C1289TP (QVGA) void setup(){ myGLCD.InitLCD(); // 液晶初期化 myGLCD.clrScr(); // 画面クリア myGLCD.setColor(255, 255, 255); myGLCD.setFont(SmallFont); myGLCD.print("Mandelbort set written by Arduino", CENTER, 0); myGLCD.print("Jan.15.2014 radiopench", RIGHT, 228); myGLCD.print("NMAX=", LEFT, 228); myGLCD.printNumI(NMAX, 40, 228); // 左下に計算条件を表示 for(int x=0; x<=255; x++){ // 上にカラーバー表示 ColorSet(x); myGLCD.drawPixel(x+32, 13); // 画面にプロット } } void loop(){ float x, y; int mResult, c; int px=0; int py=15; int r, g, b; for(x = x0; x < x0 + xLeng; x += xLeng / 320.0){ py=15; for(y = y0; y > y0 - xLeng *210.0/320.0 ; y -= xLeng / 320.0){ mResult=mandelbrot(x, y); // マンデルブロ判定 if(mResult==0){ // 内側なら myGLCD.setColor(0,0,0); // 黒で塗る } else{ // 外側なら ColorSet(mResult); // 表示色を決定 } myGLCD.drawPixel(px, py); // 画面にプロット py++; } px++; } for(;;){ // 無限ループで停止 } } int mandelbrot(float a, float b){ // マンデルブロ判定 float x = 0.0, y = 0.0, x1, y1; for(int n=1; n < NMAX; n++){ x1 = x * x - y * y - a; y1= 2.0 * x * y - b; if( x1 * x1 + y1 * y1 > 4.0 ){ return n; // 発散検出したらその回数を返す } x = x1; // 次のループ用に値を更新 y = y1; } return 0; // 指定回数内で発散しなければ収束とみなす } void ColorSet(int x){ // 値により色を設定 int r,g,b; int L1=10; // 青とするxの値 int L2=20; // 紫 int L3=35; // 赤 int L4=50; // 黄 int L5=70; // 緑 int L6=100; // 水 int L7=140; // 白 if(x < L1){ r=0; g=0; b=127+(127*x)/L1; // 真っ黒にならないように127で開始 } else if(x < L2){ r=(255*(x-L1))/(L2-L1); g=0; b=255; } else if(x < L3){ r=255; g=0; b=255-(255*(x-L2))/(L3-L2); } else if(x < L4){ r=255; g=(255*(x-L3))/(L4-L3); b=0; } else if(x < L5){ r=255-(255*(x-L4))/(L5-L4); g=255; b=0; } else if(x < L6){ r=0; g=255; b=(255*(x-L5))/(L6-L5); } else if(x < L7){ r=(255*(x-L6))/(L7-L6); g=255; b=255; } else { // ここまで来たら白しか無い r=255; g=255; b=255; } myGLCD.setColor(r,g,b); // 表示色セット }