Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向下舍入最接近的浮点整数幂_C++_Qt_Zooming - Fatal编程技术网

C++ 向下舍入最接近的浮点整数幂

C++ 向下舍入最接近的浮点整数幂,c++,qt,zooming,C++,Qt,Zooming,给定两个浮点值zoomAmount和zoomFactor,我需要计算一个新的zoomAmount,以便: (newZoomAmount <= zoomAmount) && (newZoomAmount == pow( zoomFactor, i )) 对于任何整数i。我可以很容易地通过值循环或通过表进行二进制搜索来找到答案。然而:是否有一个封闭的形式来实现这一点 动机:动物因子是2⅕ ≅ 1.148698354997035,因此每5次放大事件都会导致2次放大。当缩放图表以

给定两个浮点值zoomAmount和zoomFactor,我需要计算一个新的zoomAmount,以便:

(newZoomAmount <= zoomAmount) && (newZoomAmount == pow( zoomFactor, i ))
对于任何整数i。我可以很容易地通过值循环或通过表进行二进制搜索来找到答案。然而:是否有一个封闭的形式来实现这一点

动机:动物因子是2⅕ ≅ 1.148698354997035,因此每5次放大事件都会导致2次放大。当缩放图表以适应屏幕时,我希望缩放级别是这些槽口中的一个,以便缩放最终精确地落在“基本”1.0缩放级别上。

表示:

A = zoomAmount
F = zoomFactor
newA = newZoomAmount
我们有:

newA = pow(F, i)
=> log(newA) = i*log(F)
=> i = log(newA)/log(F)

正如newA所述,只需替换并重新评估:


newZoomAmount pow zoomFactor,基本上是对数。我将忽略以下事实:log的底层实现可能会迭代,因为您可能不介意

使用以下命令:

zoomFactor = 21/5 = 1.148698354997035 zoomAmount = 2.25 要得到下一个最小的整数,应该减去1,然后取上限

newZoomExponent = ⌈zoomExponent - 1⌉ = ⌈4.84962...⌉ = 5
这显然是我们不想要的。

用Qt标记,因为这是用来缩放QGraphicsView的,因此我有任何Qt方法可以让这更容易实现。你明白了。我用一个摘要行编辑了你的答案,该行扩展回问题中的值。+1表示替换和重新计算。我需要一层楼才能转弯 zoomFactor = 21/5 = 1.148698354997035 zoomAmount = 2.25 (newZoomAmount < 2.25) && (newZoomAmount == 2i/5) newZoomAmount == 2 i == 5 zoomExponent = log(zoomAmount) / log(zoomFactor) = 0.81093... / 0.13862... = 5.84962... newZoomExponent = ⌈zoomExponent - 1⌉ = ⌈4.84962...⌉ = 5 newZoomAmount = zoomFactornewZoomExponent
⌊zoomExponent⌋ == zoomExponent
newZoomAmount == zoomAmount