Я использую библиотеку 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 );
}
Я добавил следующие строки в ваш код для компиляции (в основном без изменений, кроме очистки кеша):
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.
Других решений пока нет …