1 #ifndef LOWSTRETCHSPHEREPARAMETRIZATION_HEADER
2 #define LOWSTRETCHSPHEREPARAMETRIZATION_HEADER
25 inline void Parameters(
const Vec3f& p, std::pair<float, float>* param)
const;
45 template <
class IteratorT>
46 void Optimize(IteratorT begin, IteratorT end,
float epsilon);
48 void Serialize(std::ostream* o,
bool binary)
const;
60 float slength =
s.length();
69 param->first = std::acos(l[2]) * m_sphere->
Radius();
70 param->second = std::atan2(l[1], l[0]) * radius;
76 float uangle = u / m_sphere->
Radius();
77 float cosu = std::cos(uangle);
78 float sinu = std::sin(uangle);
79 float radius = sinu * m_sphere->
Radius();
80 float vangle =
v / radius;
81 float sinv = std::sin(vangle);
82 float cosv = std::cos(vangle);
92 float uangle = u / m_sphere->
Radius();
93 float cosu = std::cos(uangle);
94 float sinu = std::sin(uangle);
95 float radius = sinu * m_sphere->
Radius();
96 float vangle =
v / radius;
97 float sinv = std::sin(vangle);
98 float cosv = std::cos(vangle);
106 template <
class IteratorT>
114 float minUangle =
float(
M_PI), maxUangle = 0;
115 if (end - begin <= 1)
119 for (IteratorT i = begin; i != end; ++i)
122 float slength =
s.length();
129 float uangle = std::acos(h);
130 if (minUangle > uangle)
134 if (maxUangle < uangle)
139 float centerUangle = (minUangle + maxUangle) / 2;
143 -2 * (centerUangle -
float(
M_PI / 2)), m_frame[0][0], m_frame[0][1], m_frame[0][2]);
145 q.Rotate(m_frame[2], &newNormal);
146 m_frame.FromNormal(newNormal);
151 for (IteratorT i = begin; i != end; ++i)
154 float slength =
s.length();
162 float uangle = std::acos(l[2]);
163 if (uangle * m_sphere->
Radius() <
float(
M_PI) * m_sphere->
Radius() - 2 * epsilon &&
164 uangle * m_sphere->
Radius() >
float(-
M_PI) * m_sphere->
Radius() + 2 * epsilon)
166 vangles.
push_back(std::atan2(l[1], l[0]));
169 std::sort(vangles.
begin(), vangles.
end());
173 for (
size_t i = 1; i < vangles.
size(); ++i)
175 float gap = vangles[i] - vangles[i - 1];
179 lower = vangles[i - 1];
185 float rotationAngle = (lower + upper) / 2;
186 m_frame.RotateOnNormal(rotationAngle +
float(
M_PI));