dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/generators.h

108 lines
3.3 KiB
C
Raw Normal View History

2020-10-13 12:44:25 +00:00
// Copyright (c) 1997
// Utrecht University (The Netherlands),
// ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany),
2020-10-13 12:44:25 +00:00
// and Tel-Aviv University (Israel). All rights reserved.
//
2020-10-13 12:44:25 +00:00
// This file is part of CGAL (www.cgal.org)
//
2020-10-13 12:44:25 +00:00
// $URL: https://github.com/CGAL/cgal/blob/v5.1/Generator/include/CGAL/generators.h $
// $Id: generators.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Lutz Kettner <kettner@inf.ethz.ch>
#ifndef CGAL_GENERATORS_H
#define CGAL_GENERATORS_H 1
#include <CGAL/disable_warnings.h>
#include <CGAL/basic.h>
#include <cstddef>
#include <cmath>
#include <iterator>
#include <algorithm>
#include <CGAL/function_objects.h>
#include <CGAL/Random.h>
namespace CGAL {
template < class T >
class Generator_base {
protected:
T d_item;
double d_range;
public:
typedef std::input_iterator_tag iterator_category;
typedef T value_type;
typedef std::ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
typedef Generator_base<T> This;
Generator_base() {}
Generator_base( double range) : d_range( range) {}
Generator_base( const T& item, double range)
: d_item(item), d_range(range) {}
bool operator==( const This& base) const {
return ( d_item == base.d_item);
}
bool operator!=( const This& base) const { return ! operator==(base);}
double range() const { return d_range; }
reference operator*() const { return d_item; }
pointer operator->() const { return & operator*(); }
};
template < class T >
class Random_generator_base : public Generator_base<T> {
protected:
Random& _rnd;
public:
typedef Random_generator_base<T> This;
Random_generator_base() : _rnd( CGAL::get_default_random() ) {}
Random_generator_base( double range, Random& rnd)
: Generator_base<T>( range), _rnd( rnd) {}
Random_generator_base( const T& item, double range, Random& rnd)
: Generator_base<T>( item, range), _rnd( rnd) {}
bool operator==( const This& rb) const {
return ( _rnd == rb._rnd && Generator_base<T>::operator==(rb));
}
bool operator!=( const This& rb) const { return ! operator==(rb); }
};
class Random_double_in_interval : public Random_generator_base<double> {
public:
typedef Random_double_in_interval This;
Random_double_in_interval(double a = 1, Random& rnd = CGAL::get_default_random())
// g is an input iterator creating points of type `P' uniformly
// distributed in the half-open square with side length a,
// centered around the origin, i.e. \forall p = `*g': -\frac{a}{2}
// <= p.x() < \frac{a}{2} and -\frac{a}{2} <= p.y() < \frac{a}{2}
// . Two random numbers are needed from `rnd' for each point.
: Random_generator_base<double>( a, rnd)
2020-10-13 12:44:25 +00:00
{
this->d_item = this->d_range * (2 * this->_rnd.get_double() - 1.0);
}
2020-10-13 12:44:25 +00:00
This& operator++() {
this->d_item = this->d_range * (2 * this->_rnd.get_double() - 1.0);
return *this;
}
This operator++(int) {
This tmp = *this;
++(*this);
return tmp;
}
};
} //namespace CGAL
#include <CGAL/enable_warnings.h>
#endif // CGAL_GENERATORS_H //
// EOF //