Loading...
Searching...
No Matches
spherical.h
Go to the documentation of this file.
1#ifndef _BBM_SPHERICAL_H_
2#define _BBM_SPHERICAL_H_
3
4#include "core/vec.h"
5#include "core/constants.h"
6#include "core/transform.h"
7
8/***********************************************************************/
9/*! \file spherical.h
10 \brief Methods for handling spherical coordinates
11
12 Methods for working with spherical coordinates stored in a Vec2d,
13 including conversion methods to Vec3d and common trig operations.
14************************************************************************/
15
16namespace bbm {
17
18 namespace spherical {
19
20 ////////////////////////////
21 //! @{ \name Theta access
22 ////////////////////////////
23 template<typename T> T& theta(vec2d<T>& v) { return v[1]; }
24 template<typename T> const T& theta(const vec2d<T>& v) { return v[1]; }
25
26 template<typename T> T theta(const vec3d<T>& v)
27 {
28 auto diff(v);
29 vec::z(diff) -= bbm::sign(vec::z(v));
30 auto temp = 2.0 * bbm::asin(0.5 * bbm::norm(diff));
31 return bbm::select( vec::z(v) >= 0, temp, constants<T>::Pi() - temp );
32 }
33 //! @}
34
35
36 //////////////////////////
37 //! @{ \name Phi access
38 //////////////////////////
39 template<typename T> T& phi(vec2d<T>& v) { return v[0]; }
40 template<typename T> const T& phi(const vec2d<T>& v) { return v[0]; }
41
42 template<typename T> T phi(const vec3d<T>& v)
43 {
44 T result = atan2( vec::y(v), vec::x(v) );
45 return bbm::select(result < 0, result + constants<T>::Pi(2), result);
46 }
47 //! @}
48
49 ///////////////////////////
50 //! @{ \name Conversion
51 ///////////////////////////
52 template<typename T>
53 vec2d<T> convert(const vec3d<T>& v)
54 {
55 return vec2d<T>(phi(v), theta(v));
56 }
57
58 template<typename T>
59 vec3d<T> convert(const vec2d<T>& v)
60 {
61 vec2d<T> cst = bbm::cossin(theta(v));
62 vec2d<T> csp = bbm::cossin(phi(v));
63
64 return vec::expand(csp*cst[1], cst[0]);
65 }
66 //! @}
67
68
69 ////////////////////////////////////////
70 // Shorthand Trigionometric Functions //
71 ////////////////////////////////////////
72
73 //! @{ \name Sine variants
74 template<typename T>
75 T sinTheta(const vec2d<T>& v) { return bbm::sin(theta(v)); }
76 template<typename T>
77 T sinTheta2(const vec2d<T>& v) { auto t = sinTheta(v); return t*t; }
78
79 template<typename T>
80 T sinTheta2(const vec3d<T>& v) { return bbm::max(1 - vec::z(v)*vec::z(v), 0); }
81
82 template<typename T>
83 T sinTheta(const vec3d<T>& v) { return bbm::sqrt(sinTheta2(v)); }
84
85 template<typename T>
86 T sinPhi(const vec2d<T>& v) { return bbm::sin(phi(v)); }
87
88 template<typename T>
89 T sinPhi(const vec3d<T>& v)
90 {
91 auto sT = sinTheta(v);
92 return bbm::select(bbm::abs(sT) < constants<T>::Epsilon(), 0, bbm::clamp(vec::y(v) / sT, -1, +1));
93 }
94
95 template<typename T>
96 T sinPhi2(const vec2d<T>& v) { auto t = sinPhi(v); return t*t; }
97
98 template<typename T>
99 T sinPhi2(const vec3d<T>& v)
100 {
101 auto sT2 = sinTheta2(v);
102 return bbm::select(bbm::abs(sT2) < constants<T>::Epsilon, 0, bbm::clamp(vec::y(v)*vec::y(v) / sT2, 0, +1));
103 }
104 //! @}
105
106
107 //! @{ \name Cosine variants
108 template<typename T>
109 T cosTheta(const vec2d<T>& v) { return bbm::cos(theta(v)); }
110
111 template<typename T>
112 T cosTheta(const vec3d<T>& v) { return vec::z(v); }
113
114 template<typename V>
115 bbm::value_t<V> cosTheta2(const V& v) { auto t = cosTheta(v); return t*t; }
116
117 template<typename T>
118 T cosPhi(const vec2d<T>& v) { return bbm::cos(phi(v)); }
119
120 template<typename T>
121 T cosPhi(const vec3d<T>& v)
122 {
123 auto sT = sinTheta(v);
124 return bbm::select(bbm::abs(sT) < constants<T>::Epsilon(), +1, bbm::clamp(vec::x(v) / sT, -1, +1));
125 }
126
127 template<typename T>
128 T cosPhi2(const vec2d<T>& v) { auto t = cosPhi(v); return t*t; }
129
130 template<typename T>
131 T cosPhi2(const vec3d<T>& v)
132 {
133 auto sT2 = sinTheta(v);
134 return bbm::select(bbm::abs(sT2) < constants<T>::Epsilon(), +1, bbm::clamp(vec::x(v)*vec::x(v) / sT2, 0, +1));
135 }
136 //! @}
137
138
139 //! @{ \name Joint Cos/Sin variants
140 template<typename T>
141 vec2d<T> cossinTheta(const vec2d<T>& v) { return bbm::cossin(theta(v)); }
142
143 template<typename T>
144 vec2d<T> cossinTheta(const vec3d<T>& v) { return vec2d<T>(cosTheta(v), sinTheta(v)); }
145
146 template<typename T>
147 vec2d<T> cossinTheta2(const vec2d<T>& v) { auto t = cossinTheta(v); return t*t; }
148
149 template<typename T>
150 vec2d<T> cossinTheta2(const vec3d<T>& v) { return vec2d<T>(sinTheta2(v), cosTheta2(v)); }
151
152 template<typename T>
153 vec2d<T> cossinPhi(const vec2d<T>& v) { return bbm::cossin(phi(v)); }
154
155 template<typename T>
156 vec2d<T> cossinPhi(const vec3d<T>& v)
157 {
158 auto sT = sinTheta(v);
159 auto rsT = bbm::rcp(sT);
160 return bbm::select(bbm::abs(sT) < constants<T>::Epsilon(), vec2d<T>(+1,0), bbm::clamp(vec::xy(v) * rsT, -1, +1));
161 }
162
163 template<typename T>
164 vec2d<T> cossinPhi2(const vec2d<T>& v) { auto t = cossinPhi(v); return t*t; }
165
166 template<typename T>
167 vec2d<T> cossinPhi2(const vec3d<T>& v)
168 {
169 auto sT2 = sinTheta2(v);
170 auto rsT2 = bbm::rcp(sT2);
171 return bbm::select(bbm::abs(sT2) < constants<T>::Epsilon(), vec2d<T>(+1,0), bbm::clamp(vec::xy(v)*vec::xy(v) * rsT2, -1, +1));
172 }
173 //! @}
174
175 //! @{ \name Tangent variants
176 template<typename T>
177 T tanTheta(const vec2d<T>& v) { return bbm::tan(theta(v)); }
178
179 template<typename T>
180 T tanTheta(const vec3d<T>& v) { return sinTheta(v) / cosTheta(v); }
181
182 template<typename T>
183 T tanTheta2(const vec2d<T>& v) { auto t = tanTheta(v); return t*t; }
184
185 template<typename T>
186 T tanTheta2(const vec3d<T>& v) { return sinTheta2(v) / cosTheta2(v); }
187
188 template<typename T>
189 T tanPhi(const vec2d<T>& v) { return bbm::tan(phi(v)); }
190
191 template<typename T>
192 T tanPhi(const vec3d<T>& v) { return vec::y(v) / vec::x(v); }
193
194 template<typename T>
195 T tanPhi2(const T& v) { auto t = tanPhi(v); return t*t; }
196 //! @}
197
198 } // end namespace spherical
199} // end namespace bbm
200
201#endif /* _BBM_SPHERICAL_H_ */
Defines additional helper methods for vectors.
T cosPhi2(const vec2d< T > &v)
Definition: spherical.h:128
vec2d< T > cossinTheta(const vec2d< T > &v)
Definition: spherical.h:141
T sinTheta(const vec2d< T > &v)
Definition: spherical.h:75
T & phi(vec2d< T > &v)
Definition: spherical.h:39
T tanTheta2(const vec2d< T > &v)
Definition: spherical.h:183
T sinTheta2(const vec2d< T > &v)
Definition: spherical.h:77
vec2d< T > cossinPhi2(const vec2d< T > &v)
Definition: spherical.h:164
vec2d< T > cossinPhi(const vec2d< T > &v)
Definition: spherical.h:153
T sinPhi2(const vec2d< T > &v)
Definition: spherical.h:96
T cosTheta(const vec2d< T > &v)
Definition: spherical.h:109
T tanTheta(const vec2d< T > &v)
Definition: spherical.h:177
T sinPhi(const vec2d< T > &v)
Definition: spherical.h:86
T cosPhi(const vec2d< T > &v)
Definition: spherical.h:118
T tanPhi(const vec2d< T > &v)
Definition: spherical.h:189
vec2d< T > convert(const vec3d< T > &v)
Definition: spherical.h:53
bbm::value_t< V > cosTheta2(const V &v)
Definition: spherical.h:115
T tanPhi2(const T &v)
Definition: spherical.h:195
T & theta(vec2d< T > &v)
Definition: spherical.h:23
vec2d< T > cossinTheta2(const vec2d< T > &v)
Definition: spherical.h:147
constexpr const vec3d< T > expand(const vec2d< T > &v, V &&a)
Definition: vec.h:55
constexpr decltype(auto) y(bbm::vec3d< T > &v)
Definition: vec.h:23
constexpr decltype(auto) z(bbm::vec3d< T > &v)
Definition: vec.h:26
constexpr decltype(auto) x(bbm::vec3d< T > &v)
Definition: vec.h:20
constexpr const vec2d< T > xy(const vec3d< T > &v)
Definition: vec.h:47
Definition: aggregatebsdf.h:29
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
Definition: constants.h:17
Basic matrix transformations.