ジェネラティブアート論

提供:kuhalaboWiki
(版間での差分)
移動: 案内, 検索
(自己相似系)
(複素平面フラクタル)
174行: 174行:
  
 
[http://www.gaia.h.kyoto-u.ac.jp/~fractal/ フラクタル日除け]
 
[http://www.gaia.h.kyoto-u.ac.jp/~fractal/ フラクタル日除け]
 
== 複素平面フラクタル ==
 
*[http://blossom.media.t-kougei.ac.jp/~kuha/tutorial0/bioart/9_complex.pdf 配布資料PDF]
 
*[http://blossom.media.t-kougei.ac.jp/~kuha/tutorial0/bioart/mandelv3.exe 複複素平面フラクタル図形描画ソフトウェア for Windows]
 
**注)comdlg32.ocxがない場合は,[http://www.microsoft.com/downloads/ja-jp/details.aspx?displaylang=ja&FamilyID=7B9BA261-7A9C-43E7-9117-F673077FFB3C ここ]からRuntimeファイル群をダウンロードしてください。
 
 
[http://www.youtube.com/watch?v=0fKBhvDjuy0 Powers of Ten]
 
 
=== C#の座標変換 ===
 
;座標原点
 
原点を移動するには、TranslateTransformメソッドを使う。
 
<pre>
 
          g.TranslateTransform(x1,y1); //座標原点を(x1,y1)に移動
 
</pre>
 
 
;座標の回転
 
座標軸をth度(degree)だけ回転するには、RotateTransformメソッドを使う。
 
 
<pre>
 
           g.RotateTransform(th);
 
</pre>
 
 
;座標軸のスケール、方向
 
座標スケールを変換するには、ScaleTransformメソッドを使う。
 
<pre>
 
            g.ScaleTransform(scx,scy);  //X軸をscx倍、Y軸をscy倍する
 
</pre>
 
X軸は右、Y軸は下が正方向なので、座標軸方向を反転するには、次のとおり。
 
<pre>
 
       g.ScaleTransform(1,-1);  //Y軸方向の反転
 
       g.ScaleTransform(-1,1);  //X軸方向の反転
 
</pre>
 
 
=== 複素平面フラクタルの描画 ===
 
;自己平方の描画プログラム
 
<pre>
 
            Graphics g = pictureBox1.CreateGraphics();
 
            g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); //原点を中央に移動
 
            g.ScaleTransform(1, -1); //Y軸の向きを反転
 
            Pen pen = new Pen(Color.White);
 
 
            int Xmax = pictureBox1.Width / 2;
 
            int Xmin = -pictureBox1.Width / 2;
 
            int Ymax = pictureBox1.Height / 2;
 
            int Ymin = -pictureBox1.Height / 2;
 
            double Rmax = 0.5;
 
            double Rmin = -0.5;
 
            double Imax = 0.5;
 
            double Imin = -0.5;
 
            double Zr, newZr;
 
            double Zi, newZi;
 
            double Ar = -0.2;
 
            double Ai = 0.675;
 
            int Nmax = 100;
 
            int Rstep = 1; // 何ピクセルごとに計算するか
 
            int Istep = 1;
 
 
            for (int x = Xmin; x < Xmax; x = x + Rstep)
 
            {
 
                for (int y = Ymin; y < Ymax; y = y + Istep)
 
                {
 
                    Zr = ( x - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin; // pictureBoxの座標を複素平面Zの座標に変換
 
                    Zi = ( y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
                    int n = 0;
 
                    while ( Zr * Zr + Zi * Zi < 4 & n < Nmax )
 
                    {
 
                        newZr = Zr * Zr - Zi * Zi + Ar; // f(z) = X^2 * Aの実数部
 
                        newZi = 2 * Zr * Zi + Ai; // f(z) = X^2 * Aの虚数部
 
                        Zr = newZr;
 
                        Zi = newZi;
 
                        n++;
 
                    }
 
                    if (n < Nmax)
 
                    {
 
                        pen.Color = Color.FromArgb(255, n * 255 / Nmax, 0, 0);//nの数に応じて色分ける
 
                        g.DrawRectangle(pen, x, y, 1, 1);
 
                    }
 
                }
 
            }
 
</pre>
 
 
;マンデルブロー集合の描画プログラム
 
<pre>
 
            Graphics g = pictureBox1.CreateGraphics();
 
            g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); //原点を中央に移動
 
            g.ScaleTransform(1, -1); //Y軸の向きを反転
 
            Pen pen = new Pen(Color.White);
 
 
            int Xmax = pictureBox1.Width / 2;
 
            int Xmin = -pictureBox1.Width / 2;
 
            int Ymax = pictureBox1.Height / 2;
 
            int Ymin = -pictureBox1.Height / 2;
 
            double Rmax = 1.5;
 
            double Rmin = -1.5;
 
            double Imax = 1.5;
 
            double Imin = -1.5;
 
            double Zr, newZr;
 
            double Zi, newZi;
 
            double Cr;
 
            double Ci;
 
            int Nmax = 50;
 
            int Rstep = 1; // 何ピクセルごとに計算するか
 
            int Istep = 1;
 
 
            for (int x = Xmin; x < Xmax; x = x + Rstep)
 
            {
 
                for (int y = Ymin; y < Ymax; y = y + Istep)
 
                {
 
                    Cr = ( x - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin; // pictureBoxの座標を複素平面Cの座標に変換
 
                    Ci = ( y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
                    int n = 0;
 
                    Zr = 0.0;
 
                    Zi = 0.0;
 
                    while (Zr * Zr + Zi * Zi < 4 & n < Nmax)
 
                    {
 
                        newZr = Zr * Zr - Zi * Zi + Cr; // f(z) = X^2 * Cの実数部
 
                        newZi = 2 * Zr * Zi + Ci; // f(z) = X^2 * Cの虚数部
 
                        Zr = newZr;
 
                        Zi = newZi;
 
                        n++;
 
                    }
 
                    if (n < Nmax)
 
                    {
 
                        pen.Color = Color.FromArgb(255, 0, n * 255 / Nmax, 0);//nの数に応じて色分ける
 
                        g.DrawRectangle(pen, x, y, 1, 1);
 
                    }
 
                }
 
            }
 
</pre>
 
 
;Julia集合
 
<pre>
 
            Graphics g = pictureBox1.CreateGraphics();
 
            g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); //原点を中央に移動
 
            g.ScaleTransform(1, -1); //Y軸の向きを反転
 
            Pen pen = new Pen(Color.White);
 
 
            int Xmax = pictureBox1.Width / 2;
 
            int Xmin = -pictureBox1.Width / 2;
 
            int Ymax = pictureBox1.Height / 2;
 
            int Ymin = -pictureBox1.Height / 2;
 
            double Rmax = 1.5;
 
            double Rmin = -1.5;
 
            double Imax = 1.5;
 
            double Imin = -1.5;
 
            double Xr, Xr2, XrXi23, newXr;
 
            double Xi, Xi2, newXi;
 
            double Dr;
 
            double Di;
 
            int Nmax = 50;
 
            int Rstep = 1; // 何ピクセルごとに計算するか
 
            int Istep = 1;
 
 
            for (int x = Xmin; x < Xmax; x = x + Rstep)
 
            {
 
                for (int y = Ymin; y < Ymax; y = y + Istep)
 
                {
 
                    Xr = ( x - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin; // pictureBoxの座標を複素平面Cの座標に変換
 
                    Xi = ( y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
                    int n = 0;
 
                    Dr = 1.0;
 
                    Di = 1.0;
 
                    while (Dr + Di > 0.001 & n < Nmax)
 
                    {
 
                        Xr2 = Xr * Xr;
 
                        Xi2 = Xi * Xi;
 
                        XrXi23 = (Xr2 + Xi2) * (Xr2 + Xi2) / 3;
 
                        newXr = Xr * 2 / 3 + (Xr2 - Xi2) / XrXi23; // f(z) = X^2 * Cの実数部
 
                        newXi = Xi * 2 / 3 - 2 * Xr * Xi / XrXi23; // f(z) = X^2 * Cの虚数部
 
                        Dr = Math.Abs(newXr - Xr);
 
                        Di = Math.Abs(newXi - Xi);
 
                        Xr = newXr;
 
                        Xi = newXi;
 
                        n++;
 
                    }
 
                    if (n < Nmax)
 
                    {
 
                        int rr = n * 255 / Nmax;
 
                        int gg = 0;
 
                        int bb = 0;
 
                        pen.Color = Color.FromArgb(255, rr, gg, bb);//nの数に応じて色分ける
 
                        g.DrawRectangle(pen, x, y, 1, 1);
 
                    }
 
                }
 
            }
 
</pre>
 
 
=== 配色の工夫 ===
 
 
個々の色の差をハッキリさせる。
 
<pre>
 
    int rr = (n % 13 + 1) * 255 / 14;
 
    int gg = (n % 11 + 1) * 255 / 12;
 
    int bb = (n % 7 + 1) * 255 / 8;
 
    pen.Color = Color.FromArgb(255, rr, gg, bb);
 
    g.DrawRectangle(pen, x, y, Rstep, Istep);
 
</pre>
 
 
ピクセルの目を粗くした時に、矩形の中身を塗りつぶす。
 
<pre>
 
    pen.Color = Color.FromArgb(255, rr, gg, bb);
 
    brush.Color = Color.FromArgb(255, rr, gg, bb);
 
    g.DrawRectangle(pen, x, y, Rstep, Istep);
 
    g.FillRectangle(brush, x, y, Rstep, Istep);
 
</pre>
 
 
Ar, Ai, Rstep, Istepなどをテキストボックスから入力する。
 
<pre>
 
            Ar = double.Parse(textBox1.Text);
 
            Ai = double.Parse(textBox2.Text);
 
 
            Rstep = int.Parse(textBox3.Text);
 
            Istep = Rstep;
 
</pre>
 
 
=== いろいろカスタマイズ ===
 
 
*複素平面の座標のスケールをラベルに表示する。
 
*マウスドラッグで、新しく描画する範囲を選択する。
 
*選択領域を正方形にするかどうかを、チェックボックスで指定する。
 
<pre>
 
        // グローバルに宣言
 
        Point MD = new Point();//マウスダウンの位置
 
        Point MU = new Point(); //マウスアップの位置
 
 
        bool view = false;//選択領域を描画するかどうかの判定
 
        bool view2 = false;
 
        Graphics g;
 
        int Xmax;
 
        int Xmin;
 
        int Ymax;
 
        int Ymin;
 
 
        double Rmax;
 
        double Rmin;
 
        double Imax;
 
        double Imin;
 
 
        double Rmax2;//マウスドラッグで指定した新しい範囲
 
        double Rmin2;
 
        double Imax2;
 
        double Imin2;
 
 
        public Form1()
 
        {
 
            InitializeComponent();
 
            g = pictureBox1.CreateGraphics();
 
            g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2); //原点を中央に移動
 
            g.ScaleTransform(1, -1); //Y軸の向きを反転
 
            view2 = true;
 
 
            Xmax = pictureBox1.Width / 2;
 
            Xmin = -pictureBox1.Width / 2;
 
            Ymax = pictureBox1.Height / 2;
 
            Ymin = -pictureBox1.Height / 2;
 
 
            Rmax2 = 0.5;
 
            Rmin2 = -0.5;
 
            Imax2 = 0.5;
 
            Imin2 = -0.5;
 
            Rmax = Rmax2;
 
            Rmin = Rmin2;
 
            Imax = Imax2;
 
            Imin = Imin2;
 
 
            label1.Text = null;
 
            label2.Text = null;
 
            label3.Text = null;
 
            label4.Text = null;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
 
        private void button1_Click(object sender, EventArgs e)
 
        {
 
            Pen pen = new Pen(Color.White);
 
            SolidBrush brush = new SolidBrush(Color.FromArgb(90, 200, 200, 200));
 
 
            g.Clear(Color.Black); //描画領域をクリア(黒で塗りつぶす)
 
 
            Rmax = Rmax2;
 
            Rmin = Rmin2;
 
            Imax = Imax2;
 
            Imin = Imin2;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
 
            label5.Refresh();
 
            label6.Refresh();
 
            label7.Refresh();
 
            label8.Refresh();
 
            view2 = true;
 
 
            double Zr, newZr;
 
            double Zi, newZi;
 
            double Ar = -0.2;
 
            double Ai = 0.675;
 
//            double Ar = -0.3;
 
//            double Ai = 0.63;
 
            Ar = double.Parse(textBox1.Text);//テキストボックスから値を取得
 
            Ai = double.Parse(textBox2.Text);
 
 
            int Nmax = 500;
 
            int Rstep = 3; // 何ピクセルごとに計算するか
 
            int Istep = 3;
 
 
            Rstep = int.Parse(textBox3.Text);
 
            Istep = Rstep;
 
 
 
            for (int x = Xmin; x < Xmax; x = x + Rstep)
 
            {
 
                for (int y = Ymin; y < Ymax; y = y + Istep)
 
                {
 
                    Zr = ( x - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin; // pictureBoxの座標を複素平面Zの座標に変換
 
                    Zi = ( y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
                    int n = 0;
 
                    while ( Zr * Zr + Zi * Zi < 4 & n < Nmax )
 
                    {
 
                        newZr = Zr * Zr - Zi * Zi + Ar; // f(z) = X^2 * Aの実数部
 
                        newZi = 2 * Zr * Zi + Ai; // f(z) = X^2 * Aの虚数部
 
                        Zr = newZr;
 
                        Zi = newZi;
 
                        n++;
 
                    }
 
                    if (n < Nmax)
 
                    {
 
                        int dr = 17;
 
                        int rr = (n % dr + 1) * 255 / (dr + 1);
 
                        int gg = (n % 11 + 1) * 255 / 12;
 
                        int bb = (n % 7 + 1) * 255 / 8;
 
                        pen.Color = Color.FromArgb(255, rr, gg, 255 - bb);//nの数に応じて色分ける
 
                        brush.Color = Color.FromArgb(255, rr, gg, 255 - bb);//nの数に応じて色分ける
 
                        g.DrawRectangle(pen, x, y, Rstep, Istep);
 
                        g.FillRectangle(brush, x, y, Rstep, Istep);
 
                    }
 
                }
 
            }
 
        }
 
 
        private void button2_Click(object sender, EventArgs e)
 
        {
 
            Graphics g = pictureBox1.CreateGraphics();
 
            g.Clear(Color.Black); //描画領域をクリア(黒で塗りつぶす)
 
 
            label1.Text = null;
 
            label2.Text = null;
 
            label3.Text = null;
 
            label4.Text = null;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
 
            view2 = true;
 
 
        }
 
 
        // 以下、マウスイベントによって選択範囲を取得する処理
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
 
        {
 
            if (view2 == false) return;
 
            // 描画フラグON
 
            view = true;
 
 
            // Mouseを押した座標を記録
 
            MD.X = e.X - Xmax;
 
            MD.Y = Ymax - e.Y;
 
        }
 
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
 
        {
 
            if (view2 == false) return;
 
 
            Point start = new Point();
 
            Point end = new Point();
 
 
            // Mouseを離した座標を記録
 
            MU.X = e.X - Xmax;
 
            MU.Y = Ymax - e.Y;
 
 
            // 座標から(X,Y)座標を計算
 
            GetRegion(MD, MU, ref start, ref end);
 
 
            // 領域を描画
 
            DrawRegion(start, end);
 
 
            // 描画フラグOFF
 
            view = false;
 
            view2 = false;
 
 
        }
 
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
 
        {
 
            if (view2 == false) return;
 
 
            Point p = new Point();
 
 
            p.X = e.X - Xmax;
 
            p.Y = Ymax - e.Y;
 
 
            // 描画フラグcheck
 
            if (view == false)
 
            {
 
                label1.Text = ( ( p.X - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin ).ToString();
 
                label2.Text = ( ( p.Y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin ).ToString();
 
 
                label3.Text = null;
 
                label4.Text = null;
 
 
                return;
 
            }
 
 
            // カーソルが示している場所の座標を取得
 
            label3.Text = ( (p.X - Xmin) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin ).ToString();
 
            label4.Text = ( (p.Y - Ymin) * (Imax - Imin) / (Ymax - Ymin) + Imin ).ToString();
 
        }
 
 
        private void GetRegion(Point p1, Point p2, ref Point start, ref Point end)
 
        {
 
            start.X = Math.Min(p1.X, p2.X);
 
            start.Y = Math.Min(p1.Y, p2.Y);
 
 
            end.X = Math.Max(p1.X, p2.X);
 
            end.Y = Math.Max(p1.Y, p2.Y);
 
 
            if (checkBox1.Checked == true) //選択領域を正方形にする
 
            {
 
                int min_x_y = Math.Min(Math.Abs(end.X - start.X), Math.Abs(end.Y - start.Y));
 
 
                end.X = start.X + min_x_y;
 
                end.Y = start.Y + min_x_y;
 
            }
 
 
            Rmax2 = ( end.X - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin; // pictureBoxの座標を複素平面Zの座標に変換
 
            Imax2 = ( end.Y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
            Rmin2 = ( start.X - Xmin ) * (Rmax - Rmin) / (Xmax - Xmin) + Rmin;
 
            Imin2 = ( start.Y - Ymin ) * (Imax - Imin) / (Ymax - Ymin) + Imin;
 
        }
 
 
        private int GetLength(int start, int end)
 
        {
 
            return Math.Abs(start - end);
 
        }
 
 
        private void DrawRegion(Point start, Point end)
 
        {
 
            Pen blackPen = new Pen(Color.White);
 
            SolidBrush tbrush = new SolidBrush(Color.FromArgb(100,220,220,220));
 
 
            // 描画する線を点線に設定
 
//            blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
 
 
            // 画面を消去
 
//            g.Clear(SystemColors.Control);
 
 
            // 領域を描画
 
            g.DrawRectangle(blackPen, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y));
 
            g.FillRectangle(tbrush, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y));
 
        }
 
 
        private void button5_Click(object sender, EventArgs e)
 
        {
 
            // 座標を初期値に戻す
 
            Rmax2 = 0.5;
 
            Rmin2 = -0.5;
 
            Imax2 = 0.5;
 
            Imin2 = -0.5;
 
 
            label1.Text = null;
 
            label2.Text = null;
 
            label3.Text = null;
 
            label4.Text = null;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
</pre>
 
 
*座標のスケールの拡大、縮小ボタンを付ける
 
<pre>
 
        private void button6_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを5倍にする
 
            double ratio = 5.0;
 
            double R_ave = ( Rmax2 + Rmin2 ) / 2;
 
            double R_dif2 = ( Rmax2 - Rmin2 ) / 2;
 
            double I_ave = ( Imax2 + Imin2 ) / 2;
 
            double I_dif2 = ( Imax2 - Imin2 ) / 2;
 
 
            Rmax2 = R_ave + R_dif2 * ratio;
 
            Rmin2 = R_ave - R_dif2 * ratio;
 
            Imax2 = I_ave + I_dif2 * ratio;
 
            Imin2 = I_ave - I_dif2 * ratio;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
 
        private void button7_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを5分の1倍にする
 
            double ratio = 5.0;
 
            double R_ave = (Rmax2 + Rmin2) / 2;
 
            double R_dif2 = (Rmax2 - Rmin2) / 2;
 
            double I_ave = (Imax2 + Imin2) / 2;
 
            double I_dif2 = (Imax2 - Imin2) / 2;
 
 
            Rmax2 = R_ave + R_dif2 / ratio;
 
            Rmin2 = R_ave - R_dif2 / ratio;
 
            Imax2 = I_ave + I_dif2 / ratio;
 
            Imin2 = I_ave - I_dif2 / ratio;
 
           
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
</pre>
 
 
 
*座標の上下左右へシフトさせるボタンを付ける
 
<pre>
 
        private void button8_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを左に0.5スケールシフトする
 
            double R_ave = (Rmax2 + Rmin2) * 0.5;
 
            double R_dif2 = (Rmax2 - Rmin2) * 0.5;
 
 
            Rmax2 = Rmax2 - R_dif2;
 
            Rmin2 = Rmin2 - R_dif2;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
        }
 
 
        private void button9_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを右に0.5スケールシフトする
 
            double R_ave = (Rmax2 + Rmin2) * 0.5;
 
            double R_dif2 = (Rmax2 - Rmin2) * 0.5;
 
 
            Rmax2 = Rmax2 + R_dif2;
 
            Rmin2 = Rmin2 + R_dif2;
 
 
            label5.Text = Rmax2.ToString();
 
            label6.Text = Rmin2.ToString();
 
        }
 
 
        private void button10_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを下に0.5スケールシフトする
 
            double I_ave = (Imax2 + Imin2) * 0.5 ;
 
            double I_dif2 = (Imax2 - Imin2) * 0.5;
 
 
            Imax2 = Imax2 - I_dif2;
 
            Imin2 = Imin2 - I_dif2;
 
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
 
        private void button11_Click(object sender, EventArgs e)
 
        {
 
            // 座標のスケールを上に0.5スケールシフトする
 
            double I_ave = (Imax2 + Imin2) * 0.5;
 
            double I_dif2 = (Imax2 - Imin2) * 0.5;
 
 
            Imax2 = Imax2 + I_dif2;
 
            Imin2 = Imin2 + I_dif2;
 
 
            label7.Text = Imax2.ToString();
 
            label8.Text = Imin2.ToString();
 
        }
 
</pre>
 
  
 
== 人間の感覚 ==
 
== 人間の感覚 ==

2015年9月29日 (火) 05:07時点における版

目次

概要

  • 成績評価
    • 出席:学生証scan+Minutes paper
    • 課題:セルオートマトン課題、再帰呼び出し図形課題、複素平面フラクタル課題
    • 小テスト:ハイスコア
授業概要及び到達目標
インタラクティブアートは芸術を基盤として科学や工学を統合する新しい領域である。生物科学に関連した分野として、人工生命、ライフゲーム、フラクタル、オートマトン、遺伝的アルゴリズム、ニューラルネットワークなど応用範囲の広いものが数多く存在する。

そういった生物に見られる特徴をアートに応用したジェネラティブアートの作品をC++のプログラミングを使用して、実際に作成してみる。

本講義の目標は以下の通り。

  1. 生物の特徴と生物的なシステムについて理解する。
  2. 複雑系システムについて理解し、応用例を作成できる。
  3. openFrameworksを使って作品のプログラミングができる。

アナウンス

開発環境としてopenFrameworks for Visual studioを使用します。

テキストや開発環境については、以下を参照してください。

一年生の時にメディアプログラミング演習I程度のプログラミングスキルがあるものとして、授業を進めます。 もし、プログラミングに不安があるなら、上記テキストを使って、自分で予習や自習をしてください。

予定

2015年度
  1. 9/29(火) ガイダンス, 生物と情報とアート,openFrameworksプログラミング演習
  2. 10/6(火) openFrameworks C++プログラミング
  3. 10/13(火) 幾何学図形の描画
  4. 10/20(火) ランダムウォーク
  5. 10/27(火) セルオートマトン
  6. 11/10(火) セルオートマトン
  7. 11/17(火) セルオートマトン
  8. 12/1(火) セルオートマトン
  9. 12/8(火) セルオートマトン
  10. 12/15(火) フラクタルと再帰呼び出し
  11. 12/22(火) 課題制作日
  12. 1/5(火) フラクタルと再帰呼び出し
  13. 1/12(火) 予備演習日(出席はとりません)
  14. 1/19(火) 遺伝的アルゴリズム
  15. 1/26(火) 小テスト

生物と情報とアート

メモ 

Visual Studioのショートカット

  • Ctrl-K Ctrl-C コメントアウト
  • Ctrl-K Ctrl-U コメントアウト解除
  • Ctrl-K Ctrl-F インデントをそろえる

クリエイティブ・コーダー

複雑系

セルオートマトン

ライフゲーム

ライフゲームの例 / ライフゲーム入門 / セルオートマトン・ギャラリー /

セルオートマトン音楽

WolframTones/ CAMUS/ Glitch DS/ Life Game Orchestra /

ギャラリー

Modern Cellular Automata/ CArt gallery/ Cellular Automata Art/ ASCII Art Cell Automaton/

参考

ワイヤワールド /

人工生命

ラングトンのアリ / ラングトンのループ / 自己増殖ループ / Reynolds Boid /

http://www.local-guru.net/blog/2010/8/19/openframeworks-boid-demo

https://gist.github.com/tado/6603347


Birds Algorhythm Craig Reynolds http://processing.org/examples/flocking.html

openFrameworks Visual C++プログラミング

1つのボールがふらふら動く

配列とマウスインタラクション

クラスの使用

ランダムウォーク

ラングトンのアリ

物理エンジン Box2D

自己相似形

Tips

パーティクルの位置に画像を置く

ofApp.h

ofImage particleImage;

ofApp.cpp

setup(){
   particleImage.loadImage("particle.png");
}

draw(){
  particleImage.draw(pos.x, pos.y, w, h);
}
パーティクルの位置を辿る直線を描く

ofApp.cpp

ofBeginShape();
    for(int i = 0; i < particle.size(); i++){
        ofVertex(pos[i].x, pos[i].y);
    }
ofEndShape();
パーティクルの位置を辿る曲線を描く

ofApp.cpp

ofBeginShape();
    for(int i = 0; i < particle.size(); i++){
        ofCurveVertex(pos[i].x, pos[i].y);
    }
ofEndShape();

フラクタル

古代ギリシャからあるユークリッド幾何学と20世紀のフラクタル幾何学の比較

考察
古代エジプト人は3:4:5の辺を持つ三角形で直角が得られることを知っていた.ピラミッドなどの巨大建造物.
三平方の定理を発見したピタゴラスはどこがすごいか?
フラクタル図形

フラクタル図形の例

フラクタル日除け

人間の感覚

アロマアート

嗅覚を利用したアート

かんたん掲示板に「香りの特徴」を書いてみよう。

共感覚

ヒーリングアート

リラックスとリフレッシュ
リラックス時には副交感神経が優勢に,興奮状態にある場合は、交感神経が優勢になる。
リラックス時にはアルファ波が出る?
1/f揺らぎ
  • ホワイトノイズ、サイン波、ピンクノイズ(1/f揺らぎ)
  • 自然界の音を使用した楽曲 URL
  • スペクトル
    • EQ(イコライザ)によって,音のスペクトルを加工する。
    • スペクトルとは周波数構成のこと。ピッチ感のある音は,ピークとなる基本周波数を中心として複数の倍音成分から構成される。
      • SoundEngineAudacityでsin波などを生成し,周波数構成を観察。sin波は基本周波数1つのみ。ノコギリ波はsin波の倍数の無限級数。ホワイトノイズはランダムな周波数構成。
      • 人のボーカル,楽器の音,車のエンジン音のスペクトルを比較してみる。
子守唄
  • 子守唄の特徴、西洋の子守唄、日本の子守唄
  • 子守唄自動作曲プログラム(Max/MSP)PDF
  • 生理食塩水内レコーディング竹田の子守唄
生物的なシステム,生物の癒し効果

flash effects / Levitated the Exploration of Computation / sodaplay/ Vector Park / リヴリー・アイランド / エレクトロプランクトン / たまごっちプラス / メンタルコミットロボアザラシ型「パロ」 / 猫型コミュニケーションロボット「ネコロ」 / nintendogs / What is TRUTH? /

脳波,脳電図(electroencephalogram EEG)
大脳皮質のニューロンの膨大な数のシナプス結合における電位(シナプス後電位)の集合と考えられている。
通常は,空間的および時間的分散性のために一定の形状の波形にはならない。しかし,大脳皮質の活性度が低下した時にはある程度の同期性がみられ,その代表的な状態が睡眠時の脳波である。
開眼時,脳の神経細胞があちこちで活発に作動していると,シナプス電位は同期が取れずに,脳波はランダムなになり,特定の周波数は測定されない。
  • デルタ波(δ波):1~3Hz ぐっすり睡眠.昏睡.
  • シータ波(θ波):4~7Hz うたたうね.ぼんやり.
  • アルファ波(α波):8~13Hz 覚醒,安静,閉眼時。リラックス。
  • ベータ波(β波):14~30Hz 開眼時,五感が働いている状態。活発な思考。
  • ガンマ波(γ波):30~64Hz 高次精神活動に関連(?)
  • オメガ波(ω波):64~128Hz(?)
  • ロー波(ρ波):128-512Hz (?)
  • シグマ波(σ波):512-1024Hz (?)
  • アーティファクト:ノイズ(雑音)。まばたき,眼球運動,電極の接着不良など脳と無関係のものが要因。

バイノーラルビート

周波数追従反応

脳磁図,生物フォトン,心電図,筋電図,眼電図。

ニューロコミュニケーター

Mindball

Neural Networks

  • 神経回路モデル(PPT)
  • 神経細胞の写真,構成図[ 1 | 2 | 3 ]
  • ニューラルネットワーク入門
  • Perceptron,
  • Back Propagation
  • Hopfield Network
  • 自己組織化ネットワーク
  • 脳の潜在能力
    • 天文学者カール・セーガン「人間の脳はおよそ2,000万冊,すなわち世界最大の図書館に収められているのと同じ数の本を満たすほどの情報を収納することができる」
    • 神経科学者「人は平均寿命の間に脳の潜在能力の0.01%(0.0001)しか使っていない」

Genetic Algorithm

  • カール・セーガン「コスモス」エピソードII第3話「平家物語と蟹のなぞ」
    • 瀬戸内海の蟹の甲羅は武士の顔に似ているのはなぜか?

配布資料PDF

小テスト

  • 場所 いつものPC演習室
  • 出題 配布資料などから出題されます。ノート,配布資料などを復習しておいてください。問題の形式は,選択式です。
  • 注意事項
    • 座席は自由ですが,隣の座席を1つ空けて座ってください。
    • 持ち込みは不可です。机の上には一切,何も置かないで下さい。
    • PC上のソフトはブラウザだけ起動してください。他のアプリケーションはすべて終了させてください。

Github

共同開発するときに便利。

学内のプロキシー環境で作業する場合、コンソールで

git config --global http.proxy proxy-n.t-kougei.ac.jp:8080
git config --global https.proxy proxy-n.t-kougei.ac.jp:8080

とする。

通常のプロキシーのない環境で作業する場合、コンソールで

git config --global --unset http.proxy proxy-n.t-kougei.ac.jp:8080
git config --global --unset https.proxy proxy-n.t-kougei.ac.jp:8080

とする。

現在の設定を確認するには、コンソールで、

git config --list

とする。

リンク

http://gushwell.ifdef.jp/

素数のグラフィック http://www.datapointed.net/visualizations/math/factorization/animated-diagrams/?infinity

個人用ツール
名前空間

変種
操作
案内
ツールボックス