1 #ifndef LOWSTRETCHTORUSPARAMETRIZATION_HEADER
2 #define LOWSTRETCHTORUSPARAMETRIZATION_HEADER
26 inline void Parameters(
const Vec3f& p, std::pair<float, float>* param)
const;
46 template <
class IteratorT>
47 void Optimize(IteratorT begin, IteratorT end,
float epsilon);
49 void Serialize(std::ostream* o,
bool binary)
const;
53 float MinorFrameRotation()
const;
54 float MajorFrameRotation()
const;
66 float planex =
s.dot(m_hcs[0].Data());
67 float planey =
s.dot(m_hcs[1].Data());
68 param->first = std::atan2(planey, planex);
72 float majorRadiusAngle = std::atan2(minorVec[1], minorVec[0]);
73 m_minorFrame.ToLocal(minorVec, &minorL);
74 param->second = std::atan2(minorL[1], minorL[0]);
83 param->first = param->first * majorRadius;
92 minorL[0] = std::cos(vangle);
93 minorL[1] = std::sin(vangle);
94 m_minorFrame.ToGlobal(minorL, &minorVec);
95 float majorRadiusAngle = std::atan2(minorVec[1], minorVec[0]);
102 float uangle = u / majorRadius;
103 q.RotationRad(uangle,
117 minorL[0] = std::cos(vangle);
118 minorL[1] = std::sin(vangle);
119 m_minorFrame.ToGlobal(minorL, &minorVec);
120 float majorRadiusAngle = std::atan2(minorVec[1], minorVec[0]);
128 float uangle = u / majorRadius;
129 q.RotationRad(uangle,
139 template <
class IteratorT>
150 for (IteratorT i = begin; i != end; ++i, ++j)
153 float planex =
s.dot(nframe[0].Data());
154 float planey =
s.dot(nframe[1].Data());
155 uangles[j] = std::atan2(planey, planex);
159 vangles[j] = std::atan2(minorVec[1], minorVec[0]);
166 std::sort(vangles.
begin(), vangles.
end());
167 std::sort(uangles.begin(), uangles.end());
169 float maxGap = uangles.front() + 2 *
float(
M_PI) - uangles.back();
170 float lower = uangles.back(), upper = uangles.front() + 2 *
float(
M_PI);
171 for (
size_t i = 1; i < uangles.size(); ++i)
173 float gap = uangles[i] - uangles[i - 1];
177 lower = uangles[i - 1];
182 float rotationAngle = (lower + upper) / 2;
183 nframe.RotateOnNormal(rotationAngle +
float(
M_PI));
184 m_hcs[0] = nframe[0];
185 m_hcs[1] = nframe[1];
188 lower = vangles.
back();
190 for (
size_t i = 1; i < vangles.
size(); ++i)
192 float gap = vangles[i] - vangles[i - 1];
196 lower = vangles[i - 1];
200 rotationAngle = (lower + upper) / 2;
201 m_minorFrame.Canonical();
202 m_minorFrame.RotateFrame(rotationAngle +
float(
M_PI));