离中心远的像素点位置移动得远,离中心点近的反之。问题是在数学上如何表示.
我要编写的是一个image控件的放大拖动的地图程序,只能做到以中心放大,当图片拖动后,需要以当前中心点放大。
 
在计算偏移量时,碰到如题的难题。

解决方案 »

  1.   

    进行"视图放大",而不是"数据放大",怎么样?使用PictureBox的Scale方法,更改内部大小,再重新绘图即可.内部大小大于视图大小,则视图只能显示图象的一部分,等效于"放大"了,反之亦然.这样代码也简单.
      

  2.   

    简单的坐标转换:
    假定 Image 是直接放在 Form 上的,那么中心点就是 (ScaleWidth/2, ScaleHeight/2)。
    将当前 Image 控件的四边 (Left,Top,Right,Botton) 坐标转换成以中心点为原点的临时坐标。
    将临时坐标乘以放大比例。
    最后在转换为窗体左上角为原点的客户区坐标,按此移到和缩放 Image 控件。
    Option ExplicitPrivate Sub Zoom(ByVal dScale As Double)
        Dim dX As Double, dY As Double
        Dim dLeft As Double, dTop As Double, dRight As Double, dBottom As Double
        
        dX = ScaleWidth / 2
        dY = ScaleHeight / 2
        
        dLeft = (Image1.Left - dX) * dScale + dX
        dTop = (Image1.Top - dY) * dScale + dY
        dRight = (Image1.Left + Image1.Width - dX) * dScale + dX
        dBottom = (Image1.Top + Image1.Height - dY) * dScale + dY
        
        Image1.Move dLeft, dTop, dRight - dLeft, dBottom - dTop
    End SubPrivate Sub Form_Load()
        Me.ScaleMode = vbPixels
        Set Image1.Picture = LoadPicture("C:\WINDOWS\Web\Wallpaper\Bliss.bmp")
        Image1.Move 0, 0
        Image1.Stretch = True
    End SubPrivate Sub Image1_DblClick()
        '模拟移动'
        Image1.Move Image1.Left + 100 * (0.5 - Rnd), Image1.Top + 100 * (0.5 - Rnd)
    End SubPrivate Sub mnuZoomIn_Click()
        Zoom 2 '放大'
    End SubPrivate Sub mnuZoomOut_Click()
        Zoom 0.5 '缩小'
    End Sub