Option Explicit On Option Strict On Public Class Form1 Private pi As Double = Math.PI Private Structure SAKUZU '作図用データ構造体 Dim kpt As Integer '拡大率(画面表示:1,ファイル保存:2) Dim HSIZE As Integer '画像横寸法 Dim DHL As Integer '画像左余白(縦軸描画スペース:px) Dim DHR As Integer '画像右余白(px) Dim VSIZE As Integer '画像縦サイズ(px) Dim DVL As Integer '画像下余白(横軸描画スペース:px) Dim DVU As Integer '画像上余白(px) Dim sxjiku As String 'x軸名 Dim syjiku As String 'y軸名 Dim slogx As String 'x軸の種類(L:対数,N:普通) Dim slogy As String 'y軸の種類(L:対数,N:普通) Dim xmin As Double 'x軸最小値 Dim xmax As Double 'x軸最大値 Dim dx As Double 'x軸増分 Dim ymin As Double 'y軸最小値 Dim ymax As Double 'y軸最大値 Dim dy As Double 'y軸増分 Dim kxi0 As Integer 'x軸最小値座標(px) Dim kxf0 As Integer 'x軸最大値座標(px) Dim kyi0 As Integer 'y軸最小値座標(px) Dim kyf0 As Integer 'y軸最大値座標(px) End Structure Private Structure TOUKEI '各グループの統計量保存用構造体 Dim aa As Double '回帰直線傾き y=aa*x+bb Dim bb As Double '回帰直線切片 y=aa*x+bb Dim rr As Double '回帰直線相関係数 Dim xm As Double 'xの平均値 Dim ym As Double 'yの平均値 Dim sigx As Double 'xの標準偏差 Dim sigy As Double 'yの標準偏差 End Structure Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Call main() End Sub Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click Dim fname2 As String = "" SaveFileDialog1.Filter = "*.bmp|*.bmp|" _ & "*.jpg|*.jpg|" _ & "*.png|*.png|" _ & "*.wmf|*.wmf|" _ & "*.tif|*.tif|" _ & "*.gif|*.gif" If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fname2 = SaveFileDialog1.FileName Select Case SaveFileDialog1.FilterIndex Case 1 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Bmp) Case 2 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Jpeg) Case 3 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png) Case 4 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Wmf) Case 5 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Tiff) Case 6 : PictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Gif) End Select End Sub Private Sub main() 'データ格納用変数宣言 Dim datax(,) As Double 'データx値 Dim datay(,) As Double 'データy値 Dim nblock As Integer 'データ群の数(入力値はデータ群の数,プログラム上はデータ群数−1) Dim nd() As Integer 'データ数(入力はデータ数,プログラム上数値はデータ数−1) Dim pname() As String 'プロット名(凡例用) Dim smark() As String 'プロット種別 Dim pp As Double '等確率楕円内にデータが入る確率 Dim x(100) As Double '統計量計算用work Dim y(100) As Double '統計量計算用work 'データ入出力用変数宣言 Dim sr As System.IO.StreamReader Dim sw As System.IO.StreamWriter Dim dat As String Dim sbuf() As String Dim delim() As Char = {","c} Dim fnameR As String = "" Dim fnameW As String = "" '構造体変数宣言 Dim pltdata As SAKUZU '作図用データ構造体 Dim daen() As TOUKEI '統計量保存用構造体 Dim iblock As Integer Dim i As Integer 'データ読み込み OpenFileDialog1.InitialDirectory = My.Computer.FileSystem.CurrentDirectory If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fnameR = OpenFileDialog1.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 = CInt(sbuf(0)) : pltdata.DHL = CInt(sbuf(1)) : pltdata.DHR = CInt(sbuf(2)) dat = sr.ReadLine() : sbuf = dat.Split(delim) : pltdata.VSIZE = CInt(sbuf(0)) : pltdata.DVL = CInt(sbuf(1)) : pltdata.DVU = CInt(sbuf(2)) dat = sr.ReadLine() : sbuf = dat.Split(delim) : pltdata.xmin = CDbl(sbuf(0)) : pltdata.xmax = CDbl(sbuf(1)) : pltdata.dx = CDbl(sbuf(2)) : pltdata.slogx = sbuf(3) dat = sr.ReadLine() : sbuf = dat.Split(delim) : pltdata.ymin = CDbl(sbuf(0)) : pltdata.ymax = CDbl(sbuf(1)) : pltdata.dy = CDbl(sbuf(2)) : pltdata.slogy = sbuf(3) dat = sr.ReadLine() : sbuf = dat.Split(delim) : nblock = CInt(sbuf(0)) - 1 : pp = CDbl(sbuf(1)) ReDim nd(nblock) ReDim pname(nblock) ReDim smark(nblock) ReDim datax(nblock, 100) ReDim datay(nblock, 100) ReDim daen(nblock) For iblock = 0 To nblock dat = sr.ReadLine() : sbuf = dat.Split(delim) nd(iblock) = CInt(sbuf(0)) - 1 pname(iblock) = sbuf(1) smark(iblock) = sbuf(2).Trim() For i = 0 To nd(iblock) dat = sr.ReadLine() sbuf = dat.Split(delim) datax(iblock, i) = CDbl(sbuf(0)) datay(iblock, i) = CDbl(sbuf(1)) Next i Next iblock sr.Close() '対数値処理 If pltdata.slogx = "L" Then For iblock = 0 To nblock For i = 0 To nd(iblock) If datax(iblock, i) < System.Math.Pow(10.0, pltdata.xmin) Then datax(iblock, i) = System.Math.Pow(10.0, pltdata.xmin) datax(iblock, i) = System.Math.Log10(datax(iblock, i)) Next i Next iblock End If If pltdata.slogy = "L" Then For iblock = 0 To nblock For i = 0 To nd(iblock) If datay(iblock, i) < System.Math.Pow(10.0, pltdata.ymin) Then datay(iblock, i) = System.Math.Pow(10.0, pltdata.ymin) datay(iblock, i) = System.Math.Log10(datay(iblock, i)) Next i Next iblock End If '統計量計算 For iblock = 0 To nblock For i = 0 To nd(iblock) x(i) = datax(iblock, i) y(i) = datay(iblock, i) Next i Call KAIKI(nd(iblock), x, y, daen, iblock) Next iblock '統計量書き込み If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then fnameW = SaveFileDialog1.FileName 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 To nblock 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) Next iblock sw.Close() '作図 Call PLTCTL(pltdata, pp, nblock, nd, pname, smark, datax, datay, daen) End Sub Private Sub PLTCTL(ByRef pltdata As SAKUZU, ByVal pp As Double, ByVal nblock As Integer, _ ByVal nd() As Integer, ByRef pname() As String, ByRef smark() As String, _ ByRef datax(,) As Double, ByRef datay(,) As Double, ByRef daen() As TOUKEI) '作図用変数宣言 Dim thePicBox As PictureBox = PictureBox1 Dim bmp As Bitmap Dim g As Graphics 'プロット領域定義 pltdata.kxi0 = pltdata.DHL pltdata.kxf0 = pltdata.HSIZE - pltdata.DHR pltdata.kyi0 = pltdata.DVU pltdata.kyf0 = pltdata.VSIZE - pltdata.DVL For i = 0 To 1 Select Case i Case 0 '画面描画 pltdata.kpt = 1 thePicBox = PictureBox1 thePicBox.Visible = True Case 1 '画像書き出し pltdata.kpt = 2 thePicBox = PictureBox2 thePicBox.Visible = False End Select 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) Call PLOT(g, pltdata, pp, nblock, nd, pname, smark, datax, datay, daen) g.Dispose() Next i PictureBox1.Left = 0 PictureBox1.Top = ToolStrip1.Height Me.ClientSize = New Size(PictureBox1.Width, PictureBox1.Height + ToolStrip1.Height) End Sub Private Sub PLOT(ByVal g As Graphics, ByVal pltdata As SAKUZU, _ ByVal pp As Double, ByVal nblock As Integer, _ ByVal nd() As Integer, ByRef pname() As String, ByRef smark() As String, _ ByRef datax(,) As Double, ByRef datay(,) As Double, ByRef daen() As TOUKEI) Dim i As Integer Dim iblock As Integer Dim kxi As Integer : Dim kxf As Integer Dim kyi As Integer : Dim kyf As Integer Dim xx As Double : Dim yy As Double Dim kxx As Integer : Dim kyy As Integer Dim kxx1 As Integer : Dim kyy1 As Integer Dim kxx2 As Integer : Dim kyy2 As Integer Dim str As String Dim dc As Integer Dim ds As Integer Dim lhanrei As Integer Dim radius As Double Dim theta As Double Dim f As New Font("MS ゴシック", pltdata.kpt * 10) Dim TextSize1 As New System.Drawing.SizeF Dim TextSize2 As New System.Drawing.SizeF Dim dbrush As SolidBrush = New SolidBrush(Color.Black) Dim LPen As New System.Drawing.Pen(System.Drawing.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 To nblock str = pname(iblock) TextSize2 = g.MeasureString(str, f) If lhanrei < TextSize2.Width Then lhanrei = CInt(TextSize2.Width) Next iblock 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) '座標軸 LPen.DashStyle = Drawing2D.DashStyle.Dot If pltdata.slogx = "N" Then Call DRN_XJIKU(g, f, LPen, pltdata.kpt, pltdata.xmin, pltdata.xmax, pltdata.dx, kxi, kxf, kyi, kyf) If pltdata.slogy = "N" Then Call DRN_YJIKU(g, f, LPen, pltdata.kpt, pltdata.ymin, pltdata.ymax, pltdata.dy, kxi, kxf, kyi, kyf) If pltdata.slogx = "L" Then Call DRL_XJIKU(g, f, LPen, pltdata.kpt, pltdata.xmin, pltdata.xmax, kxi, kxf, kyi, kyf) If pltdata.slogy = "L" Then Call 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 = CInt(kxi - pltdata.kpt * 10 - TextSize1.Width - TextSize2.Height) kyy = CInt((kyi + kyf) / 2 + TextSize2.Width / 2) Call INC_STR(g, f, str, kxx, kyy, -90) 'x軸名描画 str = pltdata.sxjiku TextSize2 = g.MeasureString(str, f) kxx = CInt((kxi + kxf) / 2 - TextSize2.Width / 2) kyy = CInt(kyf + pltdata.kpt * 5 + TextSize1.Height) Call INC_STR(g, f, str, kxx, kyy, 0) 'データプロット dc = pltdata.kpt * 10 For iblock = 0 To nblock Select Case CInt(smark(iblock).Substring(0, 1)) Case 0 : dbrush = New SolidBrush(Color.Red) : LPen = New Pen(Color.Red) Case 1 : dbrush = New SolidBrush(Color.Blue) : LPen = New Pen(Color.Blue) Case 2 : dbrush = New SolidBrush(Color.Fuchsia) : LPen = New Pen(Color.Fuchsia) Case 3 : dbrush = New SolidBrush(Color.Teal) : LPen = New Pen(Color.Teal) Case 4 : dbrush = New SolidBrush(Color.Aqua) : LPen = New Pen(Color.Aqua) Case 5 : dbrush = New SolidBrush(Color.Lime) : LPen = New Pen(Color.Lime) End Select LPen.Width = 2 * pltdata.kpt For i = 0 To nd(iblock) xx = datax(iblock, i) yy = datay(iblock, i) kxx = kxi + CInt((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)) - CInt(dc / 2) kyy = kyf - CInt((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)) - CInt(dc / 2) Select Case smark(iblock).Substring(1, 2) Case "fe" : g.FillEllipse(dbrush, kxx, kyy, dc, dc) Case "fr" : g.FillRectangle(dbrush, kxx, kyy, dc, dc) Case "ra" : g.DrawRectangle(LPen, kxx, kyy, dc, dc) Case "el" : g.DrawEllipse(LPen, kxx, kyy, dc, dc) End Select Next i '凡例 str = pname(iblock) TextSize1 = g.MeasureString(str, f) kxx = kxf + 10 * pltdata.kpt - CInt(dc / 2) kyy = kyi + CInt(iblock * TextSize1.Height) Select Case smark(iblock).Substring(1, 2) Case "fe" : g.FillEllipse(dbrush, kxx, kyy, dc, dc) Case "fr" : g.FillRectangle(dbrush, kxx, kyy, dc, dc) Case "ra" : g.DrawRectangle(LPen, kxx, kyy, dc, dc) Case "el" : g.DrawEllipse(LPen, kxx, kyy, dc, dc) End Select 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 ^ 2) * 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 + CInt((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)) kyy1 = kyf - CInt((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)) For i = 2 To 360 Step 2 theta = CDbl(i) / 180.0 * pi radius = Math.Sqrt(-2.0 * (1.0 - daen(iblock).rr ^ 2) * 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 + CInt((xx - pltdata.xmin) * (kxf - kxi) / (pltdata.xmax - pltdata.xmin)) kyy2 = kyf - CInt((yy - pltdata.ymin) * (kyf - kyi) / (pltdata.ymax - pltdata.ymin)) g.DrawLine(LPen, kxx1, kyy1, kxx2, kyy2) kxx1 = kxx2 kyy1 = kyy2 Next i Next iblock f.Dispose() End Sub Private Sub INC_STR(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal str As String, _ ByVal kxx As Integer, ByVal kyy As Integer, ByVal ang As Single) '軸名描画 g.ScaleTransform(1.0, 1.0) '横・縦の表示比率を設定 g.TranslateTransform(kxx, kyy) '表示位置の設定(表示位置を原点とする座標移動) g.RotateTransform(ang) '表示角度を指定 g.DrawString(str, f, Brushes.Black, 0, 0) '描画実行 g.ResetTransform() '単位行列にリセット End Sub Private Sub DRN_XJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal xmin As Double, ByVal xmax As Double, ByVal dx As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim ix As Integer Dim xx As Double Dim wv As Double Dim str As String Dim kxx As Integer Dim TextSize1 As New System.Drawing.SizeF '普通x軸描画 ix = CInt((xmax - xmin) / dx) For i = 0 To ix xx = xmin + CDbl(i) * dx kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) wv = xmin + CDbl(i) * dx str = wv.ToString("0") If CInt(dx * 1000.0) Mod 10 <> 0 Then str = wv.ToString("0.000") If CInt(dx * 1000.0) Mod 10 = 0 And CInt(dx * 100.0) Mod 10 <> 0 Then str = wv.ToString("0.00") If (CInt(dx * 1000.0) Mod 10 = 0 And CInt(dx * 100.0) Mod 10 = 0) And CInt(dx * 10.0) Mod 10 <> 0 Then 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) Next i End Sub Private Sub DRN_YJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal ymin As Double, ByVal ymax As Double, ByVal dy As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim iy As Integer Dim yy As Double Dim wv As Double Dim str As String Dim kyy As Integer Dim TextSize1 As New System.Drawing.SizeF '普通y軸描画 iy = CInt((ymax - ymin) / dy) For i = 0 To iy yy = ymin + CDbl(i) * dy kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) wv = ymin + CDbl(i) * dy str = wv.ToString("0") If CInt(dy * 1000.0) Mod 10 <> 0 Then str = wv.ToString("0.000") If CInt(dy * 1000.0) Mod 10 = 0 And CInt(dy * 100.0) Mod 10 <> 0 Then str = wv.ToString("0.00") If (CInt(dy * 1000.0) Mod 10 = 0 And CInt(dy * 100.0) Mod 10 = 0) And CInt(dy * 10.0) Mod 10 <> 0 Then 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) Next i End Sub Private Sub DRL_XJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal xmin As Double, ByVal xmax As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim j As Integer Dim xx As Double Dim str As String Dim kxx As Integer Dim TextSize1 As New System.Drawing.SizeF '対数x軸描画 For i = CInt(xmin) To CInt(xmax) - 1 For j = 1 To 9 xx = System.Math.Log(CDbl(j) * System.Math.Pow(10.0, CDbl(i))) / System.Math.Log(10.0) kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) g.DrawLine(LPen, kxx, kyi, kxx, kyf) Next j Next i For i = CInt(xmin) To CInt(xmax) xx = CDbl(i) kxx = kxi + CInt((xx - xmin) * (kxf - kxi) / (xmax - xmin)) str = CStr(System.Math.Pow(10.0, CDbl(i))) TextSize1 = g.MeasureString(str, f) g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3) Next i End Sub Private Sub DRL_YJIKU(ByVal g As Graphics, ByVal f As System.Drawing.Font, ByVal LPen As System.Drawing.Pen, _ ByVal kpt As Integer, _ ByVal ymin As Double, ByVal ymax As Double, _ ByVal kxi As Integer, ByVal kxf As Integer, _ ByVal kyi As Integer, ByVal kyf As Integer) Dim i As Integer Dim j As Integer Dim yy As Double Dim str As String Dim kyy As Integer Dim TextSize1 As New System.Drawing.SizeF '対数y軸描画 For i = CInt(ymin) To CInt(ymax) - 1 For j = 1 To 9 yy = System.Math.Log(CDbl(j) * System.Math.Pow(10.0, CDbl(i))) / System.Math.Log(10.0) kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) g.DrawLine(LPen, kxi, kyy, kxf, kyy) Next j Next i For i = CInt(ymin) To CInt(ymax) yy = CDbl(i) kyy = kyf - CInt((yy - ymin) * (kyf - kyi) / (ymax - ymin)) str = CStr(System.Math.Pow(10.0, CDbl(i))) TextSize1 = g.MeasureString(str, f) g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2) Next i End Sub Private Sub KAIKI(ByVal ndata As Integer, ByRef x() As Double, ByRef y() As Double, _ ByRef daen() As TOUKEI, ByVal iblock As Integer) Dim i As Integer Dim x1 As Double : Dim y1 As Double : Dim x2 As Double : Dim xy As Double Dim c1 As Double : Dim c2 As Double : Dim c3 As Double '回帰式:y=aa*x+bb x1 = 0.0 : y1 = 0.0 : x2 = 0.0 : xy = 0.0 For i = 0 To ndata x1 = x1 + x(i) y1 = y1 + y(i) x2 = x2 + x(i) * x(i) xy = xy + x(i) * y(i) Next i daen(iblock).xm = x1 / CDbl(ndata + 1) : daen(iblock).ym = y1 / CDbl(ndata + 1) daen(iblock).aa = (CDbl(ndata + 1) * xy - x1 * y1) / (CDbl(ndata + 1) * x2 - x1 * x1) daen(iblock).bb = (x2 * y1 - x1 * xy) / (CDbl(ndata + 1) * x2 - x1 * x1) c1 = 0.0 : c2 = 0.0 : c3 = 0.0 For i = 0 To ndata 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) Next i daen(iblock).rr = c1 / Math.Sqrt(c2 * c3) daen(iblock).sigx = Math.Sqrt(c2 / CDbl(ndata)) daen(iblock).sigy = Math.Sqrt(c3 / CDbl(ndata)) End Sub End Class