//=============================================C // AppletによるMandelbrot setの描画    C // Xは0+0iで定数C=cr+ci*iの値を変更 C //---------------------------------------------C // 描画ボタンをクリックすると描画 C // ベキ数nは2,3,4,5,6,7,8,9,10から選択 C // 表示idは0,1から選択 C // id=0 -->回数で表示, id=1 --> 値で表示 C // 種別mdは0,1から選択 C // md=0 -->通常, md=1,2 --> スケーリング C // 定数Cの値を画面から選定 C // C=cr+ci*iでcr,ciは-1.0から1.0 C //---------------------------------------------C // 2009年5月4日 後 保範(東京工芸大学) C //=============================================C import java.applet.*; import java.awt.*; import java.awt.event.*; public class mandel2 extends Applet { int n, id, md; double cr, ci, Scl; double sdim[] = {0.5, 0.8, 1.0, 1.2, 1.5, 2.0}; Button btn; //ボタンの設定 Choice n_v; //ベキ数nのアイテム設定 Choice sl_v; //倍率slのアイテム設定 Choice cr_v; //実数crのアイテム設定 Choice ci_v; //虚数ciのアイテム設定 Choice id_v; //表示idのアイテム設定 Choice md_v; //種別mdのアイテム設定 // 初期値の設定 public void init() { Label La1=new Label("n="); n_v = new Choice(); //ベキ数nの選択 for (int i=0; i<=10; i++) //nの選定リスト { n_v.addItem(""+(i+2)); } n_v.select(4); n = 6; //nの初期値 Label La2=new Label("倍率="); sl_v = new Choice(); //slの選択 for (int i=0; i<=4; i++) //slの選定リスト { sl_v.addItem(""+sdim[i]); } sl_v.select(2); Scl = 1.0; //slの初期値 Label La3=new Label("C="); cr_v = new Choice(); //実数crの選択 for (int i=-10; i<=10; i++) //crの選定リスト { cr_v.addItem(""+(i/10.0)); } cr_v.select(13); cr = 0.3; //crの初期値 ci_v = new Choice(); //虚数crの選択 for (int i=-10; i<=10; i++) //ciの選定リスト { ci_v.addItem(""+(i/10.0)); } ci_v.select(5); ci = -0.6; //ciの初期値 Label La4=new Label("表,種="); id_v = new Choice(); //idの選択 for (int i=0; i<=1; i++) //idの選定リスト { id_v.addItem(""+i); } id_v.select(1); id = 1; //idの初期値 md_v = new Choice(); //mdの選択 for (int i=0; i<=2; i++) //mdの選定リスト { md_v.addItem(""+i); } md_v.select(1); md = 1; //mdの初期値 btn = new Button("描画"); //描画ボタン add(La1); add(n_v); //パネルへnを追加 add(La2); add(sl_v); //パネルへnを追加 add(La3); add(cr_v); //パネルへnを追加 add(ci_v); //パネルへnを追加 add(La4); add(id_v); //パネルへidを追加 add(md_v); //パネルへmdを追加 add(btn); //パネルへボタン追加 btn.addActionListener(new ActionAdp()); //ボタン処理 n_v.addItemListener(new ItemAdp()); //アイテム追加 sl_v.addItemListener(new ItemAdp()); //アイテム追加 cr_v.addItemListener(new ItemAdp()); //アイテム追加 ci_v.addItemListener(new ItemAdp()); //アイテム追加 id_v.addItemListener(new ItemAdp()); //アイテム追加 md_v.addItemListener(new ItemAdp()); //アイテム追加 } // ボタンクリックの実装クラス */ class ActionAdp implements ActionListener { public void actionPerformed(ActionEvent e) { if (e.getSource() == btn) //「描画」クリック { repaint(); } //再描画 } } // アイテム(n,id)の実装クラス */ class ItemAdp implements ItemListener { public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source == n_v) //nの選定 { n = n_v.getSelectedIndex() + 2; } if (source == sl_v) //Sclの選定 { Scl = sdim[sl_v.getSelectedIndex()]; } if (source == cr_v) //crの選定 { cr = cr_v.getSelectedIndex()/10.0 - 1.0; } if (source == ci_v) //ciの選定 { ci = ci_v.getSelectedIndex()/10.0 - 1.0; } if (source == id_v) //idの選定 { id = id_v.getSelectedIndex(); } if (source == md_v) //mdの選定 { md = md_v.getSelectedIndex(); } } } // 描画処理 public void paint(Graphics g) { int xs=500, ys=500; //描画のサイズ double X[] = new double[2]; //複素数計算配列 double Z[] = new double[2]; //複素数計算配列 // double Scl=1.0; //ズーム比率 double XP=0.0, YP=0.0; //ズームする中心座標 double sR=1.0, sG=1.0, sB=1.0; //赤、緑、青の色合い double Xsl = 2.0/Scl; //画面座標-->計算座標 double Ysl = Xsl*ys/xs; //(x,y) --> (XR,XI) double VL = Math.exp(300.0/n); double CR = cr, CI = ci; //Cの初期値 for (int y=10; y= 1){ double ABS; if(md == 1) { ABS = Math.abs(XR + XI); } else { ABS = 2*Math.abs(XR) - Math.abs(XI); } ABS = Math.sqrt(Math.sqrt(ABS)); if(ABS > 1.0e-10) { XR /= ABS; XI /= ABS; } } LP ++; if(Math.abs(XR)+Math.abs(XI) > VL) break; //発散 } int b=0, r=0, gr=0; //収束なら黒 // 発散する回数による描画 if (id == 0) { r = (LP%3)*70 + 30; b = (LP%5)*42 + 30; gr = (LP%7)*30 + 30; if(LP >= 200) { r = b = gr = 0; } } // 発散時の値による描画 if (id == 1) { double AR = Math.abs(XR); double AI = Math.abs(XI); if(AR > 1.0) { b=(int)(sB*Math.log(AR))+1; } //青のセット if(AI > 1.0) { r=(int)(sR*Math.log(AI))+1; } //赤のセット if(XR < -1.0) { gr += b; b = b/2; } //緑のセット if(XI < -1.0) { gr += r; r = r/2; } gr = (int)(sG*gr); } if(b > 255) b = 255; if(r > 255) r = 255; if(gr > 255) gr = 255; g.setColor(new Color(r,gr,b)); //色の設定 g.drawLine(x, y+20, x, y+20); //点を描く } } g.setColor(new Color(180,180,180)); g.fillRect(0,0, xs,35); } //複素数のn乗計算 public void CXN(int n, double x[],double z[]){ double W0, W1; W0 = x[0]; W1 = x[1]; for (int k=1; k