Sprout/sprout/complex/values.hpp

81 lines
2.3 KiB
C++
Raw Normal View History

2013-08-08 09:54:33 +00:00
/*=============================================================================
2014-01-08 07:48:12 +00:00
Copyright (c) 2011-2014 Bolero MURAKAMI
2013-08-08 09:54:33 +00:00
https://github.com/bolero-MURAKAMI/Sprout
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
2012-08-28 16:16:12 +00:00
#ifndef SPROUT_COMPLEX_VALUES_HPP
#define SPROUT_COMPLEX_VALUES_HPP
#include <sprout/config.hpp>
#include <sprout/complex/complex.hpp>
#include <sprout/complex/operators.hpp>
#include <sprout/math/sin.hpp>
#include <sprout/math/cos.hpp>
#include <sprout/math/atan2.hpp>
#include <sprout/math/sqrt.hpp>
namespace sprout {
template<typename T>
2012-10-05 15:58:56 +00:00
SPROUT_CONSTEXPR T
norm(sprout::complex<T> const& x);
2012-08-28 16:16:12 +00:00
// 26.4.7, values:
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR T
real(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return x.real();
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR T
imag(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return x.imag();
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR T
abs(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return sprout::sqrt(sprout::norm(x));
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR T
arg(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return sprout::atan2(x.imag(), x.real());
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR T
norm(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return x.real() * x.real() + x.imag() * x.imag();
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR sprout::complex<T>
conj(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return sprout::complex<T>(x.real(), -x.imag());
}
namespace detail {
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR sprout::complex<T>
proj_impl(sprout::complex<T> const& x, T const& den) {
2012-08-28 16:16:12 +00:00
return sprout::complex<T>(
T(2) * x.real() / den,
T(2) * x.imag() / den
);
}
} // detail
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR sprout::complex<T>
proj(sprout::complex<T> const& x) {
2012-08-28 16:16:12 +00:00
return sprout::detail::proj_impl(
x,
sprout::norm(x) + T(1)
);
}
template<typename T>
2012-10-05 15:58:56 +00:00
inline SPROUT_CONSTEXPR sprout::complex<T>
polar(T const& rho, T const& theta = 0) {
2012-08-28 16:16:12 +00:00
return sprout::complex<T>(rho * sprout::cos(theta), rho * sprout::sin(theta));
}
} // namespace sprout
#endif // #ifndef SPROUT_COMPLEX_VALUES_HPP