65 Vec3f s = p - m_torus->Center();
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);
70 minorVec[1] = s.dot(m_torus->AxisDirection());
71 minorVec[0] = std::sqrt(planex * planex + planey * planey) - m_torus->MajorRadius();
72 float majorRadiusAngle = std::atan2(minorVec[1], minorVec[0]);
73 m_minorFrame.ToLocal(minorVec, &minorL);
74 param->second = std::atan2(minorL[1], minorL[0]);
75 if (m_torus->IsAppleShaped())
77 if (abs(param->second) > m_torus->AppleCutOffAngle())
82 m_torus->MajorRadius() + std::cos(majorRadiusAngle) * m_torus->MinorRadius();
83 param->first = param->first * majorRadius;
84 param->second *= m_torus->MinorRadius();
90 float vangle = v / m_torus->MinorRadius();
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]);
96 minorVec[0] = m_torus->MinorRadius() * minorVec[0] + m_torus->MajorRadius();
97 minorVec[1] *= m_torus->MinorRadius();
98 Vec3f pp = minorVec[0] *
Vec3f(m_hcs[0].Data()) + minorVec[1] * m_torus->AxisDirection();
101 m_torus->MajorRadius() + std::cos(majorRadiusAngle) * m_torus->MinorRadius();
102 float uangle = u / majorRadius;
103 q.RotationRad(uangle,
104 m_torus->AxisDirection()[0],
105 m_torus->AxisDirection()[1],
106 m_torus->AxisDirection()[2]);
108 *p += m_torus->Center();
115 float vangle = v / m_torus->MinorRadius();
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]);
121 Vec3f nn = minorVec[0] *
Vec3f(m_hcs[0].Data()) + minorVec[1] * m_torus->AxisDirection();
122 minorVec[0] = m_torus->MinorRadius() * minorVec[0] + m_torus->MajorRadius();
123 minorVec[1] *= m_torus->MinorRadius();
124 Vec3f pp = minorVec[0] *
Vec3f(m_hcs[0].Data()) + minorVec[1] * m_torus->AxisDirection();
127 m_torus->MajorRadius() + std::cos(majorRadiusAngle) * m_torus->MinorRadius();
128 float uangle = u / majorRadius;
129 q.RotationRad(uangle,
130 m_torus->AxisDirection()[0],
131 m_torus->AxisDirection()[1],
132 m_torus->AxisDirection()[2]);
135 *p += m_torus->Center();
147 nframe.FromNormal(m_torus->AxisDirection());
150 for (IteratorT i = begin; i != end; ++i, ++j)
152 Vec3f s = *i - m_torus->Center();
153 float planex = s.dot(nframe[0].Data());
154 float planey = s.dot(nframe[1].Data());
155 uangles[j] = std::atan2(planey, planex);
157 minorVec[1] = s.dot(m_torus->AxisDirection());
158 minorVec[0] = std::sqrt(planex * planex + planey * planey) - m_torus->MajorRadius();
159 vangles[j] = std::atan2(minorVec[1], minorVec[0]);
160 if (m_torus->IsAppleShaped())
162 if (abs(uangles[j]) > m_torus->AppleCutOffAngle())
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));
void WrapComponents(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, float epsilon, size_t uextent, size_t vextent, MiscLib::Vector< int > *componentImg, MiscLib::Vector< std::pair< int, size_t > > *labels) const