Модуль Noise++ Perlin все время возвращает 0

Я использую библиотеку Noise++ для создания шума в своей программе, ну, по крайней мере, это цель. Я настроил его как один из тестов, чтобы проверить его, однако независимо от того, какие параметры я ему даю, я получаю только 0

Если у кого-то есть опыт работы с Noise++, было бы очень полезно, если бы вы могли проверить и посмотреть, не делаю ли я что-то не так.

//
// Defaults are
// Frequency    =   1
// Octaves      =   6
// Seed         =   0
// Quality      =   1
// Lacunarity   =   2
// Persistence  =   0.5
// Scale        =   2.12
//

NoiseppNoise::NoiseppNoise( ) : mPipeline2d( 2 )
{
    mThreadCount = noisepp::utils::System::getNumberOfCPUs ();

    mPerlin.setSeed(4321);
    if ( mThreadCount > 2 ) {
        mPipeline2d = noisepp::ThreadedPipeline2D( mThreadCount );
    }

    mNoiseID2D = mPerlin.addToPipe ( mPipeline2d );
    mCache2d = mPipeline2d.createCache();
}

double NoiseppNoise::Generate( double x, double y )
{
    return mPipeline2d.getElement( mNoiseID2D )->getValue ( x, y, mCache2d );
}

person Richy19    schedule 24.10.2013    source источник
comment
Вы уверены, что ждете завершения потоков?   -  person stralep    schedule 25.10.2013
comment
Я думал, что все потоки выполняются внутри, то есть: пользователю (в данном случае мне) не нужно беспокоиться о проблемах с потоками.   -  person Richy19    schedule 25.10.2013
comment
Это работает, если вы не используете потоки?   -  person Retired Ninja    schedule 25.10.2013


Ответы (1)


Я добавил следующие строки в ваш код для компиляции (в основном никаких изменений, кроме очистки кеша):

struct NoiseppNoise
{
  NoiseppNoise();
  double Generate( double x, double y );

  noisepp::ThreadedPipeline2D mPipeline2d;
  noisepp::ElementID mThreadCount;
  noisepp::PerlinModule mPerlin;
  noisepp::ElementID mNoiseID2D;
  noisepp::Cache*  mCache2d;
};

/* constructor as in the question */

double NoiseppNoise::Generate( double x, double y )
{
  mPipeline2d.cleanCache (mCache2d);  // clean the cache before calculating value
  return mPipeline2d.getElement( mNoiseID2D )->getValue ( x, y, mCache2d );
}

Вызов его с

NoiseppNoise np;
std::cout<<np.Generate(1.5,1)<<std::endl;

на самом деле выводит хорошее значение, 0,0909 для меня.

Однако, если вы вызовете его с двумя «целыми числами» (например, 3.0 и 5.0), вывод будет 0, потому что в какой-то момент выполняется что-то похожее на следующий оператор:

const Real xs = Math::CubicCurve3 (x - Real(x0));

Если параметры являются целыми числами, то x и Real(x0) всегда одинаковы, потому что Real(x0) в основном является целочисленной частью x, и поэтому xs будет установлено в 0. После этого есть дополнительные вычисления, чтобы получить фактическое значение, но оно детерминировано становится 0.

person Sigroad    schedule 25.10.2013