2013-10-24 4 views
0

Im использует библиотеку Noise ++ для генерации шума в моей программе, ну, по крайней мере, это цель. У меня есть настройка как один из тестов, чтобы проверить его, однако независимо от параметров, которые я ему даю, я получаю только 0 назадNoise ++ Perlin Module возвращает 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); 
} 
+0

вы уверены, что вы ждете потоки для завершения? – stralep

+0

Я думал, что потоки были сделаны внутренне, то есть: пользователь (в этом случае мне) не нужно беспокоиться о проблемах с потоками. – Richy19

+0

Работает ли он, если вы не используете потоки? –

ответ

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); 
} 

Calling его

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.

Смежные вопросы