【发布时间】:2019-12-26 15:31:45
【问题描述】:
我为 Wear OS 重新编译了我的图形应用程序,但有些东西坏了。该应用程序显示一个网格和一个波形,但波形构造错误。在磨损中,网格更粗,这种误差很明显。我已经展示了原始代码和修改后的代码 下面的顺序。
// scale Y coordinate. Input, elevation in feet.
// Output, y position of elevation in screen coordinate
static float scaleY(double elevation) {
double a, b, c, offsetFromTopFeet, pixelRange, feetRange, pixelsPerFoot,offsetFromTopPixels;
// original coding
a = maxY - elevation; //point in terms of feet within vert scale.
b = (bottom - top) / (maxY - minY);
c = top + (float) (a * b);
// return (float)c;
// new coding
offsetFromTopFeet = maxY - elevation; // a
pixelRange = bottom - top;
feetRange = maxY - minY;
pixelsPerFoot = pixelRange / feetRange; // b
offsetFromTopPixels = top + offsetFromTopFeet * pixelsPerFoot;
return (float) offsetFromTopPixels;
}
即使变量是双精度数,原始编码中 b 的计算也会返回整数结果。这就是扭曲波形的原因。在变量pixelsPerFoot 下方显示的重构代码中计算正确,并且图形显示正确。我在 android 应用程序中使用了这个例程很多年了,要么我从来没有注意到这个问题,更精细的网格覆盖了它,还是其他什么?
我的问题是为什么 b 计算返回一个整数,但 pixelPerFoot 返回正确的类型?这是编程错误吗?
【问题讨论】:
-
除非我们知道您使用的每个变量的数据类型,否则这是无法回答的。它可能不是你想象的那样。
-
您的代码中的一些 cmets:请不要在一行中声明多个变量。相反,在自己的行上声明每个变量。 --- 声明接近第一次使用的变量,在声明中初始化它们。 --- 使用说出变量名:而不是
a、b、c...使用描述此变量语义的名称。 -
maxY、minY、bottom 和 top 是整数。
-
@user1644002 以及为什么表达式
(bottom - top) / (maxY - minY)的计算结果应为double或float如果所有组件都是ints? -
是的,原始代码来自一个示例,我不理会它。这很难理解。替换代码我用有意义的名称命名变量。但这对编译器来说并不重要。
标签: java android calculation