VB.NET 从列表中沿 X 坐标移动一条线的所有点

问题描述

我有一个函数可以将 VB.NET 函数中的点列表中的线绘制到 PictureBox 上。将两个点添加到列表中,并在列表中添加的所有点之间绘制一条线。然而,当一个新点被添加到列表中时,我想将所有以前绘制的线移到左边。

例如,如果从列表中分别在 (9,0) (9,4)(10,0) (10,3) 之间绘制 2 条不同的线,并将第三条线添加到列表 (10,2),我想移动前两行是这样的:

(9,0),(9,4)(8,(8,4)

(10,(10,3)(9,3)

这是我的意思的演示。

绿色线是绘制的第一条线,黄色线是绘制的第二条线。在第二个图中,添加了一条深蓝色线,并且绘制的前两条线(黄色和绿色)都向左移动。

Lines

我正在使用此代码尝试绘制这些类型的线条。

Public Class Line

    Public ReadOnly Property StartPoint As Point

    Public ReadOnly Property EndPoint As Point

    Public Sub New(startPoint As Point,endPoint As Point)
        Me.StartPoint = startPoint
        Me.EndPoint = endPoint
    End Sub

End Class
Public Class Form1
Private lines As New List(Of Line)

Private Sub PictureBox1_Paint(sender As Object,e As PaintEventArgs) Handles PictureBox1.Paint
    For Each line In lines
        e.Graphics.DrawLine(Pens.Black,line.StartPoint,line.EndPoint)
    Next
End Sub

Private Sub AddNewLine(length As Integer)

    Dim pictureBoxRightXPoint As Integer = 300 'the right most side of the PictureBox is the x coordinate of 300 (PictureBox has the x size of 300).

    For Each l As line In lines 'move all points of X in all prevIoUsly drawn lines in the list to the left.
            l.StartPoint.X = l.StartPoint.X - 1
            l.EndPoint.X = l.EndPoint.X - 1

    Next
    lines.Add(New Line((pictureBoxRightXPoint,(pictureBoxRightXPoint,length))
    PictureBox1.Invalidate() 'Refresh the PictureBox to redraw the lines.
End Sub

End Class

添加后,出现以下错误

表达式是一个值,因此不能作为赋值的目标

当我尝试从 X 坐标中减去 1 以将列表中已有的所有点向左移动时。

将之前绘制的所有点向左移动时,如何解决此问题或在 PictureBox 中绘制一条线? (注意:列表中可以已经添加了多行)

(用于绘制和添加线条到列表的代码来自:https://stackoverflow.com/a/66621165/14924603)。

解决方法

如果您想绘制我相信您在 PictureBox 末尾声明的图像(在您的示例中),您可以将您的 PictureBox 放在 Panel 的右端内{1}} 并在 PictureBox 的开头绘制图形/线条。要将之前绘制的所有图形向左移动,您可以将 PictureBox 位置在 Panel 内的位置向左移动。

您可以使用之前的函数添加新行,但移动 PictureBox 并将其开头定位在 Panel 的末尾。要添加新行,请使用:

Dim xint As Integer = 1
Dim r As Random = New Random
xint = xint + 1
Dim Point1 As New Point(xint,r.Next(40,79))
Dim point2 As New Point(xint,r.Next(80,100))

AddNewLine(Point1,point2)
PictureBox1.Left -= 1 'Move the PictureBox Left

PictureBox1.Size = New Size(PictureBox2.Size.Width + 1,269) 'Change its size to allow for continuous line drawing 

您可以用您操纵的实际点替换我使用的随机 Y 长度。您链接的线条绘图功能可以正常工作。为了澄清,请确保使用此:

Private Sub AddNewLine(startPoint As Point,endPoint As Point)
    lines.Add(New Line(startPoint,endPoint))
    PictureBox1.Invalidate()
End Sub

而您的 Paint 事件应该是这样的:

For Each line In lines
     e.Graphics.DrawLine(Pens.Black,line.StartPoint,line.EndPoint)
Next