Fixed calling the VectorH3 constructor using 3FT with underlying negative denominator(s)

If VectorH3 is constructed from 3 FT which are already decomposed in numerators
and denominators, it was possible that the product of the denominators was negative,
which gave an assertion error.

Instead, we use the same mechanism as in the constructor with 4 RT: if the common
denominator would be negative, we flip the signs.
This commit is contained in:
Mael Rouxel-Labbé 2017-04-10 16:24:13 +02:00
parent 5f8a64148a
commit 8703f5c122
1 changed files with 20 additions and 9 deletions

View File

@ -83,15 +83,26 @@ public:
: base(CGAL::make_array<RT>(x, y, z, RT(1))) {}
VectorH3(const FT& x, const FT& y, const FT& z)
: base(CGAL::make_array<RT>(
Rat_traits().numerator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z),
Rat_traits().numerator(y) * Rat_traits().denominator(x)
* Rat_traits().denominator(z),
Rat_traits().numerator(z) * Rat_traits().denominator(x)
* Rat_traits().denominator(y),
Rat_traits().denominator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z)))
: base(Rat_traits().denominator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z) >= 0 ?
CGAL::make_array<RT>(
Rat_traits().numerator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z),
Rat_traits().numerator(y) * Rat_traits().denominator(x)
* Rat_traits().denominator(z),
Rat_traits().numerator(z) * Rat_traits().denominator(x)
* Rat_traits().denominator(y),
Rat_traits().denominator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z)) :
CGAL::make_array<RT>(
- Rat_traits().numerator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z),
- Rat_traits().numerator(y) * Rat_traits().denominator(x)
* Rat_traits().denominator(z),
- Rat_traits().numerator(z) * Rat_traits().denominator(x)
* Rat_traits().denominator(y),
- Rat_traits().denominator(x) * Rat_traits().denominator(y)
* Rat_traits().denominator(z)))
{
CGAL_kernel_assertion(hw() > 0);
}