Fixed a numerical issue with vprod_sign etc. - was using a too coarse precision value to decide about the sign

This commit is contained in:
Matthias Koefferlein 2023-08-16 22:19:33 +02:00
parent fe90164a8a
commit da1251ada2
1 changed files with 14 additions and 14 deletions

View File

@ -32,6 +32,16 @@
namespace db {
/**
* @brief A generic constant describing the "fuzzyness" of a double comparison of a value around 1
*/
const double epsilon = 1e-10;
/**
* @brief A generic constant describing the "fuzzyness" of a float comparison of a value around 1
*/
const double fepsilon = 1e-6;
/**
* @brief The standard integer coordinate type
*/
@ -424,7 +434,7 @@ struct coord_traits<double>
{
double dx1 = ax - cx, dy1 = ay - cy;
double dx2 = bx - cx, dy2 = by - cy;
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * prec ();
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * db::epsilon;
area_type p1 = dx1 * dx2;
area_type p2 = -dy1 * dy2;
if (p1 <= p2 - pa) {
@ -440,7 +450,7 @@ struct coord_traits<double>
{
double dx1 = ax - cx, dy1 = ay - cy;
double dx2 = bx - cx, dy2 = by - cy;
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * prec ();
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * db::epsilon;
area_type p1 = dx1 * dx2;
area_type p2 = -dy1 * dy2;
if (p1 <= p2 - pa) {
@ -463,7 +473,7 @@ struct coord_traits<double>
{
double dx1 = ax - cx, dy1 = ay - cy;
double dx2 = bx - cx, dy2 = by - cy;
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * prec ();
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * db::epsilon;
area_type p1 = dx1 * dy2;
area_type p2 = dy1 * dx2;
if (p1 <= p2 - pa) {
@ -479,7 +489,7 @@ struct coord_traits<double>
{
double dx1 = ax - cx, dy1 = ay - cy;
double dx2 = bx - cx, dy2 = by - cy;
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * prec ();
double pa = (sqrt (dx1 * dx1 + dy1 * dy1) + sqrt (dx2 * dx2 + dy2 * dy2)) * db::epsilon;
area_type p1 = dx1 * dy2;
area_type p2 = dy1 * dx2;
if (p1 <= p2 - pa) {
@ -537,16 +547,6 @@ struct cast_op
}
};
/**
* @brief A generic constant describing the "fuzzyness" of a double comparison of a value around 1
*/
const double epsilon = 1e-10;
/**
* @brief A generic constant describing the "fuzzyness" of a float comparison of a value around 1
*/
const double fepsilon = 1e-6;
/**
* @brief A functor wrapping the epsilon constant in a templatized form
*/