2017-04-08 151 views
0

当前正在学校项目中,我们必须编码(在vb.net中)一个程序,该程序读取具有不同点的x和y坐标的txt文件,并在每两个点之间进行距离计算,在文件上写下距离。VB.NET .txt文件操作

txt文件看起来是这样的:

596;226 
506;179 
412;298 
583;291 
...etc 

,所以我的目标是计算dx和dy(坐标每次2线之间的差值),所以我得到的距离之后。

唯一的问题是我被困在如何得到dx和dy(7天现在) 例如第1和第2行的例子是(506-596),第2行是(412-506)等等对于所有与dy的点。

这里是我一直试图徒劳(大部分代码只是从网上复制/粘贴)。

Imports System.IO 

Public Class Form1 


Private Sub FichierTexteToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FichierTexteToolStripMenuItem.Click 

    OpenFileDialog1.Filter = "fichier texte| *.txt" 
    Dim nbLigne As Integer 
    nbLigne = 0 
    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then 
     Dim sr As StreamReader 
     sr = New StreamReader(OpenFileDialog1.FileName) 
     Dim x, y As String 
     Dim dx, dy As String 
     Dim txtTotal As Object 
     Dim ligne = sr.ReadLine() 
     Dim tabl() As Object 
     tabl = Split(ligne, ";") 'la taille de tableau represente le nombre de bloc qui ksont séparer par les separateur 
     txtTotal = ligne + vbCrLf 


     'While Not ligne Is Nothing 
     ' ligne = sr.ReadLine 
     ' txtTotal = txtTotal + ligne + vbCrLf 

     ' tabl = Split(ligne, ";") 'la taille de tableau represente le nombre de bloc qui ksont séparer par les separateur 
     ' nbLigne = nbLigne + 1 
     'End While 
     x = tabl(0) 
     y = tabl(1) 

     While Not ligne Is Nothing 
      ligne = sr.ReadLine 

      tabl = Split(ligne, ";") 
      dx = tabl(0) - x 
      dy = tabl(1) - y 

     End While 


     'test 
     Label2.Text = dx 
     Label3.Text = dy 

     'Label1.Text = Calculs.distance(dx, dy) 

    Else : Close() 

    End If 

End Sub 



End Class 

谢谢你,希望有人会帮我出这个问题的:)

+0

听说过的[勾股定理]的(https://en.wikipedia.org/维基/ Pythagorean_theorem)?法文:[Théorèmede Pythagore](https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Pythagore)。您将需要它来计算2-D空间中2个点之间的距离! –

+0

这不是一个如何计算我在模块中完成论坛的问题,但我需要dx和dy。 dist = Math.Sqrt((dx)^ 2 +(dy)^ 2) – Goraby

+0

你有''dx''和''dy''作为字符串。要做任何类型的数学与他们,你需要改变他们整数(或单打或双打) – RPM

回答

0

你应该申报

Dim tabl() As String 

由于Split返回一个字符串数组的功能。你不能用字符串进行数学计算。所以你必须将所有的字符串转换为数字。例如。到Double

dxdy必须是数字

Dim dx = Double.Parse(tabl(0)) - Double.Parse(x) 
Dim dy = Doubel.Parse(tabl(1)) - Double.Parse(y) 

你可以使你的代码通过提取读取和转换一部分到一个单独的功能更加清晰。在这个例子中,我还添加了一些有效性检查

Private Function TryReadCoords(sr As StreamReader, ByRef x As Double, ByRef y As Double) _ 
    As Boolean 

    Dim ligne = sr.ReadLine() 
    If String.IsNullOrWhiteSpace(ligne) Then 
     Return False 
    End If 

    Dim parts = Split(ligne, ";") 
    Return _ 
     parts.Length = 2 AndAlso _ 
     Double.TryParse(parts(0), x) AndAlso _ 
     Double.TryParse(parts(1), y) 
End Function 

可以enlcose的StreamReaderUsing声明。它会在最后自动关闭文件。

使用这个新功能,代码现在看起来要简单得多:

Using sr As New StreamReader(OpenFileDialog1.FileName) 
    Dim x0, y0, x1, y1 As Double 

    If TryReadCoords(sr, x0, y0) Then 
     While TryReadCoords(sr, x1, y1) 
      Dim dx = x1 - x0 
      Dim dy = y1 - y0 

      'Do calculations here ... 

      x0 = x1 
      y0 = y1 
     End While 
    End If 
End Using 
+0

好的,谢谢,我这样做了,现在我在昏暗的dx行中得到这个错误:输入字符串的格式不正确。 – Goraby

+0

我没有看到你的字符串中有什么,但我想在文件的末尾有一个空行。 –

+0

txt文件是好的我猜在最后没有行,它可能是代码中的另一个错误?和我应该删除以前的功能然后(对不起,我还是很新的编码) – Goraby

0

VB.Net提供Point*结构。使用它;当你阅读每行时,将其解析为一个Point实例。

当你可以做那么多事情时,写一个接受两个Point的方法并返回它们之间的距离。这可以帮助你,因为它翻出了这一切从客观分心的事情或迷惑你:

Public Function Distance(ByVal p1 As Point, ByVal p2 As Point) As Double 
    Return Point.Subtract(p1, p2).Length 
End Function 

这看起来像功课,所以你的教授可能是希望你做全
√((x₁ - x)² + (y₁ - y₂)²)公式,但如果你需要自己写是作业的要点。


*注意代码示例使用System.Windows.Point而非System.Drawing.Point,这就需要增加一个参考项目