目前正在开展一个学校项目,我们在tocode(在vb.net中)编写了一个程序,该程序读取具有不同点的x和y坐标的txt文件,并在每两个点之间进行距离计算,并在文件上写入距离。
txt文件如下所示:
596;226
506;179
412;298
583;291
...etc
所以我的目标是计算dx和dy(每两行坐标之间的差异),这样我就可以得到距离。
唯一的问题是我被困在如何获得dx和dy(现在7天) 例如,对于第1行和第2行,dx为(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 :(得分:0)
您应该声明
Dim tabl() As String
因为函数Split
返回一个String数组。你不能用字符串做数学计算。所以你必须将所有字符串转换为数字。例如。到Double
。
dx
和dy
需要为数字
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
您可以将StreamReader
放入Using
语句中。它会在最后自动关闭文件。
使用这个新功能,代码现在看起来更简单:
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
答案 1 :(得分: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
,这需要添加对项目的引用