C#数学不准确吗?

时间:2014-11-10 14:14:22

标签: c# rotatetransform

我有两个变量:counterfrequency。我正在使用这两个变量:

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度。我的数学在这里出了什么问题?

1 个答案:

答案 0 :(得分:9)

您可能有四舍五入的问题。请注意,如果您想要浮点结果,则需要进行浮点数学运算。在您的代码中,您混合了intdouble 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));

counterfrequencydouble s。


编辑:将最后一行更改为

就足够了
saveImage.RenderTransform = new RotateTransform(counter * (360.0 / frequency));

并将变量保留为intupdateTimer中的最后一行不起作用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一样。