8 m_minorFrame.Canonical();
16 m_minorFrame.Canonical();
39 for (
size_t u = 0; u < uextent; ++u)
41 if (!(*componentImg)[u])
46 if ((*componentImg)[(vextent - 1) * uextent + u])
48 (*componentImg)[u], (*componentImg)[(vextent - 1) * uextent + u], &tempLabels);
49 if (u > 0 && u < uextent - 1 && (*componentImg)[(vextent - 1) * uextent + u + 1])
51 (*componentImg)[(vextent - 1) * uextent + u + 1],
53 if (u > 0 && (*componentImg)[(vextent - 1) * uextent + u - 1])
55 (*componentImg)[(vextent - 1) * uextent + u - 1],
61 float minorRot = MinorFrameRotation();
62 float ustartPrev, uendPrev, ustart = 0, uend = 0, ustartNext = 0, uendNext = 0;
63 size_t usPrev, uePrev, us = 0, ue = 0, usNext = 0, ueNext = 0;
64 float vangle = (bbox.
Min()[1] + .5f * epsilon) / m_torus->
MinorRadius();
71 (
size_t)
std::max((intptr_t)0, (intptr_t)((ustartNext - bbox.
Min()[0]) / epsilon)));
74 std::min((intptr_t)uextent - 1, (intptr_t)((uendNext - bbox.
Min()[0]) / epsilon)));
75 for (
size_t v = 0;
v < vextent; ++
v)
88 float vangle = ((
v + 1.5f) * epsilon + bbox.
Min()[1]) / m_torus->
MinorRadius();
95 (
size_t)
std::max((intptr_t)0, (intptr_t)((ustartNext - bbox.
Min()[0]) / epsilon)));
98 std::min((intptr_t)uextent - 1, (intptr_t)((uendNext - bbox.
Min()[0]) / epsilon)));
100 if (ustart <= bbox.
Min()[0] - epsilon || uend >= bbox.
Max()[0] + epsilon ||
101 !(*componentImg)[
v * uextent + us])
106 if ((*componentImg)[
v * uextent + ue])
108 (*componentImg)[
v * uextent + us], (*componentImg)[
v * uextent + ue], &tempLabels);
109 if (
v > 0 && ustartPrev > bbox.
Min()[0] - epsilon && uendPrev < bbox.
Min()[0] + epsilon &&
110 (*componentImg)[(
v - 1) * uextent + uePrev])
112 (*componentImg)[(
v - 1) * uextent + uePrev],
114 if (v < vextent - 1 && ustartNext > bbox.
Min()[0] - epsilon &&
115 uendNext < bbox.
Min()[0] + epsilon && (*componentImg)[(
v + 1) * uextent + ueNext])
117 (*componentImg)[(
v + 1) * uextent + ueNext],
122 for (
size_t i = tempLabels.
size() - 1; i > 0; --i)
128 labels->reserve(condensed.
size());
130 for (
size_t i = 0; i < tempLabels.
size(); ++i)
131 if (i == tempLabels[i].first)
133 labels->push_back(std::make_pair(count, tempLabels[i].second));
134 condensed[i] = count;
138 (*labels)[condensed[tempLabels[i].first]].second += tempLabels[i].second;
140 for (
size_t i = 0; i < componentImg->
size(); ++i)
141 (*componentImg)[i] = condensed[tempLabels[(*componentImg)[i]].first];
147 return 2 *
sizeof(
float);
156 rot = MajorFrameRotation();
157 o->write((
char*)&rot,
sizeof(rot));
158 rot = MinorFrameRotation();
159 o->write((
char*)&rot,
sizeof(rot));
163 *o << MajorFrameRotation() <<
" " << MinorFrameRotation() <<
" ";
170 float majorRot, minorRot;
173 i->read((
char*)&majorRot,
sizeof(majorRot));
174 i->read((
char*)&minorRot,
sizeof(minorRot));
178 *i >> majorRot >> minorRot;
182 nframe.RotateOnNormal(majorRot);
183 m_hcs[0] = nframe[0];
184 m_hcs[1] = nframe[1];
185 m_minorFrame.Canonical();
186 m_minorFrame.RotateFrame(minorRot);
190 LowStretchTorusParametrization::MinorFrameRotation()
const
197 LowStretchTorusParametrization::MajorFrameRotation()
const
203 nframe.ToTangent(m_hcs[0], &t);
204 for (
unsigned int i = 0; i < 2; ++i)
208 return std::atan2(t[1], t[0]);