【问题标题】:Display SQL geometry in VB Picturebox在 VB Picturebox 中显示 SQL 几何图形
【发布时间】:2019-05-16 00:10:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql vb.net sqlgeometry


    【解决方案1】:

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

    所以,一旦我有了最终的“阴影”多边形,我就找不到 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 业余爱好者,哎呀,我什至无法让代码示例在此处正确显示,即使当前代码不是最佳的,但它可以完成工作。希望有人觉得这很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多