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 vcsGRDAEN { struct DRAWPARA{ //作図用構造体 public int kpt; //拡大率(画面表示:1,ファイル保存:2) public int HSIZE; //画像横寸法(px) public int DHL; //画像左余白寸法:縦軸描画用(px) public int DHR; //画像右余白寸法(px) public int VSIZE; //画像縦寸法(px) public int DVL; //画像下余白寸法:横軸描画用(px) public int DVU; //画像上余白寸法(px) public string sxjiku; //x軸名(単位含む) public double xmin; //x軸最小値 public double xmax; //x軸最大値 public double dx; //x軸増分 public string slogx; //x軸の種類(L:対数,N:普通) public string syjiku; //y軸名(単位含む) public double ymin; //y軸最小値 public double ymax; //y軸最大値 public double dy; //y軸増分 public string slogy; //y軸の種類(L:対数,N:普通) public int kxi0; //グラフ左端座標 public int kxf0; //グラフ右端座標 public int kyi0; //グラフ上端座標 public int kyf0; //グラフ下端座標 } struct TOUKEI{ //各グループの統計量保存用構造体 public double aa; //回帰直線傾き y=aa*x+bb public double bb; //回帰直線切片 y=aa*x+bb public double rr; //回帰直線相関係数 public double xm; //xの平均値 public double ym; //yの平均値 public double sigx; //xの標準偏差 public double sigy; //yの標準偏差 } public partial class Form1 : Form { double pi = Math.PI; public Form1() { InitializeComponent(); } //------------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //------------------------------------------------------------------------------- private void toolStripButton2_Click(object sender, EventArgs e) { string fname2 = ""; saveFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); saveFileDialog1.Filter = "*.bmp|*.bmp|*.jpg|*.jpg|*.png|*.png|*.wmf|*.wmf|*.tif|*.tif|*.gif|*.gif"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) fname2 = saveFileDialog1.FileName; switch (saveFileDialog1.FilterIndex) { case 1:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Bmp); break; case 2:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Jpeg); break; case 3:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png); break; case 4:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Wmf); break; case 5:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Tiff); break; case 6:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Gif); break; } } //------------------------------------------------------------------------------- private void INI_PLTDATA(out DRAWPARA pltdata) { pltdata.kpt = 0; pltdata.HSIZE = 0; pltdata.DHL = 0; pltdata.DHR = 0; pltdata.VSIZE = 0; pltdata.DVL = 0; pltdata.DVU = 0; pltdata.sxjiku = ""; pltdata.xmin = 0.0; pltdata.xmax = 0.0; pltdata.dx = 0.0; pltdata.slogx = ""; pltdata.syjiku = ""; pltdata.ymin = 0.0; pltdata.ymax = 0.0; pltdata.dy = 0.0; pltdata.slogy = ""; pltdata.kxi0 = 0; pltdata.kxf0 = 0; pltdata.kyi0 = 0; pltdata.kyf0 = 0; } //------------------------------------------------------------------------------- private void main_part() { double pp; //等確率楕円内にデータが入る確率 int nblock,iblock,i; //入出力用変数宣言 System.IO.StreamReader sr; System.IO.StreamWriter sw; string dat=""; string[] sbuf; char delim=','; string fnameR = ""; string fnameW = ""; DRAWPARA pltdata; //作図用構造体変数宣言 INI_PLTDATA(out pltdata); //入出力ファイル指定 openFileDialog1.InitialDirectory=System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK){fnameR=openFileDialog1.FileName;} if(saveFileDialog1.ShowDialog()==DialogResult.OK){fnameW=saveFileDialog1.FileName;} sr = new System.IO.StreamReader(fnameR, System.Text.Encoding.Default); dat = sr.ReadLine(); dat = sr.ReadLine(); sbuf = dat.Split(delim); pltdata.sxjiku = sbuf[0] ; pltdata.syjiku = sbuf[1]; dat = sr.ReadLine(); sbuf = dat.Split(delim); pltdata.HSIZE = int.Parse(sbuf[0]); pltdata.DHL = int.Parse(sbuf[1]); pltdata.DHR = int.Parse(sbuf[2]); dat = sr.ReadLine(); sbuf = dat.Split(delim); pltdata.VSIZE = int.Parse(sbuf[0]); pltdata.DVL = int.Parse(sbuf[1]); pltdata.DVU = int.Parse(sbuf[2]); dat = sr.ReadLine(); sbuf = dat.Split(delim); pltdata.xmin = double.Parse(sbuf[0]) ; pltdata.xmax = double.Parse(sbuf[1]) ; pltdata.dx = double.Parse(sbuf[2]) ; pltdata.slogx = sbuf[3]; dat = sr.ReadLine(); sbuf = dat.Split(delim); pltdata.ymin = double.Parse(sbuf[0]) ; pltdata.ymax = double.Parse(sbuf[1]) ; pltdata.dy = double.Parse(sbuf[2]) ; pltdata.slogy = sbuf[3]; dat = sr.ReadLine(); sbuf = dat.Split(delim); nblock = int.Parse(sbuf[0]) - 1 ; pp = double.Parse(sbuf[1]); //プロットデータ格納配列 int[] nd=new int[nblock+1]; //データ数(入力はデータ数,プログラム上数値はデータ数−1) double[,] datax=new double[nblock+1,100]; //データx値 double[,] datay=new double[nblock+1,100]; //データy値 string[] pname=new string[nblock+1]; //プロット名(凡例用) string[] smark=new string[nblock+1]; //プロット種別 TOUKEI[] daen=new TOUKEI[nblock+1]; //統計量保存用構造体変数宣言 double[] x=new double[100]; //統計量計算用work double[] y=new double[100]; //統計量計算用work for(iblock = 0;iblock<=nblock;iblock++){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); nd[iblock] = int.Parse(sbuf[0]) - 1; pname[iblock] = sbuf[1]; smark[iblock] = sbuf[2].Trim(); for( i = 0;i<=nd[iblock];i++){ dat = sr.ReadLine(); sbuf = dat.Split(delim); datax[iblock, i] = double.Parse(sbuf[0]); datay[iblock, i] = double.Parse(sbuf[1]); } } sr.Close(); //対数値処理 if( pltdata.slogx == "L"){ for( iblock = 0 ;iblock<=nblock;iblock++){ for( i = 0;i<=nd[iblock];i++){ if( datax[iblock, i] < Math.Pow(10.0, pltdata.xmin))datax[iblock, i] =Math.Pow(10.0, pltdata.xmin); datax[iblock, i] = Math.Log10(datax[iblock, i]); } } } if( pltdata.slogy == "L"){ for( iblock = 0;iblock<=nblock;iblock++){ for( i = 0;i<=nd[iblock];i++){ if( datay[iblock, i] < Math.Pow(10.0, pltdata.ymin))datay[iblock, i] = Math.Pow(10.0, pltdata.ymin); datay[iblock, i] = Math.Log10(datay[iblock, i]); } } } //統計量計算 for(iblock = 0;iblock<=nblock;iblock++){ for(i = 0;i<=nd[iblock];i++){ x[i] = datax[iblock, i]; y[i] = datay[iblock, i]; } KAIKI(nd[iblock], x, y, daen, iblock); } //統計量書き込み sw = new System.IO.StreamWriter(fnameW, false, System.Text.Encoding.Default); dat = "name,nd,aa,bb,rr,xm,ym,sigx,sigy" ; sw.WriteLine(dat); for(iblock = 0;iblock<=nblock;iblock++){ dat = pname[iblock]; dat = dat + "," + (nd[iblock] + 1).ToString("0"); dat = dat + "," + daen[iblock].aa.ToString("E"); dat = dat + "," + daen[iblock].bb.ToString("E"); dat = dat + "," + daen[iblock].rr.ToString("E"); dat = dat + "," + daen[iblock].xm.ToString("E"); dat = dat + "," + daen[iblock].ym.ToString("E"); dat = dat + "," + daen[iblock].sigx.ToString("E"); dat = dat + "," + daen[iblock].sigy.ToString("E"); sw.WriteLine(dat); } sw.Close(); //作図 PLTCTL(pltdata, pp, nblock, nd, pname, smark, datax, datay, daen); } //------------------------------------------------------------------------------- private void PLTCTL(DRAWPARA pltdata, double pp, int nblock, int[] nd, string[] pname, string[] smark, double[,] datax, double[,] datay, TOUKEI[] daen) { //作図用変数宣言 PictureBox thePicBox = pictureBox1; Bitmap bmp; Graphics g; int i; //プロット領域定義 pltdata.kxi0 = pltdata.DHL; pltdata.kxf0 = pltdata.HSIZE - pltdata.DHR; pltdata.kyi0 = pltdata.DVU; pltdata.kyf0 = pltdata.VSIZE - pltdata.DVL; for (i = 0; i <= 1; i++) { switch (i) { case 0: //画面描画} pltdata.kpt = 1; thePicBox = pictureBox1; thePicBox.Visible = true; break; case 1: //画像書き出し pltdata.kpt = 2; thePicBox = pictureBox2; thePicBox.Visible = false; break; } thePicBox.Size = new Size(pltdata.kpt * pltdata.HSIZE, pltdata.kpt * pltdata.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, pltdata, pp, nblock, nd, pname, smark, datax, datay, daen); g.Dispose(); } pictureBox1.Left = 0; pictureBox1.Top = toolStrip1.Height; this.ClientSize = new Size(pictureBox1.Width, pictureBox1.Height + toolStrip1.Height); } //------------------------------------------------------------------------------- private void PLOT(Graphics g, DRAWPARA pltdata, double pp, int nblock, int[] nd, string[] pname, string[] smark, double[,] datax, double[,] datay, TOUKEI[] daen) { int i,iblock; int kxi,kxf,kyi,kyf; double xx,yy; int kxx,kyy,kxx1,kyy1,kxx2,kyy2; string str; int dc,ds; int lhanrei; double radius,theta; System.Drawing.Font f = new Font("MS ゴシック", pltdata.kpt * 10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; SolidBrush dbrush= new SolidBrush(Color.Black); kxi = pltdata.kpt * pltdata.kxi0 ; kxf = pltdata.kpt * pltdata.kxf0; kyi = pltdata.kpt * pltdata.kyi0 ; kyf = pltdata.kpt * pltdata.kyf0; ds = pltdata.kpt * 20; lhanrei = 0; for(iblock = 0 ;iblock<=nblock;iblock++){ str = pname[iblock]; TextSize2 = g.MeasureString(str, f); if( lhanrei < TextSize2.Width)lhanrei = (int)TextSize2.Width; } kxf = kxf - lhanrei - ds; //等確率楕円の確率 str = "P=" + pp.ToString("0.000"); TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxf - TextSize1.Width - 5 * pltdata.kpt, kyi - 2 * pltdata.kpt - TextSize1.Height); //座標軸 System.Drawing.Pen LPen=new Pen(System.Drawing.Color.Black); LPen.DashStyle=System.Drawing.Drawing2D.DashStyle.Dot; if (pltdata.slogx == "N") DRN_XJIKU(g, f, LPen, pltdata.kpt, pltdata.xmin, pltdata.xmax, pltdata.dx, kxi, kxf, kyi, kyf); if (pltdata.slogy == "N") DRN_YJIKU(g, f, LPen, pltdata.kpt, pltdata.ymin, pltdata.ymax, pltdata.dy, kxi, kxf, kyi, kyf); if (pltdata.slogx == "L") DRL_XJIKU(g, f, LPen, pltdata.kpt, pltdata.xmin, pltdata.xmax, kxi, kxf, kyi, kyf); if (pltdata.slogy == "L") DRL_YJIKU(g, f, LPen, pltdata.kpt, pltdata.ymin, pltdata.ymax, kxi, kxf, kyi, kyf); //枠線描画 g.DrawRectangle(new Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi); //y軸名描画 str = pltdata.syjiku; TextSize2 = g.MeasureString(str, f); TextSize1 = g.MeasureString("-1.0", f); kxx = (int)(kxi - pltdata.kpt * 10 - TextSize1.Width - TextSize2.Height); kyy = (int)((kyi + kyf) / 2 + TextSize2.Width / 2); INC_STR(g, f, str, kxx, kyy, -90); //x軸名描画 str = pltdata.sxjiku; TextSize2 = g.MeasureString(str, f); kxx = (int)((kxi + kxf) / 2 - TextSize2.Width / 2); kyy = (int)(kyf + pltdata.kpt * 5 + TextSize1.Height); INC_STR(g, f, str, kxx, kyy, 0); //データプロット dc = pltdata.kpt * 10; for( iblock = 0 ;iblock<=nblock;iblock++){ switch(int.Parse(smark[iblock].Substring(0, 1))){ case 0 : dbrush = new SolidBrush(Color.Red) ; LPen = new Pen(Color.Red);break; case 1 : dbrush = new SolidBrush(Color.Blue) ; LPen = new Pen(Color.Blue);break; case 2 : dbrush = new SolidBrush(Color.Fuchsia) ; LPen = new Pen(Color.Fuchsia);break; case 3 : dbrush = new SolidBrush(Color.Teal) ; LPen = new Pen(Color.Teal);break; case 4 : dbrush = new SolidBrush(Color.Aqua) ; LPen = new Pen(Color.Aqua);break; case 5 : dbrush = new SolidBrush(Color.Lime) ; LPen = new Pen(Color.Lime);break; } LPen.Width = 2 * pltdata.kpt; for( i = 0;i<=nd[iblock];i++){ xx = datax[iblock, i]; yy = datay[iblock, i]; kxx = kxi + (int)((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)) - (int)(dc / 2); kyy = kyf - (int)((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)) - (int)(dc / 2); switch(smark[iblock].Substring(1, 2)){ case "fe" : g.FillEllipse(dbrush, kxx, kyy, dc, dc);break; case "fr" : g.FillRectangle(dbrush, kxx, kyy, dc, dc);break; case "ra" : g.DrawRectangle(LPen, kxx, kyy, dc, dc);break; case "el" : g.DrawEllipse(LPen, kxx, kyy, dc, dc);break; } } //凡例 str = pname[iblock]; TextSize1 = g.MeasureString(str, f); kxx = kxf + 10 * pltdata.kpt - (int)(dc / 2); kyy = kyi + (int)(iblock * TextSize1.Height); switch(smark[iblock].Substring(1, 2)){ case "fe": g.FillEllipse(dbrush, kxx, kyy, dc, dc); break; case "fr": g.FillRectangle(dbrush, kxx, kyy, dc, dc); break; case "ra": g.DrawRectangle(LPen, kxx, kyy, dc, dc); break; case "el": g.DrawEllipse(LPen, kxx, kyy, dc, dc); break; } g.DrawString(str, f, dbrush, kxx + 2 * dc, kyi + iblock * TextSize1.Height); //等確率楕円プロット LPen.Width = 1 * pltdata.kpt; theta = 0.0; radius = Math.Sqrt(-2.0 * (1.0 - daen[iblock].rr * daen[iblock].rr) * Math.Log(1.0 - pp) / (1.0 - 2.0 * daen[iblock].rr * Math.Sin(theta) * Math.Cos(theta))); xx = daen[iblock].xm + daen[iblock].sigx * radius * Math.Cos(theta); yy = daen[iblock].ym + daen[iblock].sigy * radius * Math.Sin(theta); kxx1 = kxi + (int)((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)); kyy1 = kyf - (int)((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)); for( i = 2;i<=360;i=i+2){ theta = (double)i / 180.0 * pi; radius = Math.Sqrt(-2.0 * (1.0 - daen[iblock].rr*daen[iblock].rr) * Math.Log(1.0 - pp) / (1.0 - 2.0 * daen[iblock].rr * Math.Sin(theta) * Math.Cos(theta))); xx = daen[iblock].xm + daen[iblock].sigx * radius * Math.Cos(theta); yy = daen[iblock].ym + daen[iblock].sigy * radius * Math.Sin(theta); kxx2 = kxi + (int)((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)); kyy2 = kyf - (int)((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)); g.DrawLine(LPen, kxx1, kyy1, kxx2, kyy2); kxx1 = kxx2; kyy1 = kyy2; } } 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 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); } } //------------------------------------------------------------------------------- private void KAIKI(int ndata, double[] x, double[] y, TOUKEI[] daen, int iblock) { int i; double x1,y1,x2,xy,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 + x[i]; y1 = y1 + y[i]; x2 = x2 + x[i] * x[i]; xy = xy + x[i] * y[i]; } daen[iblock].xm = x1 / (double)(ndata + 1) ; daen[iblock].ym = y1 / (double)(ndata + 1); daen[iblock].aa = ((double)(ndata + 1) * xy - x1 * y1) / ((double)(ndata + 1) * x2 - x1 * x1); daen[iblock].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 + (x[i] - daen[iblock].xm) * (y[i] - daen[iblock].ym); c2 = c2 + (x[i] - daen[iblock].xm) * (x[i] - daen[iblock].xm); c3 = c3 + (y[i] - daen[iblock].ym) * (y[i] - daen[iblock].ym); } daen[iblock].rr = c1 / Math.Sqrt(c2 * c3); daen[iblock].sigx = Math.Sqrt(c2 / (double)ndata); daen[iblock].sigy = Math.Sqrt(c3 / (double)ndata); } //------------------------------------------------------------------------------- } }