Infinity Engine v0.6.20
C++ API Documentation
Loading...
Searching...
No Matches
Infinity::Engine::PiecewiseLinearDistribution< RealType > Class Template Reference

Platform-independent piecewise linear distribution. More...

#include <PRNGDistribution.hpp>

Classes

struct  param_type
 Parameter set for the distribution. More...
 

Public Types

using result_type = RealType
 The type of values produced by the distribution.
 

Public Member Functions

 PiecewiseLinearDistribution ()
 Default constructor. Creates uniform distribution over [0, 1).
 
template<typename InputIteratorB , typename InputIteratorW >
 PiecewiseLinearDistribution (InputIteratorB first_b, InputIteratorB last_b, InputIteratorW first_w)
 Constructs from interval boundaries and density values.
 
template<typename UnaryOperation >
 PiecewiseLinearDistribution (std::initializer_list< RealType > bl, UnaryOperation fw)
 Constructs from interval boundaries and density function.
 
template<typename UnaryOperation >
 PiecewiseLinearDistribution (size_t nw, RealType xmin, RealType xmax, UnaryOperation fw)
 Constructs with evenly-spaced intervals and density function.
 
 PiecewiseLinearDistribution (const param_type &param)
 Constructs from a parameter set.
 
void reset ()
 Resets the distribution state.
 
std::vector< RealType > intervals () const
 Returns the interval boundaries.
 
std::vector< double > densities () const
 Returns the density values at boundaries.
 
param_type param () const
 Gets the current parameter set.
 
void param (const param_type &param)
 Sets new parameters for the distribution.
 
result_type min () const
 Gets the minimum value that can be generated.
 
result_type max () const
 Gets the maximum value that can be generated.
 
template<typename Generator >
result_type operator() (Generator &g)
 Generates the next random value using stored parameters.
 
template<typename Generator >
result_type operator() (Generator &g, const param_type &param)
 Generates the next random value using provided parameters.
 

Friends

bool operator== (const PiecewiseLinearDistribution &lhs, const PiecewiseLinearDistribution &rhs)
 
bool operator!= (const PiecewiseLinearDistribution &lhs, const PiecewiseLinearDistribution &rhs)
 

Detailed Description

template<typename RealType = double>
class Infinity::Engine::PiecewiseLinearDistribution< RealType >

Platform-independent piecewise linear distribution.

Produces real values from a distribution defined by a piecewise linear density function. The density is specified at interval boundaries and linearly interpolated between them, providing smooth transitions between different probability regions.

This distribution is more flexible than piecewise constant for smooth approximations of continuous distributions. It's ideal for terrain elevation distributions with gradual transitions, probability gradients, smooth weighting functions, or approximating complex probability density functions that require continuity.

Template Parameters
RealTypeFloating point type (float or double)

Example usage:

PRNG rng(12345);
// Triangle distribution: density increases then decreases
std::vector<float> intervals = {0.0f, 0.5f, 1.0f};
std::vector<double> densities = {0.0, 1.0, 0.0}; // Peak at 0.5
intervals.begin(), intervals.end(),
densities.begin()
);
float value = triangle(rng);
// Smooth terrain elevation: higher elevations less common
auto elevation_pdf = [](double x) { return std::exp(-x / 500.0); };
PiecewiseLinearDistribution<double> elevation(10, 0.0, 1000.0, elevation_pdf);
// Custom probability gradient for spawn rates
{0.0f, 100.0f, 500.0f, 1000.0f},
[](float dist) { return 1.0 / (1.0 + dist / 100.0); } // Decreases with distance
);
// Smooth resource distribution
auto resource_density = [](double x) {
return 0.5 + 0.5 * std::sin(x * 3.14159);
};
PiecewiseLinearDistribution<double> resources(20, 0.0, 1.0, resource_density);
Pseudo-random number generator for procedural generation.
Definition PRNG.hpp:48
std::vector< double > densities() const
Returns the density values at boundaries.
Definition PRNGDistribution.hpp:4538
std::vector< RealType > intervals() const
Returns the interval boundaries.
Definition PRNGDistribution.hpp:4535
template class INFINITY_API_PUBLIC PiecewiseLinearDistribution< float >
Definition PRNGDistribution.cpp:68
template class INFINITY_API_PUBLIC PiecewiseLinearDistribution< double >
Definition PRNGDistribution.cpp:69
Note
Densities are automatically normalized to integrate to 1.
Linear interpolation between specified density values provides smooth transitions.
More accurate than piecewise constant for approximating smooth distributions.
Uses quadratic formula for inverse CDF, ensuring exact sampling.

Member Typedef Documentation

◆ result_type

template<typename RealType = double>
using Infinity::Engine::PiecewiseLinearDistribution< RealType >::result_type = RealType

The type of values produced by the distribution.

Constructor & Destructor Documentation

◆ PiecewiseLinearDistribution() [1/5]

template<typename RealType = double>
Infinity::Engine::PiecewiseLinearDistribution< RealType >::PiecewiseLinearDistribution ( )
inline

Default constructor. Creates uniform distribution over [0, 1).

