Saludos.
Te he dado cuartel para que no te encontrases el tema solucionado despues de comerte la cabeza, compañero lokoman.
El caso es que creo que no has pillado bien el asunto.
Las coordenadas positivas y negativas deben significar que cada linea comienza donde acabó la anterior.
Aunque no tengo claro como se hace para comenzar una linea nueva. Cada bloque deberia ser una parte del grafico, y debería tener al comienzo las coordenadas de inicio. Yo he usado el centro del PictureBox como inicio. A ver que os parece:
Se necesita un TextBox, un PictureBox grandecito y 3 botones (Command1, 2 y 3), y las coordenadas en un fichero llamado "Fichero.txt" de momento.
Código vb:
Ver originalOption Explicit
Private Type Coordenadas
X As Long
Y As Long
End Type
Private Sub Command1_Click()
' carga las coordenadas del fichero y las muestra en el textbox.
Dim F As Long
Dim F2 As Long
Dim Block() As Coordenadas
Text1.Text = ""
' intentamos cargar hasta 100 posibles blocks
For F = 1 To 100
If CargaCoordenadas("Fichero.txt", F, Block) Then
Text1.Text = Text1.Text & "Block" & F & vbCrLf & Block(0).X & ", " & Block(0).Y & vbCrLf
For F2 = 1 To UBound(Block)
Text1.Text = Text1.Text & Block(F2).X & ", " & Block(F2).Y & vbCrLf
Next F2
Else
' si un Block no existe se para y no se cargan mas
Exit For
End If
Next F
End Sub
Private Sub Command2_Click()
' carga las coordenadas del Block 2 y las muestra en un grafico
Dim Block() As Coordenadas
Picture1.Cls
CargaCoordenadas "Fichero.txt", 2, Block
MuestraGrafico Block, Picture1, vbRed, "Block 2"
End Sub
Private Sub Command3_Click()
' carga coordenadas aleatorias y las muestra en un grafico
Dim Block() As Coordenadas
Dim F As Long
Picture1.Cls
CargaCoordenadasAleatorias Block, 100, 300
' las mostramos en el textbox
Text1.Text = "Block Aleatorio" & vbCrLf & Block(0).X & ", " & Block(0).Y & vbCrLf
For F = 1 To UBound(Block)
Text1.Text = Text1.Text & Block(F).X & ", " & Block(F).Y & vbCrLf
Next F
MuestraGrafico Block, Picture1, vbRed, "Block Aleatorio"
End Sub
Private Function CargaCoordenadas(ByVal FicheroTXT As String, ByVal NumBlock As Long, Matriz() As Coordenadas) As Boolean
' carga una matriz con las coordenadas del Block elegido y del fichero elegido
Dim NumFichero As Integer
Dim Linea As String
Dim BlockABuscar As String
Dim Coord() As String
Dim Encontrado As Boolean
BlockABuscar = "BLOCK " & NumBlock
ReDim Matriz(0)
On Local Error GoTo ErrorSub
NumFichero = FreeFile
Open FicheroTXT For Input As NumFichero
Do Until EOF(NumFichero)
Line Input #NumFichero, Linea
If Encontrado = False Then
If UCase$(Trim$(Linea)) = BlockABuscar Then
Encontrado = True
GoTo Otro
End If
End If
If Encontrado = True Then
If UCase$(Left$(Trim$(Linea), 5)) = "BLOCK" Then Exit Do
Coord = Split(Linea, ",")
ReDim Preserve Coord(1) ' nos aseguramos de que se ha creado la matriz
Matriz(UBound(Matriz)).X = Val(Coord(0))
Matriz(UBound(Matriz)).Y = Val(Coord(1))
ReDim Preserve Matriz(UBound(Matriz) + 1)
End If
Otro:
Loop
ErrorSub:
If Err.Number <> 0 Then MsgBox Err.Description
CargaCoordenadas = Encontrado
Err.Clear
On Local Error Resume Next
Close
If UBound(Matriz) > 0 Then ReDim Preserve Matriz(UBound(Matriz) - 1)
End Function
Private Sub MuestraGrafico(Matriz() As Coordenadas, ByVal Picture As PictureBox, Optional ByVal sColor As Long = vbBlue, Optional ByVal Titulo As String = "")
Dim F As Long
Dim CoordAct As Coordenadas
On Local Error Resume Next
Picture.AutoRedraw = True
Picture.Print Titulo
CoordAct.X = (Picture.Width) / 2
CoordAct.Y = (Picture.Height) / 2
For F = 0 To UBound(Matriz)
Picture.Line (CoordAct.X, CoordAct.Y)-(CoordAct.X + Matriz(F).X, CoordAct.Y + Matriz(F).Y), sColor
CoordAct.X = CoordAct.X + Matriz(F).X
CoordAct.Y = CoordAct.Y + Matriz(F).Y
Next F
End Sub
Private Sub CargaCoordenadasAleatorias(Matriz() As Coordenadas, Cantidad As Long, Optional ByVal MaxLen As Long = 250)
Dim F As Long
ReDim Matriz(Cantidad)
For F = 0 To Cantidad - 1
Matriz(F).X = Int(Rnd * (MaxLen * 2)) - MaxLen
Matriz(F).Y = Int(Rnd * (MaxLen * 2)) - MaxLen
Next F
End Sub