5 #ifndef _SPICA_NORMAL3D_DETAIL_H_
6 #define _SPICA_NORMAL3D_DETAIL_H_
15 Normal3_<T>::Normal3_()
22 Normal3_<T>::Normal3_(T x, T y, T z)
29 Normal3_<T>::Normal3_(
const Vector3_<T>& v)
36 Normal3_<T>::Normal3_(
const Normal3_<T>& n)
43 Normal3_<T>::~Normal3_() {
47 Normal3_<T>& Normal3_<T>::operator=(
const Normal3_<T>& n) {
55 bool Normal3_<T>::operator==(
const Normal3_<T>& n)
const {
56 return (x_ == n.x_ && y_ == n.y_ && z_ == n.z_);
60 bool Normal3_<T>::operator!=(
const Normal3_<T>& n)
const {
61 return !this->operator==(n);
65 Normal3_<T> Normal3_<T>::operator-()
const {
66 return { -x_, -y_, -z_ };
70 Normal3_<T> Normal3_<T>::operator+=(
const Normal3_<T>& n) {
78 Normal3_<T> Normal3_<T>::operator-=(
const Normal3_<T>& n) {
86 Normal3_<T> Normal3_<T>::operator*=(T s) {
94 Normal3_<T> Normal3_<T>::operator/=(T s) {
95 Assertion(s != 0.0,
"Zero division!!");
96 return this->operator*=(1.0 / s);
100 T Normal3_<T>::operator[](
int i)
const {
101 Assertion(0 <= i && i <= 2,
"Index out of bounds!!");
102 if (i == 0)
return x_;
103 if (i == 1)
return y_;
108 Normal3_<T>::operator Vector3_<T>()
const {
109 return { x_, y_, z_ };
113 std::string Normal3_<T>::toString()
const {
114 std::stringstream ss;
116 ss << std::setprecision(8);
117 ss <<
"(" << x_ <<
", " << y_ <<
", " << z_ <<
")";
118 return std::move(ss.str());
122 double Normal3_<T>::norm()
const {
123 return sqrt(squaredNorm());
127 double Normal3_<T>::squaredNorm()
const {
128 return x_ * x_ + y_ * y_ + z_ * z_;
132 Normal3_<T> Normal3_<T>::normalized()
const {
133 return (*
this) / this->norm();
139 std::ostream& operator<<(std::ostream& os, const spica::Normal3_<T>& n) {
180 #endif // _SPICA_NORMAL3D_DETAIL_H_