◆ PiecewiseLinearDistribution() [2/5]

template<typename RealType = double>
template<typename InputIteratorB , typename InputIteratorW >
Infinity::Engine::PiecewiseLinearDistribution< RealType >::PiecewiseLinearDistribution ( InputIteratorB  first_b,
InputIteratorB  last_b,
InputIteratorW  first_w 
)
inline

Constructs from interval boundaries and density values.

Template Parameters
InputIteratorBIterator type for boundaries
InputIteratorWIterator type for densities
Parameters
first_bIterator to first boundary
last_bIterator past last boundary
first_wIterator to first density value

◆ PiecewiseLinearDistribution() [3/5]

template<typename RealType = double>
template<typename UnaryOperation >
Infinity::Engine::PiecewiseLinearDistribution< RealType >::PiecewiseLinearDistribution ( std::initializer_list< RealType >  bl,
UnaryOperation  fw 
)
inline

Constructs from interval boundaries and density function.

Template Parameters
UnaryOperationFunction type
Parameters
blInitializer list of boundaries
fwDensity function

◆ PiecewiseLinearDistribution() [4/5]

template<typename RealType = double>
template<typename UnaryOperation >
Infinity::Engine::PiecewiseLinearDistribution< RealType >::PiecewiseLinearDistribution ( size_t  nw,
RealType  xmin,
RealType  xmax,
UnaryOperation  fw 
)
inline

Constructs with evenly-spaced intervals and density function.

Template Parameters
UnaryOperationFunction type
Parameters
nwNumber of intervals
xminMinimum boundary
xmaxMaximum boundary
fwDensity function

◆ PiecewiseLinearDistribution() [5/5]

template<typename RealType = double>
Infinity::Engine::PiecewiseLinearDistribution< RealType >::PiecewiseLinearDistribution ( const param_type param)
inlineexplicit

Constructs from a parameter set.

Parameters
paramThe distribution parameters

Member Function Documentation

◆ densities()

template<typename RealType = double>
std::vector< double > Infinity::Engine::PiecewiseLinearDistribution< RealType >::densities ( ) const
inline

Returns the density values at boundaries.

◆ intervals()

template<typename RealType = double>
std::vector< RealType > Infinity::Engine::PiecewiseLinearDistribution< RealType >::intervals ( ) const
inline

Returns the interval boundaries.

◆ max()

template<typename RealType = double>
result_type Infinity::Engine::PiecewiseLinearDistribution< RealType >::max ( ) const
inline

Gets the maximum value that can be generated.

◆ min()

template<typename RealType = double>
result_type Infinity::Engine::PiecewiseLinearDistribution< RealType >::min ( ) const
inline

Gets the minimum value that can be generated.

◆ operator()() [1/2]

template<typename RealType = double>
template<typename Generator >
result_type Infinity::Engine::PiecewiseLinearDistribution< RealType >::operator() ( Generator &  g)
inline

Generates the next random value using stored parameters.

Template Parameters
GeneratorThe random number generator type (e.g., PRNG)
Parameters
gThe random number generator
Returns
A random value according to the piecewise linear distribution

◆ operator()() [2/2]

template<typename RealType = double>
template<typename Generator >
result_type Infinity::Engine::PiecewiseLinearDistribution< RealType >::operator() ( Generator &  g,
const param_type param 
)
inline

Generates the next random value using provided parameters.

Uses a three-step process:

  1. Select an interval based on cumulative probabilities (binary search)
  2. Compute local cumulative probability within the selected interval
  3. Invert the linear CDF using quadratic formula to find the value

For a linear density d(x) = d0 + m*(x-x0) in an interval, the CDF is: F(x) = d0*(x-x0) + 0.5*m*(x-x0)²

Solving F(x) = u for x requires the quadratic formula, ensuring exact sampling from the piecewise linear density.

Template Parameters
GeneratorThe random number generator type (e.g., PRNG)
Parameters
gThe random number generator
paramThe distribution parameters to use for this generation
Returns
A random value from the piecewise linear distribution

◆ param() [1/2]

template<typename RealType = double>
param_type Infinity::Engine::PiecewiseLinearDistribution< RealType >::param ( ) const
inline

Gets the current parameter set.

◆ param() [2/2]

template<typename RealType = double>
void Infinity::Engine::PiecewiseLinearDistribution< RealType >::param ( const param_type param)
inline

Sets new parameters for the distribution.

◆ reset()

template<typename RealType = double>
void Infinity::Engine::PiecewiseLinearDistribution< RealType >::reset ( )
inline

Resets the distribution state.

No-op for piecewise linear distribution as it maintains no internal state.

Friends And Related Symbol Documentation

◆ operator!=

template<typename RealType = double>
bool operator!= ( const PiecewiseLinearDistribution< RealType > &  lhs,
const PiecewiseLinearDistribution< RealType > &  rhs 
)
friend

◆ operator==

template<typename RealType = double>
bool operator== ( const PiecewiseLinearDistribution< RealType > &  lhs,
const PiecewiseLinearDistribution< RealType > &  rhs 
)
friend