绘制多边形时出现额外线条的成因及解决方法咨询
问题描述
经热心人士指导后,我的代码已可正常运行,但绘制多边形时会额外出现一条从窗体原点指向第一个多边形顶点的线条。

代码示例
Option Explicit On Public Class Form1 Dim PolygonPoints(15) As Point Dim Rp As Double, Angle As Double Dim NumberOfSides As Integer Dim Xc As Integer = 400 : Dim Yc As Integer = 100 ' winform centre of circle Dim R As Integer = 70 ' winform radius of inscribed circle Private DrawOptions As Integer Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint Dim g As Graphics = e.Graphics Dim BlackPen As New Pen(Color.Black, 1) g.DrawPolygon(BlackPen, PolygonPoints) BlackPen.Dispose() End Sub Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged NumberOfSides = CInt(ListBox1.SelectedItem) PolygonPoints = New Point(NumberOfSides + 1) {} Rp = 70 + Sec(Math.PI / NumberOfSides) ' radius of polygon For i As Integer = 0 To NumberOfSides Angle = 2 * Math.PI * i / NumberOfSides PolygonPoints(i) = New Point(CInt(Xc + Rp * Math.Cos(Angle)), CInt(Yc + Rp * Math.Sin(Angle))) Next Me.Invalidate() End Sub Public Shared Function Sec(ByVal angle As Double) As Double Return 1.0 / Math.Cos(angle) End Function End Class
问题成因
- 数组长度冗余:你创建的
PolygonPoints数组长度比实际需要多1个元素(New Point(NumberOfSides + 1) {}),但循环只给前NumberOfSides+1个元素赋值,最后一个元素保留默认的Point(0,0)(窗体原点)。DrawPolygon会遍历数组中所有点并依次连接,最后还会把最后一个点和第一个点闭合,这条多余的原点连线就是这么来的。 - 循环范围错误:
DrawPolygon本身会自动闭合多边形,不需要重复绘制第一个顶点作为最后一个点。你当前的循环For i As Integer = 0 To NumberOfSides会多生成一个和第一个点重复的顶点,再加上数组冗余的原点,双重放大了问题。
规避方法
修改ListBox1_SelectedIndexChanged方法中的数组初始化和循环逻辑即可:
Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged NumberOfSides = CInt(ListBox1.SelectedItem) ' 初始化数组为多边形边数对应的顶点数量(NumberOfSides个元素) PolygonPoints = New Point(NumberOfSides - 1) {} Rp = 70 + Sec(Math.PI / NumberOfSides) ' radius of polygon ' 循环生成NumberOfSides个顶点,范围从0到NumberOfSides-1 For i As Integer = 0 To NumberOfSides - 1 Angle = 2 * Math.PI * i / NumberOfSides PolygonPoints(i) = New Point(CInt(Xc + Rp * Math.Cos(Angle)), CInt(Yc + Rp * Math.Sin(Angle))) Next Me.Invalidate() End Sub
另外,为了避免窗体初始化时(还没选多边形边数)绘制出原点的线条,可以在Form1_Paint中加个判断:
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint ' 只有当选择了有效边数时才绘制 If NumberOfSides > 2 Then Dim g As Graphics = e.Graphics Using BlackPen As New Pen(Color.Black, 1) ' 使用Using自动释放资源,比手动Dispose更安全 g.DrawPolygon(BlackPen, PolygonPoints) End Using End If End Sub
内容的提问来源于stack exchange,提问作者Florin Home
相关产品推荐
相关产品推荐

