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