using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace vcsKIKSP { public partial class Form1 : Form { public double pi = Math.PI; public Form1() { InitializeComponent(); } //--------------------------------------------------------------------------------- private void Form1_Load(object sender, EventArgs e) { toolStripLabel1.Text = "時刻歴時間軸:xmin,xmax,dx"; toolStripTextBox1.Text = "0,60,5"; toolStripLabel2.Text = "減衰定数:h"; toolStripTextBox2.Text = "0.05"; toolStripLabel3.Text = "ACC=0 or VEL=1"; toolStripTextBox3.Text = "0"; } //--------------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //--------------------------------------------------------------------------------- private void main_part() { //加速度応答スペクトル描画 int i,k,icase,ncase,nnn; double[,] datax=new double[11,200]; //プロットデータ double[,] datay=new double[11,200]; //プロットデータ int[] ndata=new int[11]; //指定周期数(プロット点数) string[] pname=new string[11]; //グラフ名称 string[] lcol=new string[11]; //線種(実践or点線) string memo; //グラフ名称 //入出力変数宣言 System.IO.StreamReader sr; System.IO.StreamReader sd; string dat; string[] sbuf; char delim = ','; string fname1 = ""; string fni; double dt; //サンプリングピッチ int nn; //時刻歴データ数 double ddymax; //最大加速度 double dymax; //最大速度 double ymax; //最大変位 int nt = 100; //指定周期数 double[] tk=new double[nt]; //計算周期 double[] resacc=new double[nt]; //加速度応答値 double[] resvel=new double[nt]; //速度応答値 double[] resdis=new double[nt]; //変位応答値 double h = 0.05; //減衰定数 int kcount = -1; string strcom; h = double.Parse(toolStripTextBox2.Text); //入力ファイル選定とテキスト入力 openFileDialog1.InitialDirectory=System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK){fname1=openFileDialog1.FileName;} sr = new System.IO.StreamReader(fname1, System.Text.Encoding.Default); dat = sr.ReadLine() ; sbuf = dat.Split(delim); ncase = int.Parse(sbuf[0]) - 1; //グラフ枚数確定 for(icase = 0;icase<= ncase;icase++){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); memo = sbuf[0]; //グラフ右上タイトル nnn = int.Parse(sbuf[1]) - 1; //1枚当たり描画線数 string[] fin=new string[nnn+1]; //時刻歴入力ファイル名 for( k = 0 ;k<=nnn;k++){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); fin[k] = sbuf[0]; //時刻歴ファイル名 pname[k] = sbuf[1]; //描画線の名称 lcol[k] = sbuf[2]; //線種指定 fni = System.IO.Path.GetDirectoryName(fname1) + "\\" + fin[k]; sd = new System.IO.StreamReader(fni, System.Text.Encoding.Default); dat = sd.ReadLine(); dat = sd.ReadLine() ; sbuf = dat.Split(delim) ; dt = double.Parse(sbuf[1]); dat = sd.ReadLine() ; sbuf = dat.Split(delim) ; nn = int.Parse(sbuf[1]); double[] ddy=new double[nn]; //加速度時刻歴 double[] dy=new double[nn]; //速度時刻歴 double[] y=new double[nn]; //変位時刻歴 for(i = 0;i<=nn - 1;i++){ dat = sd.ReadLine() ; sbuf = dat.Split(delim) ; ddy[i] = double.Parse(sbuf[0]); } sd.Close(); ndata[k] = nt - 1; for( i = 0 ;i<=nt - 1;i++){ //周期範囲:2*dt〜10sec tk[i] = Math.Pow(10.0, Math.Log10(2.0 * dt) + (1.0 - Math.Log10(2.0 * dt)) / (double)nt * (double)i); } IACC(nn, dt, ddy, dy, y, out ddymax, out dymax, out ymax) ;//加速度時刻歴数値積分 CRAC(nn, dt, ddy, dy, y, ddymax, dymax, ymax) ;//加速度時刻歴基線補正 ERES(nn, dt, h, ddy, nt, tk, resacc, resvel, resdis); //応答スペクトル計算 switch(int.Parse(toolStripTextBox3.Text)){ case 0: for( i = 0;i<=nt - 1;i++){ datay[k, i] = resacc[i]; } break; case 1: for( i = 0 ;i<=nt - 1;i++){ datay[k, i] = resvel[i]; } break; } for( i = 0 ;i<=nt - 1;i++){ datax[k, i] = tk[i]; } //加速度時刻歴波形描画 kcount = kcount + 1; strcom = memo + "_" + pname[k]; WAVEPLOT(kcount, fname1, strcom, nn, dt, ddy, ddymax); } //応答スペクトル描画 SAKUZU(fname1, icase, nnn, ndata, datax, datay, pname, memo, lcol); } sr.Close(); } //--------------------------------------------------------------------------------- private void WAVEPLOT(int kcount, string fname1, string strcom, int nn, double dt, double[] ddy, double ddymax) { //グラフィック変数宣言 int kpt = 2; int HSIZE = 800; int DHL = 80; int DHR = 20; int VSIZE = 200; int DVL = 50; int DVU = 20; string sxjiku = "時刻(sec)"; string syjiku = "加速度(gal)"; int kxi0, kxf0,kyi0,kyf0; int kxi,kxf,kyi,kyf; double xmin,xmax,dx; double ymin,ymax,dy; double xx,yy; int kxx1,kyy1,kxx2,kyy2; string str; Bitmap bmp; Graphics g; Font f = new Font("MS ゴシック", kpt * 10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; string fname2; string[] sbuf; int i; //作図用基本データ kxi0 = DHL ; kxf0 = HSIZE - DHR; kyi0 = DVU ; kyf0 = VSIZE - DVL; //画像書き出し pictureBox2.Size = new Size(kpt * HSIZE, kpt * VSIZE); pictureBox2.Visible = false; bmp = new Bitmap(pictureBox2.Width, pictureBox2.Height); pictureBox2.Image = bmp; g = Graphics.FromImage(pictureBox2.Image); g.FillRectangle(Brushes.White, 0, 0, pictureBox2.Width, pictureBox2.Height); kxi = kpt * kxi0 ; kxf = kpt * kxf0 ; kyi = kpt * kyi0 ; kyf = kpt * kyf0; sbuf = toolStripTextBox1.Text.Split(','); xmin = double.Parse(sbuf[0]) ; xmax = double.Parse(sbuf[1]) ; dx = double.Parse(sbuf[2]); ymin = -ddymax ; ymax = ddymax ; dy = ddymax; //座標軸(xーy普通軸) System.Drawing.Pen LPen =new System.Drawing.Pen(System.Drawing.Color.Black); LPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; DRN_XJIKU(g, f, LPen, kpt, xmin, xmax, dx, kxi, kxf, kyi, kyf); DRN_YJIKU(g, f, LPen, kpt, ymin, ymax, dy, kxi, kxf, kyi, kyf); //枠線描画 g.DrawRectangle(new Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi); //y軸名描画 str = syjiku; TextSize2 = g.MeasureString(str, f); TextSize1 = g.MeasureString("-1.0", f); kxx1 = (int)(kxi - kpt * 15 - TextSize1.Width - TextSize2.Height); kyy1 = (int)((kyi + kyf) / 2 + TextSize2.Width / 2); INC_STR(g, f, str, kxx1, kyy1, -90); //x軸名描画 str = sxjiku; TextSize2 = g.MeasureString(str, f); kxx1 = (int)((kxi + kxf) / 2 - TextSize2.Width / 2); kyy1 = (int)(kyf + kpt * 10 + TextSize1.Height); INC_STR(g, f, str, kxx1, kyy1, 0); //データを線で連結 xx = 0.0; yy = ddy[0]; kxx1 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy1 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); for( i = 1 ;i<= nn - 1;i++){ xx = dt * (double)i; yy = ddy[i]; if( xmax < xx )break; kxx2 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy2 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); g.DrawLine(new Pen(Color.Blue, 1), kxx1, kyy1, kxx2, kyy2); kxx1 = kxx2; kyy1 = kyy2; } //memo表示 TextSize1 = g.MeasureString(strcom, f); g.DrawString(strcom, f, Brushes.Black, kxf - TextSize1.Width, kyi - 1 * kpt - TextSize1.Height); f.Dispose(); g.Dispose(); //画像保存 fname2 = System.IO.Path.GetDirectoryName(fname1) + "\\" + System.IO.Path.GetFileNameWithoutExtension(fname1) + "figwave_" + kcount.ToString("00") + ".png"; pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png); } //--------------------------------------------------------------------------------- private void SAKUZU(string fname1, int icase, int nnn, int[] ndata, double[,] datax, double[,] datay, string[] pname, string memo, string[] lcol) { //グラフィック変数宣言 int kpt; int HSIZE = 700; int DHL = 80; int DHR = 200; int VSIZE = 400; int DVL = 50; int DVU = 20; int kxi0,kxf0,kyi0,kyf0; PictureBox thePicBox = pictureBox1; Bitmap bmp; Graphics g; string fname2 = ""; int i; //作図用基本データ kxi0 = DHL ; kxf0 = HSIZE - DHR; kyi0 = DVU ; kyf0 = VSIZE - DVL; kpt = 1; for( i = 0 ;i<= 1;i++){ switch(i){ case 0: //画面描画 kpt = 1; thePicBox = pictureBox1; thePicBox.Visible = true; break; case 1: //画像書き出し kpt = 2; thePicBox = pictureBox2; thePicBox.Visible = false; break; } thePicBox.Size = new Size(kpt * HSIZE, kpt * VSIZE); bmp = new Bitmap(thePicBox.Width, thePicBox.Height); thePicBox.Image = bmp; g = Graphics.FromImage(thePicBox.Image); g.FillRectangle(Brushes.White, 0, 0, thePicBox.Width, thePicBox.Height); PLOT(g, kpt, kxi0, kxf0, kyi0, kyf0, nnn, ndata, datax, datay, pname, memo, lcol); g.Dispose(); } pictureBox1.Left = 0; pictureBox1.Top = toolStrip1.Height; this.ClientSize = new Size(pictureBox1.Width, pictureBox1.Height + toolStrip1.Height); //画像保存 switch(int.Parse(toolStripTextBox3.Text)){ case 0: fname2 = System.IO.Path.GetDirectoryName(fname1) + "\\" + System.IO.Path.GetFileNameWithoutExtension(fname1) + "-fig_acc" + icase.ToString() + ".png"; break; case 1: fname2 = System.IO.Path.GetDirectoryName(fname1) + "\\" + System.IO.Path.GetFileNameWithoutExtension(fname1) + "-fig_vel" + icase.ToString() + ".png"; break; } pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png); } //--------------------------------------------------------------------------------- private void PLOT(Graphics g, int kpt, int kxi0, int kxf0, int kyi0, int kyf0, int nnn, int[] ndata, double[,] datax, double[,] datay, string[] pname, string memo, string[] lcol) { string sxjiku = ""; string syjiku = ""; double xmin,xmax,ymin=0.0,ymax=0.0; int i,k; int kxi,kxf,kyi,kyf; double xx,yy; int kxx1,kyy1,kxx2,kyy2; string str; int dc; Font f=new Font("MS ゴシック", kpt * 10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; switch(int.Parse(toolStripTextBox3.Text)){ case 0: syjiku = "加速度応答スペクトル(gal)"; ymin = 1.0 ; ymax = 4.0; break; case 1: syjiku = "速度応答スペクトル(kine)"; ymin = -1.0 ; ymax = 3.0; break; } sxjiku = "周期(sec)"; xmin = -2.0 ; xmax = 1.0; kxi = kpt * kxi0 ; kxf = kpt * kxf0 ; kyi = kpt * kyi0 ; kyf = kpt * kyf0; //座標軸(x−y対数軸) System.Drawing.Pen LPen = new System.Drawing.Pen(System.Drawing.Color.Black); LPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; DRL_XJIKU(g, f, LPen, kpt, xmin, xmax, kxi, kxf, kyi, kyf); DRL_YJIKU(g, f, LPen, kpt, ymin, ymax, kxi, kxf, kyi, kyf); //枠線描画 g.DrawRectangle(new Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi); //y軸名描画 str = syjiku; TextSize2 = g.MeasureString(str, f); TextSize1 = g.MeasureString("-1.0", f); kxx1 = (int)(kxi - kpt * 10 - TextSize1.Width - TextSize2.Height); kyy1 = (int)((kyi + kyf) / 2 + TextSize2.Width / 2); INC_STR(g, f, str, kxx1, kyy1, -90); //x軸名描画 str = sxjiku; TextSize2 = g.MeasureString(str, f); kxx1 = (int)((kxi + kxf) / 2 - TextSize2.Width / 2); kyy1 = (int)(kyf + kpt * 10 + TextSize1.Height); INC_STR(g, f, str, kxx1, kyy1, 0); //データを線で連結 dc = 2 * kpt; //線の太さ for( k = 0 ;k<=nnn;k++){ xx = Math.Log10(datax[k, 0]); yy = Math.Log10(datay[k, 0]); kxx1 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy1 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); for( i = 1 ;i<=ndata[k];i++){ xx = Math.Log10(datax[k, i]); yy = Math.Log10(datay[k, i]); kxx2 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy2 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); LPen = CHG_LPEN(lcol[k]); LPen.Width = dc; if( kxx2 < kxf && kyy2 < kyf ) g.DrawLine(LPen, kxx1, kyy1, kxx2, kyy2); kxx1 = kxx2; kyy1 = kyy2; } } //凡例 TextSize1 = g.MeasureString("あ", f); kxx1 = kxf + 10 * kpt; kxx2 = kxx1 + 20 * kpt; for( k = 0 ;k<=nnn;k++){ kyy1 = kyi + (k + 1) * (int)(TextSize1.Height); LPen = CHG_LPEN(lcol[k]); LPen.Width = dc; g.DrawLine(LPen, kxx1, kyy1, kxx2, kyy1); str = pname[k]; kyy2 = kyy1 - (int)(TextSize1.Height / 2); g.DrawString(str, f, Brushes.Black, kxx2 + 2 * kpt, kyy2); } //PGA表示 TextSize1 = g.MeasureString("あ", f); kxx1 = kxf + 10 * kpt; kxx2 = kxx1 + 20 * kpt; for( k = 0 ;k<= nnn;k++){ kyy1 = (int)((kyi + kyf) / 2) + (k + 1) * (int)(TextSize1.Height); LPen = CHG_LPEN(lcol[k]); LPen.Width = dc; g.DrawLine(LPen, kxx1, kyy1, kxx2, kyy1); switch(int.Parse(toolStripTextBox3.Text)){ case 0: str = datay[k, 0].ToString("0") + "gal (T=" + datax[k, 0].ToString("0.00") + "sec)"; break; case 1: str = datay[k, 0].ToString("0.0") + "kine (T=" + datax[k, 0].ToString("0.00") + "sec)"; break; } kyy2 = kyy1 - (int)(TextSize1.Height / 2); g.DrawString(str, f, Brushes.Black, kxx2 + 2 * kpt, kyy2); } //memo表示 TextSize1 = g.MeasureString(memo, f); g.DrawString(memo, f, Brushes.Black, kxf - TextSize1.Width, kyi - 1 * kpt - TextSize1.Height); //減衰定数表示 str = "h=" + toolStripTextBox2.Text; TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxi + 5 * kpt, kyi - 1 * kpt - TextSize1.Height); f.Dispose(); } //--------------------------------------------------------------------------------- private System.Drawing.Pen CHG_LPEN(string str) { System.Drawing.Pen LPEN = new System.Drawing.Pen(System.Drawing.Color.Black); switch(str.Substring(0, 1)){ case "0" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Red) ;break; case "1" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Blue) ;break; case "2" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Fuchsia);break; case "3" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Teal) ;break; case "4" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Aqua) ;break; case "5" : LPEN = new System.Drawing.Pen(System.Drawing.Color.Lime) ;break; } switch(str.Substring(1, 1)){ case "s" : LPEN.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid ;break; case "d" : LPEN.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot ;break; } return LPEN; } //--------------------------------------------------------------------------------- private void ERES(int nn, double dt, double h, double[] ddy, int nt, double[] tk, double[] resacc, double[] resvel, double[] resdis) { //応答値算出 //nn :加速度時刻歴総数 //dt :時間間隔(入力値) //h :減衰定数(入力値) //ddy[] :加速度時刻歴(入力値) //nt :計算周期総数[データ格納0〜nt-1](入力値) //tk[] :計算周期(入力値) //resacc[]:加速度応答スペクトル(計算値) //resvel[]:速度応答スペクトル(計算値) //resdis[]:変位応答スペクトル(計算値) int i, m; double accmax, velmax, dismax;//応答最大値(gal,kine,cm) double w, w2, hw, wd, wdt, e, cwdt, swdt; double ss, cc, s1, c1, s2, c2, s3, c3; double A11, A12, A21, A22, B11, B12, B21, B22; double dxf, xf, ddym, ddyf, x, dx, ddx; for (i = 0; i <= nt - 1; i++) { w = 2.0 * pi / tk[i]; w2 = w * w; hw = h * w; wd = w * Math.Sqrt(1.0 - h * h); wdt = wd * dt; e = Math.Exp(-hw * dt); cwdt = Math.Cos(wdt); swdt = Math.Sin(wdt); A11 = e * (cwdt + hw * swdt / wd); A12 = e * swdt / wd; A21 = -e * w2 * swdt / wd; A22 = e * (cwdt - hw * swdt / wd); ss = -hw * swdt - wd * cwdt; cc = -hw * cwdt + wd * swdt; s1 = (e * ss + wd) / w2; c1 = (e * cc + hw) / w2; s2 = (e * dt * ss + hw * s1 + wd * c1) / w2; c2 = (e * dt * cc + hw * c1 - wd * s1) / w2; s3 = dt * s1 - s2; c3 = dt * c1 - c2; B11 = -s2 / wdt; B12 = -s3 / wdt; B21 = (hw * s2 - wd * c2) / wdt; B22 = (hw * s3 - wd * c3) / wdt; accmax = 2.0 * hw * Math.Abs(ddy[0]) * dt; velmax = Math.Abs(ddy[0]) * dt; dismax = 0.0; dxf = -ddy[0] * dt; xf = 0.0; for (m = 1; m <= nn - 1; m++) { ddym = ddy[m]; ddyf = ddy[m - 1]; x = A12 * dxf + A11 * xf + B12 * ddym + B11 * ddyf; dx = A22 * dxf + A21 * xf + B22 * ddym + B21 * ddyf; ddx = -2.0 * hw * dx - w2 * x; if (accmax <= Math.Abs(ddx)) accmax = Math.Abs(ddx); if (velmax <= Math.Abs(dx)) velmax = Math.Abs(dx); if (dismax <= Math.Abs(x)) dismax = Math.Abs(x); dxf = dx; xf = x; } resacc[i] = accmax; resvel[i] = velmax; resdis[i] = dismax; } } //--------------------------------------------------------------------------------- private void IACC(int nn, double dt, double[] ddy, double[] dy, double[] y, out double ddymax, out double dymax, out double ymax) { //加速度時刻歴数値積分 //nn:加速度時刻歴データ総数 //dt :時間間隔(入力値) //ddy[] :加速度時刻歴(入力値) //dy[] :速度時刻歴(計算出力) //y[] :変位時刻歴(計算出力値) //ddymax:加速度最大値(計算出力値) //dymax :速度最大値(計算出力値) //ymax :変位最大値(計算出力値) int i; ddymax = 0.0; dymax = 0.0; ymax = 0.0; dy[0] = 0.0; y[0] = 0.0; for (i = 1; i <= nn - 1; i++) { dy[i] = dy[i - 1] + (ddy[i - 1] + ddy[i]) * dt / 2.0; y[i] = y[i - 1] + dy[i - 1] * dt + (ddy[i - 1] / 3.0 + ddy[i] / 6.0) * dt * dt; if (ddymax< Math.Abs(ddy[i]))ddymax = Math.Abs(ddy[i]); if (dymax< Math.Abs(dy[i]))dymax = Math.Abs(dy[i]); if (ymax< Math.Abs(y[i]))ymax = Math.Abs(y[i]); } } //--------------------------------------------------------------------------------- private void CRAC(int nn, double dt, double[] ddy, double[] dy, double[] y, double ddymax, double dymax, double ymax) { //加速度時刻歴基線補正 //nn:加速度時刻歴データ総数 //dt :時間間隔(入力値) //ddy[] :加速度時刻歴(入力値・書換出力値) //dy[] :速度時刻歴(入力値) //y[] :変位時刻歴(入力値) //ddymax:加速度最大値(入力値) //dymax :速度最大値(入力値) //ymax :変位最大値(入力値) int i; double tt, t, sum, a1, a0, acmax, coef; tt = (double)(nn - 1) * dt; t = 0.0; for (i = 0; i <= nn - 1; i++) { y[i] = y[i] * (3.0 * tt - 2.0 * t) * t * t; t = t + dt; } sum = (y[0] + y[nn - 1]) / 2.0; for (i = 1; i <= nn - 2; i++) { sum = sum + y[i]; } sum = sum * dt; a1 = 28.0 / 13.0 / tt / tt * (2.0 * dy[nn - 1] - 15.0 / Math.Pow(tt, 5.0) * sum); a0 = dy[nn - 1] / tt - a1 / 2.0 * tt; t = 0.0; acmax = 0.0; for (i = 0; i <= nn - 1; i++) { ddy[i] = ddy[i] - a0 - a1 * t; if (acmax < Math.Abs(ddy[i])) acmax = Math.Abs(ddy[i]); t = t + dt; } coef = ddymax / acmax; for (i = 0; i <= nn - 1; i++) { ddy[i] = ddy[i] * coef; } } //--------------------------------------------------------------------------------- private void INC_STR(Graphics g, System.Drawing.Font f, string str, int kxx, int kyy, float ang) { //軸名描画 g.ScaleTransform(1, 1);//横・縦の表示比率を設定 g.TranslateTransform(kxx, kyy);//表示位置の設定(表示位置を原点とする座標移動) g.RotateTransform(ang);//表示角度を指定 g.DrawString(str, f, Brushes.Black, 0, 0);//描画実行 g.ResetTransform();//単位行列にリセット } //--------------------------------------------------------------------------------- private void DRN_XJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double xmin, double xmax, double dx, int kxi, int kxf, int kyi, int kyf) { int i, ix, kxx; double xx, wv; string str; System.Drawing.SizeF TextSize1; //普通x軸描画 ix = (int)((xmax - xmin) / dx); for (i = 0; i <= ix; i++) { xx = xmin + (double)(i) * dx; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); wv = xmin + (double)(i) * dx; str = wv.ToString("0"); if ((int)(dx * 1000.0) % 10 != 0) { str = wv.ToString("0.000"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 != 0) { str = wv.ToString("0.00"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 == 0 && (int)(dx * 10.0) % 10 != 0) { str = wv.ToString("0.0"); } TextSize1 = g.MeasureString(str, f); g.DrawLine(LPen, kxx, kyi, kxx, kyf); g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3); } } //--------------------------------------------------------------------------------- private void DRN_YJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double ymin, double ymax, double dy, int kxi, int kxf, int kyi, int kyf) { int i, iy, kyy; double yy, wv; string str; System.Drawing.SizeF TextSize1; //普通y軸描画 iy = (int)((ymax - ymin) / dy); for (i = 0; i <= iy; i++) { yy = ymin + (double)(i) * dy; kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); wv = ymin + (int)(i) * dy; str = wv.ToString("0"); if ((int)(dy * 1000.0) % 10 != 0) { str = wv.ToString("0.000"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 != 0) { str = wv.ToString("0.00"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 == 0 && (int)(dy * 10.0) % 10 != 0) { str = wv.ToString("0.0"); } TextSize1 = g.MeasureString(str, f); g.DrawLine(LPen, kxi, kyy, kxf, kyy); g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2); } } //--------------------------------------------------------------------------------- private void DRL_XJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double xmin, double xmax, int kxi, int kxf, int kyi, int kyf) { int i, j, kxx; double xx; string str; System.Drawing.SizeF TextSize1; //対数x軸描画 for (i = (int)(xmin); i <= (int)xmax - 1; i++) { for (j = 1; j <= 9; j++) { xx = Math.Log10((double)(j) * Math.Pow(10.0, (double)i)); kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); g.DrawLine(LPen, kxx, kyi, kxx, kyf); } } for (i = (int)xmin; i <= (int)xmax; i++) { xx = (double)i; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); str = Math.Pow(10.0, (double)i).ToString(); TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3); } } //--------------------------------------------------------------------------------- private void DRL_YJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double ymin, double ymax, int kxi, int kxf, int kyi, int kyf) { int i, j; double yy; string str; int kyy; System.Drawing.SizeF TextSize1; //対数y軸描画 for (i = (int)ymin; i <= (int)ymax - 1; i++) { for (j = 1; j <= 9; j++) { yy = Math.Log10((double)j * Math.Pow(10.0, (double)i)); kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); g.DrawLine(LPen, kxi, kyy, kxf, kyy); } } for (i = (int)ymin; i <= (int)ymax; i++) { yy = (double)i; kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); str = (Math.Pow(10.0, (double)i)).ToString(); TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2); } } //--------------------------------------------------------------------------------- } }