20 #ifndef WORLD_BUILDER_POINT_H 21 #define WORLD_BUILDER_POINT_H 23 #define _USE_MATH_DEFINES 45 inline double fmod(
const double x,
const double y)
47 if (y < 0.0 || y > 0.0)
49 const double x_div_y = x/y;
50 return (x_div_y-static_cast<int>(x_div_y))*y;
69 constexpr
double oneminPmin = 1.-0.1952403377008734-0.01915214119105392;
71 const double y = A* angle * (
Consts::PI - angle );
72 return y*( oneminPmin + y*( 0.1952403377008734 + y * 0.01915214119105392 ) ) ;
81 inline double sin(
const double raw_angle)
97 inline double cos(
const double angle)
110 template<
unsigned int dim>
121 point(
std::array<double,dim>()),
122 coordinate_system(coordinate_system_)
133 coordinate_system(coordinate_system_)
143 point(location.get_array()),
144 coordinate_system(coordinate_system_)
153 point(location.get_array()),
154 coordinate_system(location.get_coordinate_system())
178 point = point_right.
point;
190 "Cannot take the dot product of two points which represent different coordinate systems.");
191 const std::array<double,dim> &array = point_right.
get_array();
192 double dot_product = 0;
193 for (
unsigned int i = 0; i < dim; ++i)
194 dot_product += point[i] * array[i];
206 std::array<double,dim> array;
207 for (
unsigned int i = 0; i < dim; ++i)
208 array[i] = point[i] * scalar;
219 std::array<double,dim> array;
220 const double one_over_scalar = 1/scalar;
221 for (
unsigned int i = 0; i < dim; ++i)
222 array[i] = point[i] * one_over_scalar;
233 "Cannot add two points which represent different coordinate systems.");
234 Point<dim> point_tmp(point,coordinate_system);
235 for (
unsigned int i = 0; i < dim; ++i)
236 point_tmp[i] += point_right[i];
249 "Cannot subtract two points which represent different coordinate systems. Internal has type " <<
static_cast<int>(coordinate_system)
251 Point<dim> point_tmp(point,coordinate_system);
252 for (
unsigned int i = 0; i < dim; ++i)
253 point_tmp[i] -= point_right[i];
265 for (
unsigned int i = 0; i < dim; ++i)
275 for (
unsigned int i = 0; i < dim; ++i)
287 "Cannot add two points which represent different coordinate systems.");
288 for (
unsigned int i = 0; i < dim; ++i)
289 point[i] += point_right[i];
305 if (std::fabs(point_tmp[0]) > std::numeric_limits<double>::epsilon())
307 if (std::fabs(point_tmp[1]) > std::numeric_limits<double>::epsilon())
309 if (dim == 3 && std::fabs(point_tmp[2]) > std::numeric_limits<double>::epsilon())
322 "Cannot subtract two points which represent different coordinate systems.");
323 for (
unsigned int i = 0; i < dim; ++i)
324 point[i] -= point_right[i];
334 WBAssert(index <= dim,
"Can't ask for element " << index <<
" in an point with dimension " << dim <<
'.');
344 WBAssert(index <= dim,
"Can't ask for element " << index <<
" in an point with dimension " << dim <<
'.');
353 distance(
const Point<2> &two)
const;
366 const double d_longitude = two[0] - this->point[0];
367 const double d_latitude = two[1] - this->point[1];
368 const double sin_d_lat =
FT::sin(d_latitude * 0.5);
369 const double sin_d_long =
FT::sin(d_longitude * 0.5);
370 return (sin_d_lat * sin_d_lat) + (sin_d_long*sin_d_long) *
FT::cos(this->point[1]) *
FT::cos(two[1]);
384 const double x_distance_to_reference_point = point[0]-two[0];
385 const double y_distance_to_reference_point = point[1]-two[1];
386 return (x_distance_to_reference_point*x_distance_to_reference_point) + (y_distance_to_reference_point*y_distance_to_reference_point);
405 return coordinate_system;
415 return std::sqrt(this->norm_square());
426 WBAssertThrow(
false,
"This function is only available in 2d or 3d.");
434 friend std::ostream &operator<<( std::ostream &output, const Point<dim> &stream_point )
436 for (
size_t i = 0; i < dim-1; i++)
438 output << stream_point[i] <<
' ';
440 output << stream_point[dim-1];
456 return (point[0] * point[0]) + (point[1] * point[1]);
463 return (point[0] * point[0]) + (point[1] * point[1]) + (point[2] * point[2]);
466 template<
unsigned int dim>
std::array< double, dim > point
double & operator[](const size_t index)
Point< dim > & operator+=(const Point< dim > &point_right)
Point< dim > & operator/=(const double scalar)
double fmod(const double x, const double y)
Point< dim > operator+(const Point< dim > &point_right) const
Point< dim > & operator=(const Point< dim > &point_right)
CoordinateSystem coordinate_system
double norm_square() const
Point< dim > operator-(const Point< dim > &point_right) const
double operator*(const Point< dim > &point_right) const
bool operator==(const Point< dim > &point_) const
Point< dim > operator*(const double scalar) const
template Point< 2 > operator*(const double scalar, const Point< 2 > &point)
CoordinateSystem get_coordinate_system() const
Point(const Point< dim > &location)
const std::array< double, dim > & get_array() const
#define WBAssert(condition, message)
double cheap_relative_distance_cartesian(const Point< 2 > &two) const
double cheap_relative_distance_spherical(const Point< 2 > &two) const
double cos(const double angle)
Point< dim > operator/(const double scalar) const
Point(const std::array< double, dim > &location, CoordinateSystem coordinate_system_)
Point< dim > & operator-=(const Point< dim > &point_right)
#define WBAssertThrow(condition, message)
Point(const Point< dim > &location, CoordinateSystem coordinate_system_)
double fast_sin_d(const double angle)
double sin(const double raw_angle)
Point(CoordinateSystem coordinate_system_)
const double & operator[](const size_t index) const
Point< dim > & operator*=(const double scalar)