微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#如何使用SkiaSharp控件缩放到光标位置?

如何解决C#如何使用SkiaSharp控件缩放到光标位置?

我有一个要根据光标X和Y坐标放大的2D地图。目前,我有一些工作代码,但是如果在初始缩放后将光标移动到新位置,则下一个缩放会略微关闭。我一直试图弄清楚这一点,但我无法理解数学。它可能很简单,我只是无法想象实现此目的的正确方法

示例代码

    float ZoomMax = 7f;
    float ZoomMin = 1f;

    private float[] MapPan = new float[] { 0,0 };
    private float MapScale = 1f;

    protected override void OnMouseWheel(MouseEventArgs e)
    {
        var coordinates = panelMap.PointToClient(Cursor.Position);

        if (e.Delta > 0)
        {
            if (MapScale < ZoomMax)
            {
                MapScale += 0.2f;
                ZoomToMouse(coordinates.X,coordinates.Y);
            }
            else
            {
                MapScale = ZoomMax;
            }
        }
        else if (e.Delta < 0)
        {
            if (MapScale > ZoomMin)
            {
                MapScale -= 0.2f;
                ZoomToMouse(coordinates.X,coordinates.Y);
            }
            else
            {
                MapPan[0] = 0;
                MapPan[1] = 0;
                MapScale = ZoomMin;
            }
        }
    }


    private void ZoomToMouse(int x,int y)
    {
        float xScaled = x * MapScale;
        float xScaled = y * MapScale;

        float X = x - xScaled;
        float Y = y - yScaled;

        MapPan[0] = X / MapScale;
        MapPan[1] = Y / MapScale;
    }

    private void map_PaintSurface(object sender,SKPaintGLSurfaceEventArgs e)
    {
        SKCanvas skCanvas = e.Surface.Canvas;

        skCanvas.Scale(MapScale);
        skCanvas.Translate(MapPan[0],MapPan[1]);

        using(SKPaint skPaint = new SKPaint())
        {
            skCanvas.DrawText("Hello",skPaint);
        }          
    }

解决方法

如果有人遇到类似问题,这就是我想出的。

&

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。