X、 WriteableBitmap和GestureListener_Map的Y坐标不匹配-Windows Phone

本文关键字:坐标 不匹配 -Windows Phone Map WriteableBitmap GestureListener | 更新日期: 2023-09-27 17:57:27

我正在创建一个隐藏对象游戏,并试图在发现eclipse时标记该对象。我手动保存了通过GestureListener_Map事件获得的每张图片的左上角和右下角坐标。

问题是,当我试图使用以下代码绘制以坐标为界的日食时

WriteableBitmapExtensions.DrawEllipse(writeableBmp, AnsX1, AnsY1, AnsX2, AnsY2, Colors.Red);

日食的位置总是偏左上角。使用以下代码标记像素位置表明,它们的位置确实与我从GestureListener_Map中期望的不同。

writeableBmp.SetPixel(AnsX1, AnsY1, Colors.Red);
writeableBmp.SetPixel(AnsX2, AnsY2, Colors.Red);

我标记位置的代码:

    private void fadeOutAnimation_Ended(object sender, EventArgs e)
    {
        WriteableBitmap writeableBmp = new WriteableBitmap(bmpCurrent);
        imgCat.Source = writeableBmp;
        writeableBmp.GetBitmapContext();
        WriteableBitmapExtensions.DrawEllipse(writeableBmp, AnsX1, AnsY1, AnsX2, AnsY2, Colors.Red);
        writeableBmp.SetPixel(AnsX1, AnsY1, Colors.Red);
        writeableBmp.SetPixel(AnsX2, AnsY2, Colors.Red);
        // Present the WriteableBitmap
        writeableBmp.Invalidate();       
        //Just some animation code
        RadFadeAnimation fadeInAnimation = new RadFadeAnimation();
        fadeInAnimation.StartOpacity = 0.2;
        fadeInAnimation.EndOpacity = 1.0;
        RadAnimationManager.Play(this.imgCat, fadeInAnimation);
    }

我错过了什么?

编辑:

我下面的回答没有考虑到屏幕方向的变化。请参阅我在答案下方的评论。如何将像素坐标映射到图像坐标?

编辑2:

找到了正确的解决方案。更新了我的答案

X、 WriteableBitmap和GestureListener_Map的Y坐标不匹配-Windows Phone

根据@PaulAnnetts的评论,我成功地转换了像素坐标。我最初的错误是假设图像坐标与像素坐标相同!我使用以下代码进行转换。

    private int xCoordinateToPixel(int coordinate)
    {
        double x;
        x = writeableBmp.PixelWidth / imgCat.ActualWidth * coordinate;
        return Convert.ToInt32(x);
    }
    private int yCoordinateToPixel(int coordinate)
    {
        double y;
        y = writeableBmp.PixelHeight / imgCat.ActualHeight * coordinate;
        return Convert.ToInt32(y);
    }

编辑:

由于PixelHeight和PixelWidth是固定的,并且ActualHeight&实际宽度不是,我应该在GestureListener_Tap事件中将像素转换为坐标。

        if ((X >= xPixelToCoordinate(AnsX1) && Y >= yPixelToCoordinate(AnsY1)) && (X <= xPixelToCoordinate(AnsX2) && Y <= yPixelToCoordinate(AnsY2)))
        {...}

我的像素到坐标转换器

    private int xPixelToCoordinate(int xpixel)
    {
        double x = imgCat.ActualWidth / writeableBmp.PixelWidth * xpixel;
        return Convert.ToInt32(x);
    }
    private int yPixelToCoordinate(int ypixel)
    {
        double y = imgCat.ActualHeight / writeableBmp.PixelHeight * ypixel;
        return Convert.ToInt32(y);
    }