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 vcsHAZEN_png { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //------------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //------------------------------------------------------------------------------- private void main_part() { //作図用変数宣言 int kpt; //拡大率(画面表示:1,ファイル保存:2) int HSIZE; //画像横寸法(px) int DHL; //画像左余白寸法:縦軸描画用(px) int DHR; //画像右余白寸法(px) int VSIZE; //画像縦寸法(px) int DVL; //画像下余白寸法:横軸描画用(px) int DVU; //画像上余白寸法(px) string sxjiku=""; //x軸名(単位含む) double xmin; //x軸最小値 double xmax; //x軸最大値 double dx; //x軸増分 string slog=""; //x軸の種類(L:対数,N:普通) int kxi0, kxf0, kyi0, kyf0; PictureBox thePicBox = pictureBox1; Bitmap bmp; Graphics g; //入出力用変数 System.IO.StreamReader sr; string dat; string[] sbuf; char delim = ','; string fnameR = ""; string fnameW = ""; int ndata; //データ数−1 double alpha = 0.5; //Hazen公式 int i, j, k; double work; openFileDialog1.InitialDirectory=System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK){fnameR=openFileDialog1.FileName;} sr = new System.IO.StreamReader(fnameR, System.Text.Encoding.Default); dat = sr.ReadLine(); dat = sr.ReadLine() ; sbuf = dat.Split(delim) ; sxjiku = sbuf[0]; //x軸名 dat = sr.ReadLine() ; sbuf = dat.Split(delim) ; HSIZE = int.Parse(sbuf[0]) ; DHL = int.Parse(sbuf[1]) ; DHR = int.Parse(sbuf[2]); dat = sr.ReadLine() ; sbuf = dat.Split(delim) ; VSIZE = int.Parse(sbuf[0]) ; DVL = int.Parse(sbuf[1]) ; DVU = int.Parse(sbuf[2]); dat = sr.ReadLine() ; sbuf = dat.Split(delim); xmin = double.Parse(sbuf[0]) ; xmax = double.Parse(sbuf[1]) ; dx = double.Parse(sbuf[2]) ; slog = sbuf[3]; dat = sr.ReadLine() ; sbuf = dat.Split(delim) ; ndata = int.Parse(sbuf[0]) - 1; //プロットデータ格納配列宣言 double[] datax=new double[ndata+1]; double[] datay=new double[ndata+1]; k = 0; while(!sr.EndOfStream){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); datax[k] = double.Parse(sbuf[0]); k = k + 1; } sr.Close(); ndata = k - 1; //ソート(大きい順) for(i = 0;i<=ndata;i++){ for(j = i + 1;j<=ndata;j++){ if(datax[i] < datax[j]){ work = datax[i]; datax[i] = datax[j]; datax[j] = work; } }} //x軸対数値の場合0データ処理 if(slog == "L"){ for(i = 0;i<=ndata;i++){ if(datax[i]<= 0)datax[i] = 0.00001; datax[i] = Math.Log10(datax[i]); if(datax[i]= ymax){ yy = ymax ; xx = (yy - bb) / aa; } kxx1 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy1 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); xx = xmax ; yy = aa * xx + bb; if(yy < ymin){ yy = ymin ; xx = (yy - bb) / aa; } 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); //回帰係数・相関係数表示 str = "00000000000"; TextSize1 = g.MeasureString(str, f); g.FillRectangle(Brushes.White, kxf - TextSize1.Width - kpt * 10, kyi + kpt * 10, TextSize1.Width, TextSize1.Height * 4 + kpt * 10); g.DrawRectangle(Pens.Black, kxf - TextSize1.Width - kpt * 10, kyi + kpt * 10, TextSize1.Width, TextSize1.Height * 4 + kpt * 10); str = "y=a*x+b"; g.DrawString(str, f, Brushes.Black, kxf - TextSize1.Width - kpt * 5, kyi + kpt * 10 + kpt * 5); str = "a=" + aa.ToString("0.00000"); g.DrawString(str, f, Brushes.Black, kxf - TextSize1.Width - kpt * 5, kyi + kpt * 10 + kpt * 5 + TextSize1.Height * 1); str = "b=" + bb.ToString("0.00000"); g.DrawString(str, f, Brushes.Black, kxf - TextSize1.Width - kpt * 5, kyi + kpt * 10 + kpt * 5 + TextSize1.Height * 2); str = "r=" + rr.ToString("0.00000"); g.DrawString(str, f, Brushes.Black, kxf - TextSize1.Width - kpt * 5, kyi + kpt * 10 + kpt * 5 + TextSize1.Height * 3); f.Dispose(); } //------------------------------------------------------------------------------- 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 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 DRH_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,kyy; double yy,work; string str=""; System.Drawing.SizeF TextSize1; for(i = 1;i<=11;i++){ if(i == 1) str = "99.9"; if(i == 2) str = "99"; if(i == 3) str = "95"; if(i == 4) str = "90"; if(i == 5) str = "80"; if(i == 6) str = "50"; if(i == 7) str = "20"; if(i == 8) str = "10"; if(i == 9) str = "5"; if(i ==10) str = "1"; if(i ==11) str = "0.1"; work = (double)((double)(double.Parse(str) / 100.0)) ; yy = TODA(work); kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); TextSize1 = g.MeasureString(str, f); g.DrawLine(LPen, kxi, kyy, kxf, kyy); g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - 2, kyy - TextSize1.Height / 2); } } //------------------------------------------------------------------------------- private double TODA(double rx) { //非超過確率の%点 double ry, ay, uay; double b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10; if (rx == 0.5) { uay = 0.0; } else { if (rx < 0.5) { ry = rx; } else { ry = 1 - rx; } ay = -Math.Log(4.0 * ry * (1.0 - ry)); b0 = 1.570796288; b1 = 0.03706987906; b2 = -0.0008364353589; b3 = -0.0002250947176; b4 = 0.000006841218299; b5 = 0.000005824238515; b6 = -0.00000104527497; b7 = 0.00000008360937017; b8 = -0.000000003231081277; b9 = 0.00000000003657763036; b10 = 0.0000000000006936233982; uay = Math.Sqrt(ay * (b0 + b1 * ay + b2 * Math.Pow(ay, 2.0) + b3 * Math.Pow(ay, 3.0) + b4 * Math.Pow(ay, 4.0) + b5 * Math.Pow(ay, 5.0) + b6 * Math.Pow(ay, 6.0) + b7 * Math.Pow(ay, 7.0) + b8 * Math.Pow(ay, 8.0) + b9 * Math.Pow(ay, 9.0) + b10 * Math.Pow(ay, 10.0))); if (rx < 0.5) uay = -uay; } return uay; } //----------------------------------------------------------------------- private void KAIKI(int ndata, double[] datax, double[] datay, out double aa, out double bb, out double rr) { int i; double x1, y1, x2, xy, xm, ym, c1, c2, c3; //回帰式:y=aa*x+bb x1 = 0.0; y1 = 0.0; x2 = 0.0; xy = 0.0; for (i = 0; i <= ndata; i++) { x1 = x1 + datax[i]; y1 = y1 + datay[i]; x2 = x2 + datax[i] * datax[i]; xy = xy + datax[i] * datay[i]; } xm = x1 / (double)(ndata + 1); ym = y1 / (double)(ndata + 1); aa = ((double)(ndata + 1) * xy - x1 * y1) / ((double)(ndata + 1) * x2 - x1 * x1); bb = (x2 * y1 - x1 * xy) / ((double)(ndata + 1) * x2 - x1 * x1); c1 = 0.0; c2 = 0.0; c3 = 0.0; for (i = 0; i <= ndata; i++) { c1 = c1 + (datax[i] - xm) * (datay[i] - ym); c2 = c2 + (datax[i] - xm) * (datax[i] - xm); c3 = c3 + (datay[i] - ym) * (datay[i] - ym); } rr = c1 / Math.Sqrt(c2 * c3); } //--------------------------------------------------------------------------- } }