在VB Picturebox中显示SQL几何

时间:2018-12-14 17:40:48

标签: sql vb.net sqlgeometry

我的第一篇文章是VB.NET的新手,所以我知道我可能会违反某些协议。所以请耐心等待。

关于我要做什么的背景知识。我创建了一个带有图片框的Windows窗体,用户可以在该窗体上绘制对象(代表墙壁,门等)。对象的坐标保存在SQL后端中(可以将其视为在Paint like界面中的矢量绘图)。下一步是移动穿过对象的光源(像人一样)。我已经在SQL中创建了一个表示多边形2D光线跟踪的轻型多边形,并与垫子的多边形创建了一个区别。本质上,这种差异代表可以看到物体的光路。

最后一步,也是我坚持的一步,是如何在图片框上显示我创建的最终几何图形(复杂的CurvePolygon),该图形实际上将掩盖尚未被光源照明的对象。最基本的方法是如何从SQL导入几何,然后将其显示在Windows窗体/图片框的图片框中。

感谢并感谢您的帮助。请记住,我是.NET的新手,并且正在使用此项目作为自学VB.NET和SQL的方法。

1 个答案:

答案 0 :(得分: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的业余爱好者,哎呀,我什至无法在这里看到代码示例,即使当前代码也不是最优的,但它可以完成工作。希望有人觉得这有帮助。