0

2 つの浮動小数点値zoomAmountとが与えられた場合、次のようzoomFactorに を計算する必要があります。newZoomAmount

(newZoomAmount <= zoomAmount) && (newZoomAmount == pow( zoomFactor, i ))

任意の整数i。値を簡単にループしたり、テーブルを二分探索したりして、答えを見つけることができます。ただし、これを達成するための閉じたフォームはありますか?


動機:zoomFactorは 2 ⅕</sup> ≅1.148698354997035であるため、5 回の「ズームイン」イベントごとに、正確に 2 の累乗が増加します。ダイアグラムを画面に合わせてズームするとき、ズーム レベルをこれらのノッチのいずれかにして、ズーム アウトが最終的に「ベース」の 1.0 ズーム レベルに正確に到達するようにします。

4

4 に答える 4

4

意味:

A = zoomAmount
F = zoomFactor
newA = newZoomAmount

我々は持っています:

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

そして、newA <= A であり、log は非減少です。

i = floor(log(A)/log(F))

newZoomAmount = pow( zoomFactor, floor( log(zoomAmount)/log(zoomFactor) ) );
于 2013-06-18T15:58:46.687 に答える
2

基本、対数。logおそらく気にしないので、おそらくの基になる実装が反復するという事実を無視します。

以下を使用します。

ズーム係数 = 2 1/5
           = 1.148698354997035
ズーム量 = 2.25

以下を見つける必要があります (以下ではなく以下を使用していることに注意してください。理由については末尾を参照してください)。

(newZoomAmount < 2.25) && (newZoomAmount == 2 i/5 )

調べると、わかります(以来と)zoomFactor5 == 2zoomFactor6 == 2.297... > 2.25

newZoomAmount == 2
私 == 5

したがって、zoomAmount指数の観点から電流を取得するには、次のようにします。

zoomExponent = log(zoomAmount) / log(zoomFactor)
             = 0.81093... / 0.13862...
             = 5.84962...

次に小さい整数を取得するには、1 を引いてから上限を取得する必要があります。

newZoomExponent = ⌈zoomExponent - 1⌉
                = ⌈4.84962...⌉
                = 5

ついに:

newZoomAmount = zoomFactor newZoomExponent

床だけでなく減少の上限を使用する理由は、zoomAmountが の完全累乗である特殊なケースを処理するためですzoomFactor

⌊zoomExponent⌋ == zoomExponent
newZoomAmount == zoomAmount

これは明らかに望んでいません。

于 2013-06-18T16:19:43.273 に答える
1

置き換えて再評価するだけです:

(newZoomAmount <= zoomAmount) && (newZoomAmount == pow( zoomFactor, i ))=> pow( zoomFactor, i ) <= zoomAmount=> i * ln(zoomFactor) <= ln(zoomAmount)=>i <= ln(zoomAmount) / ln(zoomFactor)これは単に反復するよりも速い場合とそうでない場合があります。

次に、割り当てるだけですnewZoomAmount = pow( zoomFactor, i );

于 2013-06-18T15:59:14.113 に答える
1
exponent=log(zoomAmount)/log(zoomFactor); /* zoomFactor^exponent == zoomAmount */
newZoomAmount=pow(zoomFactor,floor(exponent)); /* round down exponent */
于 2013-06-18T16:01:45.233 に答える