我有两个变量:counter
和frequency
。我正在使用这两个变量:
counter = counter >= frequency ? 0 : counter + 1;
正如您所看到的,计数器会计数,直到它与频率匹配,然后重置为0.此时,frequency
设置为100
。因此计数器应达到99,然后重置为0.
我正在使用此计数器以每秒100次的速度旋转图像:
private int counter = 0;
private int frequency = 100;
private DispatcherTimer dispatch = new DispatcherTimer();
public Timer()
{
this.dispatch.Interval = TimeSpan.FromMilliseconds(1000 / frequency);
this.dispatch.Tick += new EventHandler(updateTimer);
this.dispatch.Start();
}
private void updateTimer(object sender, EventArgs e)
{
counter = counter >= frequency ? 0 : counter + 1;
saveImage.RenderTransform = new RotateTransform(counter * 3.6);
}
脚本将围绕360度平面旋转图像。由于频率设置为100,它将完全360度,因为100 * 3.6是360.如果频率设置为100,这种方法很有效。但是,如果我改变频率,它可能不会完全360度;或者它甚至可能超过360度。
对此的一个简单修复是将旋转数学更改为以下内容:
saveImage.RenderTransform = new RotateTransform(counter * (360 / frequency));
然而,实际上这样做会产生奇怪的结果。图像永远不会达到360度全转;而在它最终重置为0之前,它只达到300度。我的数学在这里出了什么问题?
答案 0 :(得分:9)
您可能有四舍五入的问题。请注意,如果您想要浮点结果,则需要进行浮点数学运算。在您的代码中,您混合了int
和double
s,这可能会导致(意外)整数除法。例如,360 / frequency
不会产生浮点数,因为频率和360
都是int
s(例如360/100 == 3 !!)。
尝试更改代码以使用浮点运算,如下所示:
private double counter = 0.0;
private double frequency = 100.0;
private DispatcherTimer dispatch = new DispatcherTimer();
public Timer()
{
// You may want integer division in this line to get full milliseconds
this.dispatch.Interval = TimeSpan.FromMilliseconds((int)(1000.0 / frequency));
this.dispatch.Tick += new EventHandler(updateTimer);
this.dispatch.Start();
}
private void updateTimer(object sender, EventArgs e)
{
counter = counter >= frequency ? 0.0 : counter + 1.0;
saveImage.RenderTransform = new RotateTransform(counter * 3.6);
}
你给出的最后一个例子应该是:
saveImage.RenderTransform = new RotateTransform(counter * (360.0 / frequency));
counter
且frequency
为double
s。
编辑:将最后一行更改为
就足够了saveImage.RenderTransform = new RotateTransform(counter * (360.0 / frequency));
并将变量保留为int
。 updateTimer
中的最后一行不起作用3.6
是硬编码的,但根据频率counter * 3.6
可能达不到/大于360°。
示例:
frequency = 50
counter = 49
counter * 3.6 = 176.4
frequency = 150
counter = 149
counter * 3.6 = 536.4
所以始终需要根据frequency
计算每个步骤中要旋转的度数,而不是硬编码,就像frequency
为100一样。