我正在将SFML库用于具有移动对象的游戏应用程序。在游戏中,我有一个球对象,并且需要确保每次移动时该球在Y轴上的偏移量至少为0.1(或-0.1)
这是我现在使用的代码:
if (offset.y < 0.0 && offset.y > -0.1) offset.y = -0.1;
if (offset.y > 0.0 && offset.y < 0.1) offset.y = 0.1;
有没有更简单/更漂亮的方式来实现这一目标?
编辑: 如评论所指出,代码应包含0.0大小写
if (offset.y < 0.0 && offset.y > -0.1) offset.y = -0.1;
if (offset.y >= 0.0 && offset.y < 0.1) offset.y = 0.1;
答案 0 :(得分:4)
只需使用std::abs()
和std::copysign()
:
if (std::abs(offset.y) < .1)
offset.y = std::copysign(.1, offset.y);
以其他任何方式保存零符号都很困难。
但是,请考虑是否不能使用积分模型; .1
不能完全表示为二进制浮点。
答案 1 :(得分:2)
恐怕“更容易或更漂亮”是基于意见的,但是您可以首先将逻辑包装到具有有意义名称的函数中(希望比我的更好)。
double at_least(double min_value, double x)
{
if (x < 0.0 && x > -min_value)
return -min_value;
if (x >= 0.0 && x < min_value)
return min_value;
return x;
}
然后,您可以尝试其他一些替代方法:
#include <cmath>
#include <algorithm>
double at_least(double min_value, double x)
{
return std::copysign(std::max(min_value, std::abs(x)), x);
}
或者这个
double at_least(double min_value, double x)
{
if (x < 0.0 )
return std::min(-min_value, x);
else
return std::max(min_value, x);
}
在测试每一项的正确性之后,如果性能对于您的任务很重要,您还可以对其进行概要分析。参见例如那些快速基准:
http://quick-bench.com/AXt8U9vKg-75XXOFMyCK0g14RyQ
http://quick-bench.com/_nfoT0BKsAvh6QDzAWc-cX3_KYU
答案 2 :(得分:1)
如果只需要小数点后一位,则可以使用小数位整数。要将其转换为浮点数,请将其乘以0.1
。要将浮点数转换为整数,请将其乘以10
并四舍五入为最接近的整数。
答案 3 :(得分:0)
我认为这已经足够了。看起来很清楚。 您可以使用cmath中的诸如abs,signbit之类的函数进行播放。或将其包装到新功能中-但是我看不到这样做的任何意义