0

我在这里的第一篇文章对 VB.NET 有点陌生,所以我知道我可能会违反某些协议。所以请耐心等待。

我正在尝试做的一些背景知识。我创建了一个带有图片框的 Windows 窗体,用户可以在其上绘制对象(代表墙壁、门等)。对象的坐标保存在 SQL 后端(将其视为类似 Paint 界面中的矢量绘图)。下一步是移动穿过物体的光源(如人)。我在 SQL 中创建了一个代表原始 2D 光线跟踪的光多边形,并创建了与垫子多边形的差异。本质上,这种差异代表了可以看到物体的光路。

最后一步,也是我坚持的一步,是如何在图片框上显示我创建的最终几何图形(一个复杂的曲线多边形),这将基本上覆盖尚未被光源照亮的对象。最基本的是,如何从 SQL 导入几何图形,然后将其显示在 windows 窗体/图片框的图片框中。

感谢并感谢任何帮助。请记住,我对 .NET 有点陌生,并且正在使用这个项目作为自学 VB.NET 和 SQL 的一种方式。

4

1 回答 1

0

有点失望,没有人可以回答这个问题,但它确实发生了。所以我想出了一个解决方法,虽然并不理想,但希望能帮助陷入同样情况的其他人。也许有人会看到这一点并想出一个更优雅的解决方案。

所以一旦我有了最终的“阴影”多边形,我就找不到一个 VB.NET 解决方案来按原样绘制它,但这并不意味着我不能将它转换为可以在图片框中绘制的格式. 这是我想出的代码:

    Private Sub createShadows()
    Dim myPen As Pen
    Dim myBrush As Brush
    Dim myPoints As Point()
    Dim listPoints As New List(Of Point)
    Dim x As Double
    Dim y As Double

    ' Convert the complex shape into a polygon shape in SQL and bring all the vertex
    ' points into VB and put into a string variable (curBlack)
    mConn.Open()
    Dim cmd = New SqlCommand("Select CurrentBlack.STCurveToLine().STAsText() From tbl_Map_Master Where MapID = " &
                             cmbDN.SelectedItem(0), mConn)
    Dim curBlack As String = cmd.ExecuteScalar
    mConn.Close()

    ' Now parse the vertex points from SQL format into a set of VB points 
    curBlack = curBlack.Replace("POLYGON ((", "").Replace(")", "") & ",,"
    While curBlack.Length > 1
        x = CInt(Strings.Left(curBlack, InStr(curBlack, " "))) * iZoom + centerX
        curBlack = Strings.Right(curBlack, Len(curBlack) - InStr(curBlack, " "))
        y = CInt(Strings.Left(curBlack, InStr(curBlack, ",") - 1)) * iZoom + centerY
        curBlack = Strings.Right(curBlack, Len(curBlack) - InStr(curBlack, ",") - 1)
        listPoints.Add(New Point(x, y))
    End While
    myPoints = listPoints.ToArray

    ' Now use the points array to draw a filled polygon
    myPen = New Pen(Drawing.Color.White, 0)
    myBrush = New SolidBrush(Color.FromArgb(170, 0, 0, 0))
    Dim myGraphics As Graphics = pbDN.CreateGraphics
    myGraphics.DrawPolygon(myPen, myPoints)
    myGraphics.FillPolygon(myBrush, myPoints)
End Sub

正如我所说,这不是理想的解决方案,因此它会降低性能,但它确实有效。我肯定是一个 VB.NET 业余爱好者,哎呀,我什至无法让代码示例在此处正确显示,即使当前代码不是最佳的,但它可以完成工作。希望有人觉得这很有帮助。

于 2018-12-25T18:37:26.140 回答