66[[nodiscard]]
constexpr T cubicInterpolation(T y0, T y1, T y2, T y3, T mu)
noexcept
134 std::array<SeedType, dimensionCount> unitPosition;
135 std::array<FloatType, dimensionCount> offsetPosition = position;
137 for (std::size_t dimension = 0; dimension < dimensionCount; dimension++)
140 unitPosition.at(dimension) =
static_cast<int>(floor(position.at(dimension)));
143 offsetPosition.at(dimension) -= unitPosition.at(dimension);
147 std::array<FloatType, impl::ipow(4, dimensionCount)> nodes;
149 for (std::size_t node = 0; node < nodes.size(); node++)
151 std::array<SeedType, dimensionCount + 1> nodePosition;
152 nodePosition[dimensionCount] = seed_ * 2;
154 for (std::size_t dimension = 0; dimension < dimensionCount; dimension++)
157 nodePosition.at(dimension) =
158 (node /
static_cast<int>(pow(4,
static_cast<double>(dimension)))) % 4 + unitPosition.at(dimension);
161 std::seed_seq seq(nodePosition.begin(), nodePosition.end());
162 std::array<SeedType, 1> nodeSeed {};
163 seq.generate(nodeSeed.begin(), nodeSeed.end());
167 nodes.at(node) =
DistType(-1.0, 1.0)(engine);
170 for (std::size_t dimension = 0; dimension < dimensionCount; dimension++)
172 const auto interpolatedNodeCount = (nodes.size() / 4) /
static_cast<int>(pow(4,
static_cast<double>(dimension)));
174 for (std::size_t interpolatedNode = 0; interpolatedNode < interpolatedNodeCount; interpolatedNode++)
177 const auto node = interpolatedNode * 4;
180 nodes.at(interpolatedNode) = ::sen::impl::cubicInterpolation(
181 nodes.at(node), nodes.at(node + 1), nodes.at(node + 2), nodes.at(node + 3), offsetPosition.at(dimension));
FloatType operator()(std::array< FloatType, dimensionCount > position)
Return a noise value from an n-dimensional position.
Definition gradient_noise.h:132