我试图在windows窗体应用程序中使用一个函数,将给定的点转换为另一个坐标系。然而,我遇到了一个奇怪的问题。输入正确,但输出始终为0。首先,我认为它是由局部变量引起的,然后我用整数代替变量,但它没有求解。我对此一无所知。这里的代码和输出基本上是:
string[] newPoint1 = convertPoints(X1, Y1);
string[] convertPoints(int oldX, int oldY)
{
//int newX = ((oldX - oldLeft) / (oldRight - oldLeft)) * (newRight - newLeft);
MessageBox.Show(oldX.ToString()); // output is 296
int newX = (oldX / 500) * 4096; // ????????????????????? (296/500) * 4096 = 0 ?????????????
MessageBox.Show(newX.ToString()); // here output is 0
int newY = newTop + ((oldY - oldTop) / (oldBottom - oldTop)) * (newBottom - newTop);
//MessageBox.Show(newY.ToString());
string[] newPoints = {newX.ToString(), newY.ToString()};
//MessageBox.Show(newPoints[0], newPoints[1]);
return newPoints;
}
这是正常的。因为oldX是一个整数,当你除以它时,它会四舍五入(删除小数后的任何内容)。我会把它转换成浮点数再转换成整数
int newX = (int)(((float)oldX / 500) * 4096);
这将保留整个数字,直到您在最后完成。你也需要对Y值做同样的事情
一个整数
除法去掉小数点。所以在你的例子中,296/500,你会期望0.592。由于integer
没有小数点,因此它会将它们截断,结果为0。
将oldX
更改为双倍并除以500.0
你得到0,因为oldX/500通常是一个分数,因为你使用int数据类型,所以只能是整数。我建议做的是改变数据类型,然后四舍五入。
//Old code
int newX = (1 / 500);
Console.WriteLine(newX);
// writes 0 to console
//New code
double newXD = (1 / 500.0) * 4096;
Console.WriteLine(newXD);
//Writes 8.192
1和500被认为是整数
Console.WriteLine(1/500);
它将0写入控制台。
Console.WriteLine(1/500.0);
Console.WriteLine((float)1/500);
Console.WriteLine((double)1/500);
所有这些都将8.192写入控制台。
然后,如果你有双精度或其他更精确的数据类型,如果你真的想要一个int,考虑舍入。