From 8bef347d0529e869f72490a45495f0a4a1722f39 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 18 Jan 2018 14:43:13 +0100 Subject: [PATCH] Unify some functions in utils. --- src/FlatLayerVisualisation.cpp | 5 ++--- src/FlatLayerVisualisation.hpp | 2 +- src/MultiImageVisualisation.cpp | 3 +-- src/utils.cpp | 14 ++++++++++++++ src/utils.hpp | 28 ++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 src/utils.cpp diff --git a/src/FlatLayerVisualisation.cpp b/src/FlatLayerVisualisation.cpp index 120c15d..7152504 100644 --- a/src/FlatLayerVisualisation.cpp +++ b/src/FlatLayerVisualisation.cpp @@ -91,10 +91,9 @@ void FlatLayerVisualisation::setVertexPositions(const int vertexNo, float *desti yOffset = 0; break; - case Ordering ::SQUARE: + case Ordering::SQUARE: const auto nodes = faceCount / 4; - auto columns = static_cast(ceil(sqrt(nodes))); - while (nodes % columns) ++columns; + auto columns = static_cast(numCols(nodes)); zOffset = -2 * (vertexNo % columns); yOffset = 2 * (vertexNo / columns); diff --git a/src/FlatLayerVisualisation.hpp b/src/FlatLayerVisualisation.hpp index 4a40d76..4a6da11 100644 --- a/src/FlatLayerVisualisation.hpp +++ b/src/FlatLayerVisualisation.hpp @@ -26,6 +26,6 @@ namespace fmri std::unique_ptr colorBuffer; std::unique_ptr indexBuffer; - void setVertexPositions(const int vertexNo, float *destination); + void setVertexPositions(int vertexNo, float *destination); }; } diff --git a/src/MultiImageVisualisation.cpp b/src/MultiImageVisualisation.cpp index 8f4794d..d1b3df6 100644 --- a/src/MultiImageVisualisation.cpp +++ b/src/MultiImageVisualisation.cpp @@ -17,8 +17,7 @@ MultiImageVisualisation::MultiImageVisualisation(const fmri::LayerData &layer) CHECK_EQ(1, images) << "Only single input image is supported" << endl; - int columns = ceil(sqrt(channels)); - while (channels % columns) columns++; + int columns = numCols(channels); // Create the quads for the images. int r = 0, c = 0; diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 0000000..a7ef521 --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,14 @@ +#include "utils.hpp" + +std::default_random_engine &fmri::rng() +{ + static std::default_random_engine rng; + static std::default_random_engine::result_type seed = 0; + + if (seed == 0) { + std::random_device dev; + rng.seed(seed = dev()); + } + + return rng; +} diff --git a/src/utils.hpp b/src/utils.hpp index 2f9890c..4eea72d 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -127,4 +128,31 @@ namespace fmri return val / 180 * M_PI; } + /** + * Compute the ideal number of columns for dividing up a range into a rectangle. + * + * @tparam T + * @param elems number of elements to space out + * @return the ideal number of columns + */ + template + inline T numCols(const T elems) { + auto cols = static_cast(ceil(sqrt(elems))); + + while (elems % cols) { + ++cols;// TODO: this should probably be done analytically + } + + return cols; + } + + /** + * Get a globally initialized random number generator. + * + * This RNG should always be used as a reference, to make sure the state actually updates. + * + * @return A reference to the global RNG. + */ + std::default_random_engine& rng(); + }