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:
找到了正确的解决方案。更新了我的答案
根据@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);
}