37 if (bbox.
Max()[1] - bbox.
Min()[1] >= 2 *
M_PI * m_torus->MinorRadius() - 2 * epsilon)
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();
66 m_torus->MajorRadius() + std::cos(vangle + minorRot) * m_torus->MinorRadius();
71 (
size_t)std::max((intptr_t)0, (intptr_t)((ustartNext - bbox.
Min()[0]) / epsilon)));
72 ueNext = (size_t)std::max(
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();
90 m_torus->MajorRadius() + std::cos(vangle + minorRot) * m_torus->MinorRadius();
95 (
size_t)std::max((intptr_t)0, (intptr_t)((ustartNext - bbox.
Min()[0]) / epsilon)));
96 ueNext = (size_t)std::max(
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];