我在320*240
坐标系中有一个点,我想转换为不同的坐标系,比如1024*768
或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
坐标系得到一个点,我正试图将它移动到另一个坐标系。
有没有更好的方法来实现这一目标?
其次,我继续得到这一点,是否有更好的方法来平滑这一点,因为它在运动中非常紧张?
谢谢
答案 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);
也可以被其他控件重复使用。