0

任意のオブジェクトがこのメソッドを呼び出すことができ、同じメソッドを呼び出す他のオブジェクトに同期されたオフセットが返されるように、秒単位の現在の時間に基づいて振動オフセット値を計算したいと考えています。

これは、locationOffset プロパティのセッターです。

- (float)locationOffset
{
    float currentTime = [[NSDate date] timeIntervalSince1970];
    locationOffset = sinf(currentTime);
    CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);

    return locationOffset;
}

私はこれを 60Hz と呼んでおり、出力は次のようになります。

--- current time = 1316013568.000000000, location offset = -0.1

・・・と、このままです。小数点以下はすべてゼロにする必要がありますか?

currentTime をスケーリングすることで周波数を調整し、オフセットをスケーリングすることで「波長」を調整できると期待していますが、正弦波の locationOffset を時間に基づいて前後にスイングさせる必要があります。

位置オフセットは、2pi 秒ごとに -1 から 1 に循環する必要があるようです。

編集:現在動作するメソッドを追加する必要があります。

- (float)locationOffset
{
    double currentTime = [[NSDate date] timeIntervalSinceReferenceDate];
    locationOffset = sin(2.0f*currentTime) * 12.0f;
//    CCLOG(@"--- current time = %1.9f, location offset = %1.1f", currentTime, locationOffset);

    return locationOffset;
}

これは pi 秒ごとに循環し、マグニチュードは +/- 12 です。

4

1 に答える 1

1

はい、あなたの問題は、float値の有効数字が約 7 桁しかないことです。整数値 1316013568 を正しく表現するのに十分な精度さえないため、同じ値をsinf何度も何度も効果的にフィードしています。値に固執しdouble、倍精度sin関数を使用するか、浮動小数点数に変換する前に数値を約 6 桁未満の整数値にスケーリングします。

于 2011-09-14T18:59:12.893 に答える