59 explicit operator T()
const
94 return reference + (*
this - reference).
wrapped();
101 return a.value_ +
b.value_;
106 return a.value_ -
b.value_;
111 return a.value_ *
b.value_;
116 return a.value_ /
b.value_;
152 return stream <<
"AngleRadian(" <<
rot.value_ <<
")";
219 explicit operator T()
const
267 return {a.cos_ *
b.cos_ - a.sin_ *
b.sin_, a.sin_ *
b.cos_ + a.cos_ *
b.sin_};
272 return {a.cos_ *
b.cos_ + a.sin_ *
b.sin_, a.sin_ *
b.cos_ - a.cos_ *
b.sin_};
278 return {a.cos_ * a.cos_ - a.sin_ * a.sin_,
T(2) * a.sin_ * a.cos_};
281 return {
T(4) * (a.cos_ * a.cos_ * a.cos_) -
T(3) * a.cos_,
282 T(3) * a.sin_ -
T(4) * (a.sin_ * a.sin_ * a.sin_)};
285 "Arbitrary angle product isn't supported with AngleCartesianBase<T> for "
286 "performance reason. Use AngleRadianBase<T> instead.");
297 if (divisor ==
T(2)) {
305 result.sin_ = -result.sin_;
310 "Arbitrary angle quotient isn't supported with AngleCartesianBase<T> for "
311 "performance reason. Use AngleRadianBase<T> instead.");
317 return {a.cos_, -a.sin_};
348 return stream <<
"AngleCartesian(x=" <<
rot.cos_ <<
", y=" <<
rot.sin_ <<
")";
388 : numerator_(numerator), denominator_(denominator){};
413 return T(numerator_ * 180) /
T(denominator_);
422 if (
abs(numerator_) == denominator_ * 2) {
425 if (
abs(numerator_) == denominator_) {
428 if (numerator_ == 0) {
431 if (
abs(numerator_) * 2 == denominator_) {
434 if (
abs(numerator_) * 4 == denominator_) {
438 const int64_t number_of_pi = numerator_ / denominator_;
439 const int64_t slice_numerator = numerator_ - number_of_pi * denominator_;
443 if (slice_numerator > 0xFFFFFFFF || denominator_ > 0xFFFFFFFF) {
445 slice_of_pi =
T(
numbers::pi) * slice_numerator /
T(denominator_);
449 slice_of_pi =
T(slice_numerator * 80143857) /
T(denominator_ * 25510582);
462 if (
abs(numerator_) <= denominator_) {
465 return {
mod_periodic(numerator_ + denominator_, denominator_ * 2) - denominator_,
477 return reference + (*
this - reference).
wrapped();
489 if (a.denominator_ ==
b.denominator_) {
490 return {a.numerator_ +
b.numerator_, a.denominator_};
492 return {(a.numerator_ *
b.denominator_) + (
b.numerator_ * a.denominator_),
493 a.denominator_ *
b.denominator_};
503 return {a.numerator_ *
b.numerator_, a.denominator_ *
b.denominator_};
538 return {-a.numerator_, a.denominator_};
543 return *
this = *
this +
b;
548 return *
this = *
this -
b;
553 return *
this = *
this *
b;
558 return *
this = *
this /
b;
563 return *
this = *
this *
b;
568 return *
this = *
this /
b;
573 if (a.numerator_ == 0 &&
b.numerator_ == 0) {
576 if (a.denominator_ ==
b.denominator_) {
577 return a.numerator_ ==
b.numerator_;
579 return a.numerator_ *
b.denominator_ ==
b.numerator_ * a.denominator_;
589 return stream <<
"AngleFraction(num=" <<
rot.numerator_ <<
", denom=" <<
rot.denominator_
611 a.numerator_ =
abs(a.numerator_) * 4;
613 const int64_t octant = a.numerator_ / a.denominator_;
614 const int64_t rest = a.numerator_ - octant * a.denominator_;
649 a.numerator_ = a.denominator_ / 2 - a.numerator_;
653 a.numerator_ = a.numerator_ - a.denominator_ / 2;
657 a.numerator_ = a.denominator_ - a.numerator_;
663 BLI_assert(a.numerator_ >= 0 && a.numerator_ <= a.denominator_ / 4);
668 if (
ELEM(octant, 1, 2)) {
686 return cos(a.radian());
690 return sin(a.radian());
694 return tan(a.radian());
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define BLI_STRUCT_EQUALITY_OPERATORS_1(Type, m)
#define BLI_STRUCT_EQUALITY_OPERATORS_2(Type, m1, m2)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
local_group_size(16, 16) .push_constant(Type b
T cos(const AngleRadianBase< T > &a)
bool is_negative(const MatBase< T, Size, Size > &mat)
T atan2(const T &y, const T &x)
T mod_periodic(const T &a, const T &b)
T sin(const AngleRadianBase< T > &a)
T tan(const AngleRadianBase< T > &a)
friend AngleCartesianBase operator*(const AngleCartesianBase &a, const T &b)
static AngleCartesianBase identity()
friend AngleCartesianBase operator/(const AngleCartesianBase &a, const T &divisor)
AngleCartesianBase(const AngleRadianBase< T > &angle)
AngleCartesianBase & operator+=(const AngleCartesianBase &b)
static AngleCartesianBase from_degree(const T °rees)
AngleCartesianBase(const T &radian)
friend AngleCartesianBase operator-(const AngleCartesianBase &a)
AngleCartesianBase & operator/=(const T &b)
AngleCartesianBase & operator-=(const AngleCartesianBase &b)
AngleCartesianBase & operator*=(const T &b)
AngleCartesianBase()=default
friend AngleCartesianBase operator-(const AngleCartesianBase &a, const AngleCartesianBase &b)
friend AngleCartesianBase operator+(const AngleCartesianBase &a, const AngleCartesianBase &b)
friend AngleCartesianBase operator*(const T &b, const AngleCartesianBase &a)
AngleCartesianBase(const T &x, const T &y)
static AngleCartesianBase from_point(const T &x, const T &y)
friend AngleFraction operator+(const AngleFraction &a, const AngleFraction &b)
friend AngleFraction operator/(const AngleFraction &a, const int64_t &b)
static AngleFraction pi()
AngleFraction & operator*=(const AngleFraction &b)
static AngleFraction identity()
AngleFraction wrapped_around(const AngleFraction &reference) const
AngleFraction & operator*=(const int64_t &b)
friend AngleFraction operator-(const AngleFraction &a, const AngleFraction &b)
friend bool operator!=(const AngleFraction &a, const AngleFraction &b)
AngleFraction & operator/=(const int64_t &b)
friend bool operator==(const AngleFraction &a, const AngleFraction &b)
friend AngleFraction operator*(const AngleFraction &a, const int64_t &b)
friend AngleFraction operator/(const AngleFraction &a, const AngleFraction &b)
static AngleFraction tau()
friend AngleFraction operator*(const AngleFraction &a, const AngleFraction &b)
AngleFraction & operator+=(const AngleFraction &b)
friend AngleFraction operator+(const AngleFraction &a)
AngleFraction & operator-=(const AngleFraction &b)
AngleFraction & operator/=(const AngleFraction &b)
AngleFraction wrapped() const
friend AngleFraction operator*(const int64_t &a, const AngleFraction &b)
friend AngleFraction operator-(const AngleFraction &a)
friend AngleFraction operator/(const int64_t &a, const AngleFraction &b)
friend std::ostream & operator<<(std::ostream &stream, const AngleFraction &rot)
AngleRadianBase(const T &radian)
static AngleRadianBase identity()
AngleRadianBase wrapped_around(const AngleRadianBase &reference) const
friend AngleRadianBase operator-(const AngleRadianBase &a)
friend AngleRadianBase operator/(const AngleRadianBase &a, const AngleRadianBase &b)
friend AngleRadianBase operator*(const AngleRadianBase &a, const AngleRadianBase &b)
friend AngleRadianBase operator+(const AngleRadianBase &a, const AngleRadianBase &b)
AngleRadianBase & operator+=(const AngleRadianBase &b)
AngleRadianBase wrapped() const
static AngleRadianBase from_degree(const T °rees)
friend AngleRadianBase operator-(const AngleRadianBase &a, const AngleRadianBase &b)
AngleRadianBase & operator*=(const AngleRadianBase &b)
AngleRadianBase & operator/=(const AngleRadianBase &b)
AngleRadianBase(const T &cos, const T &sin)
AngleRadianBase()=default
AngleRadianBase & operator-=(const AngleRadianBase &b)