C#将点从一个屏幕坐标转换为另一个屏幕坐标

时间:2013-07-15 12:03:06

标签: c# .net transform coordinate-systems

我在320*240坐标系中有一个点,我想转换为不同的坐标系,比如1024*7681920*1600

是否有预定义的.net类来实现这一目标?

我试图像这样解决它 -

screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
double newWidth = x / 320 * screenWidth;
double newHeight = y / 240 * screenHeight;
bola.SetValue(Canvas.LeftProperty, newWidth);
bola.SetValue(Canvas.TopProperty, newHeight);

我从320*240坐标系得到一个点,我正试图将它移动到另一个坐标系。

有没有更好的方法来实现这一目标?

其次,我继续得到这一点,是否有更好的方法来平滑这一点,因为它在运动中非常紧张?

谢谢

2 个答案:

答案 0 :(得分:0)

如果两个参考系统中的原点相同,则情况如何(0,0);您唯一能做的就是依靠简单的三条规则将值从一个系统扩展到另一个系统:

curX    -> in 340
newX    -> in newWidth(1024)

newX = newWidth(1024) * curX/340 OR newX = curX * ratio_newWidthToOldWidth

高度相同(newY = curY * ratio_newHeightToOldHeight)。

这已经是一种非常简单的方式,为什么要寻找更简单的替代方案呢?

在任何情况下,您都应该记住,宽度/高度比从一个分辨率变为另一个(即您提供的示例中的1.33和1.2),因此如果您盲目地应用此转换,则会出现对象的外观可能会改变(将适应给定的屏幕,但可能看起来比你想要的更糟)。因此,您可能希望保留原始的宽高比,并执行以下操作:

newX = ...
newY = ...
if(newX / newY != origXYRatio)
{
   newX = newY * origXYRatio // or vice versa
}

因此,在这种情况下,您只需要计算一个变量X或Y.

答案 1 :(得分:0)

您正在将坐标从某个虚拟系统(即320x240)转换为真正的坐标系(即PrimaryScreenWidth x PrimaryScreenHeight)。我不认为除了你正在做的事情之外,还有更好的方法。

为了提高代码可读性,您可以引入一个函数来更好地传达您的最新信息:

// Or whatever the type of "ctl" is ...
private void SetPositionInVirtualCoords(Control ctl, double x, double y)
{
    screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
    screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;        
    ctl.SetValue(Canvas.LeftProperty, x * (screenWidth/320.0));
    ctl.SetValue(Canvas.TopProperty, y * (screenHeight/240.0));
}

...以便您的主要代码可以读作:

SetPositionInVirtualCoords(bola, x, y);

也可以被其他控件重复使用。