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_TeX { public partial class Form1 : Form { string fnamedvi; public Form1() { InitializeComponent(); } //----------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //----------------------------------------------------------------------------- private void toolStripButton2_Click(object sender, EventArgs e) { string dvipath=""; //カレントフォルダを出力ファイルのフォルダにする dvipath = System.IO.Path.GetDirectoryName(fnamedvi); System.IO.Directory.SetCurrentDirectory(dvipath); //platex.exe実行 System.Diagnostics.Process.Start("c:\\usr\\local\\bin\\platex.exe", fnamedvi); } //----------------------------------------------------------------------------- private void toolStripButton3_Click(object sender, EventArgs e) { string dvipath=""; //dvipdfmによるpdf化 dvipath = System.IO.Path.GetDirectoryName(fnamedvi); fnamedvi = dvipath + "\\" + System.IO.Path.GetFileNameWithoutExtension(fnamedvi); fnamedvi = fnamedvi + ".dvi"; System.Diagnostics.Process.Start("c:\\usr\\local\\bin\\dvipdfm.exe", fnamedvi); } //----------------------------------------------------------------------------- private void toolStripButton4_Click(object sender, EventArgs e) { string pdfpath=""; //pdf表示 pdfpath = System.IO.Path.GetDirectoryName(fnamedvi); fnamedvi = pdfpath + "\\" + System.IO.Path.GetFileNameWithoutExtension(fnamedvi); fnamedvi = fnamedvi + ".pdf"; System.Diagnostics.Process.Start(fnamedvi); } //----------------------------------------------------------------------------- private void main_part() { //作図用変数 double HSIZE; //画像横寸法(mm) double DHL; //画像左余白寸法:縦軸描画用(mm) double DHR; //画像右余白寸法(mm) double VSIZE; //画像縦寸法(mm) double DVL; //画像下余白寸法:横軸描画用(mm) double DVU; //画像上余白寸法(mm) string sxjiku=""; //x軸名(単位含む) double xmin; //x軸最小値 double xmax; //x軸最大値 double dx; //x軸増分 string slog=""; //x軸の種類(L:対数,N:普通) string syjiku=""; //y軸名 double ymin; //y軸最小値 double ymax; //y軸最大値 double xx, yy, kxx, kyy, kxx1, kyy1, kxx2, kyy2, dd; string str1, str2, str3, str4; double kxi, kxf, kyi, kyf; //入出力用変数宣言 System.IO.StreamReader sr; System.IO.StreamWriter sw; string dat=""; string[] sbuf; char delim=','; string fnameR = ""; string fnameW = ""; int ndata; //データ数−1 double alpha = 0.5; //Hazen公式 double aa, bb, rr; //回帰係数および相関係数 int i, j, k; double work; string strs; //入出力ファイル指定 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 = double.Parse(sbuf[0]) ; DHL = double.Parse(sbuf[1]) ; DHR = double.Parse(sbuf[2]); dat = sr.ReadLine() ; sbuf = dat.Split(delim) ; VSIZE = double.Parse(sbuf[0]) ; DVL = double.Parse(sbuf[1]) ; DVU = double.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; //プロット領域定義 kxi = DHL; kxf = HSIZE - DHR; kyi = DVL; kyf = VSIZE - DVU; //ソート(大きい順) 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 + (xx - xmin) * (kxf - kxi) / (xmax - xmin); kyy1 = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); xx = xmax ; yy = aa * xx + bb; if( yy < ymin){ yy = ymin ; xx = (yy - bb) / aa; } kxx2 = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); kyy2 = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxx1.ToString("0.000"); str2 = kyy1.ToString("0.000"); str3 = kxx2.ToString("0.000"); str4 = kyy2.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); //回帰係数・相関係数表示 dd = 2.0; str1 = (kxf - 25.0).ToString("0.000"); str2 = (kyf - dd * 5.0).ToString("0.000"); sw.WriteLine("\\put(" + str1 + "," + str2 + "){\\begin{minipage}{2.5cm}"); sw.WriteLine("\\footnotesize"); sw.WriteLine("\\begin{tabular}{|l|}\\hline"); sw.WriteLine("\\rowcolor{white} $y=a\\cdot x+b$ \\\\"); str1 = aa.ToString("0.00000") ; sw.WriteLine("\\rowcolor{white} $a=" + str1 + "$ \\\\"); str1 = bb.ToString("0.00000") ; sw.WriteLine("\\rowcolor{white} $b=" + str1 + "$ \\\\"); str1 = rr.ToString("0.00000") ; sw.WriteLine("\\rowcolor{white} $r=" + str1 + "$ \\\\ \\hline"); sw.WriteLine("\\end{tabular}"); sw.WriteLine("\\end{minipage}}"); sw.WriteLine("\\end{picture}"); sw.WriteLine("\\end{center}"); sw.WriteLine("\\end{document}"); sw.Close(); } //--------------------------------------------------------------------------------- private void TeX_DRN_XJIKU(System.IO.StreamWriter sw, double xmin, double xmax, double dx, double kxi, double kxf, double kyi, double kyf) { int i, ix; double xx, kxx, wv; string str0, str1, str2, str3, str4, dat1, dat2; //普通x軸描画 ix = (int)((xmax - xmin) / dx); for (i = 0; i <= ix; i++) { xx = xmin + (double)i * dx; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); wv = xmin + (double)i * dx; str0 = wv.ToString("0"); if ((int)(dx * 1000.0) % 10 != 0) { str0 = wv.ToString("0.000"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 != 0) { str0 = wv.ToString("0.00"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 == 0 && (int)(dx * 10.0) % 10 != 0) { str0 = wv.ToString("0.0"); } str1 = kxx.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxx.ToString("0.000"); str4 = kyf.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; str2 = (kyi - 3.0).ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat1 + dat2); } } //--------------------------------------------------------------------------- private void TeX_DRL_XJIKU(System.IO.StreamWriter sw, double xmin, double xmax, double kxi, double kxf, double kyi, double kyf) { int i, j; double xx, kxx; string str0, str1, str2, str3, str4; string dat1, dat2; //対数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 + (xx - xmin) * (kxf - kxi) / (xmax - xmin); str1 = kxx.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxx.ToString("0.000"); str4 = kyf.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; sw.WriteLine(dat1); } } for (i = (int)xmin; i <= (int)xmax; i++) { xx = (double)i; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); str0 = (System.Math.Pow(10.0, (double)i)).ToString(); str1 = kxx.ToString("0.000"); str2 = (kyi - 3.0).ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat2); } } //----------------------------------------------------------------------------- private void TeX_DRH_YJIKU(System.IO.StreamWriter sw, double ymin, double ymax, double kxi, double kxf,double kyi, double kyf) { int i; double yy,kyy,work; string strs=""; string str1,str2,str3,str4,str5,str6; for(i = 1;i<=11;i++){ if(i== 1)strs = "99.9"; if(i== 2)strs = "99"; if(i== 3)strs = "95"; if(i== 4)strs = "90"; if(i== 5)strs = "80"; if(i== 6)strs = "50"; if(i== 7)strs = "20"; if(i== 8)strs = "10"; if(i== 9)strs = "5"; if(i==10)strs = "1"; if(i==11)strs = "0.1"; work = (double)(double.Parse(strs) / 100.0) ; yy = TODA(work); kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxi.ToString("0.000"); str2 = kyy.ToString("0.000"); str3 = kxf.ToString("0.000"); str4 = kyy.ToString("0.000"); str5 = (kxi - 5.0).ToString("0.000"); str6 = kyy.ToString("0.000"); sw.WriteLine("\\dottedline{0.5}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")\\put(" + str5 + "," + str6 + "){\\makebox(0,0){" + strs + "}}"); } } //----------------------------------------------------------------------------- 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); } //--------------------------------------------------------------------------- } }