gpt4 book ai didi

C# 数学不准确?

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:50 26 4
gpt4 key购买 nike

我有两个变量: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 度旋转;而不是只达到 300 度,然后最终重置为 0。我的数学有什么问题吗?

最佳答案

您可能遇到舍入问题。请注意,如果您想要浮点结果,则需要进行 float 学运算。在您的代码中,您混合了 intdouble,这可能会导致(意外的)整数除法。例如 360/frequency 不会产生 float ,因为 frequency 和 360 都是 int(例如 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


编辑:将最后一行更改为

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。

关于C# 数学不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com