0

我在坐标系中有一个点,320*240我想转换到不同的坐标系,比如1024*768or 1920*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坐标系中得到一个点,我试图将它移动到另一个坐标系。

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

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

谢谢

4

2 回答 2

0

您正在将坐标从某个虚拟系统(即 320x240)转换为真正的坐标系统(即PrimaryScreenWidthx 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);

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

于 2013-07-15T12:53:37.257 回答
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。

于 2013-07-15T12:50:56.847 回答