代码之家  ›  专栏  ›  技术社区  ›  DanyR

如何在gdi中正确绘制地图坐标+

  •  1
  • DanyR  · 技术社区  · 11 年前

    我有一个大的扫描地图,我想用它来显示移动目标的位置

    我将地图加载到面板内的图片框中

    • 面板设置为自动滚动。图片框大小模式设置为 自动调整大小(_S)

    为了计算变换,我让用户采样3个点来计算仿射变换矩阵

     [x' y' 1] = [x y 1] * [a b 0
                            c d 0
                            e f 1]
    

    我知道转换成功,因为鼠标悬停事件显示正确的坐标:

    Private Sub picMap_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picMap.MouseMove
                If _CalibSuccess Then
    
                    Dim CurPoint(0) As PointF
                    CurPoint(0).X = e.X : CurPoint(0).Y = e.Y
    
                    Dim genericGraphics As Drawing.Graphics = CreateGraphics()
                    Dim Mat As Drawing2D.Matrix = New Drawing2D.Matrix(mdlGlobal._GeoRefParams(0), mdlGlobal._GeoRefParams(3), _
                                                                       mdlGlobal._GeoRefParams(1), mdlGlobal._GeoRefParams(4), _
                                                                       mdlGlobal._GeoRefParams(2), mdlGlobal._GeoRefParams(5))
                    genericGraphics.Transform = Mat
                    genericGraphics.TransformPoints(Drawing2D.CoordinateSpace.Device, Drawing2D.CoordinateSpace.World, CurPoint)
    
                    lblX.Text = CurPoint(0).X
                    lblY.Text = CurPoint(0).Y
                Else
                    lblX.Text = e.X
                    lblY.Text = e.Y
                End If
    
            End Sub
    

    但当我试图在屏幕上画一个标记时,我一无所获

    Private Sub picMap_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picMap.Paint
            Dim drawGraphics As Graphics = e.Graphics
    
    
            If _CalibSuccess And _BroadCasting Then
                Dim Mat As Drawing2D.Matrix = New Drawing2D.Matrix(mdlGlobal._GeoRefParams(0), mdlGlobal._GeoRefParams(3), _
                                                                   mdlGlobal._GeoRefParams(1), mdlGlobal._GeoRefParams(4), _
                                                                   mdlGlobal._GeoRefParams(2), mdlGlobal._GeoRefParams(5))
                drawGraphics.ResetTransform()
                drawGraphics.Transform = Mat
    
                drawGraphics.FillRectangle(Brushes.Red, _ShipBase.X - (100.0F / 3600.0F), _ShipBase.Y - (100.0F / 3600.0F), (200.0F / 3600.0F), (200.0F / 3600.0F))
    
            End If
        End Sub
    

    你能告诉我我做错了什么吗?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Esme Povirk    11 年前

    你的变换矩阵是它需要的逆矩阵。你可以知道,因为你的TransformPoints调用是从世界坐标到设备坐标,但你的鼠标输入已经在设备坐标中。