30 bool Init(
bool binary, std::istream* i);
32 void Init(
float* array);
33 inline float Distance(
const Vec3f& p)
const;
34 inline void Normal(
const Vec3f& p,
Vec3f* n)
const;
35 inline float DistanceAndNormal(
const Vec3f& p,
Vec3f* n)
const;
36 inline float SignedDistance(
const Vec3f& p)
const;
37 inline float SignedDistanceAndNormal(
const Vec3f& p,
Vec3f* n)
const;
38 inline void Project(
const Vec3f& p,
Vec3f* pp)
const;
39 void Transform(
float scale,
const Vec3f& translate);
89 void Serialize(
bool binary, std::ostream* o)
const;
90 static size_t SerializedSize();
91 void Serialize(FILE* o)
const;
92 void Serialize(
float* array)
const;
93 static size_t SerializedFloatSize();
96 void ComputeAppleParams();
112 Vec3f s = p - m_center;
113 float spin1 = m_normal.
dot(s);
114 float spin0 = (s - spin1 * m_normal).length();
118 return abs(std::sqrt(spin0 * spin0 + spin1 * spin1) - m_rminor);
121 float minorAngle = std::atan2(spin1, spin0);
122 if (abs(minorAngle) < m_cutOffAngle)
124 return abs(std::sqrt(spin0 * spin0 + spin1 * spin1) - m_rminor);
126 spin0 += 2 * m_rmajor - m_rminor;
129 spin1 += m_appleHeight;
133 spin1 -= m_appleHeight;
135 return std::sqrt(spin0 * spin0 + spin1 * spin1);
141 Vec3f s = p - m_center, tmp;
142 float spin1 = m_normal.
dot(s);
143 float spin0 = (s - (tmp = spin1 * m_normal)).length();
147 float minorAngle = std::atan2(spin1, spin0);
148 if (abs(minorAngle) > m_cutOffAngle)
158 Vec3f pln = s.cross(m_normal);
161 *n = spin0 * plx + tmp;
162 *n /= std::sqrt(spin0 * spin0 + spin1 * spin1);
168 Vec3f s = p - m_center, tmp;
169 float spin1 = m_normal.
dot(s);
170 float spin0 = (s - (tmp = spin1 * m_normal)).length();
174 float minorAngle = std::atan2(spin1, spin0);
175 if (abs(minorAngle) > m_cutOffAngle)
182 spin0 += 2 * m_rmajor - m_rminor;
185 spin1 += m_appleHeight;
189 spin1 -= m_appleHeight;
191 return std::sqrt(spin0 * spin0 + spin1 * spin1);
194 Vec3f pln = s.cross(m_normal);
197 *n = spin0 * plx + tmp;
198 float d = std::sqrt(spin0 * spin0 + spin1 * spin1);
200 return abs(d - m_rminor);
206 Vec3f s = p - m_center;
207 float spin1 = m_normal.
dot(s);
208 float spin0 = (s - spin1 * m_normal).length();
212 return std::sqrt(spin0 * spin0 + spin1 * spin1) - m_rminor;
215 float minorAngle = std::atan2(spin1, spin0);
216 if (abs(minorAngle) < m_cutOffAngle)
218 return std::sqrt(spin0 * spin0 + spin1 * spin1) - m_rminor;
220 spin0 += 2 * m_rmajor - m_rminor;
223 spin1 += m_appleHeight;
227 spin1 -= m_appleHeight;
229 return -std::sqrt(spin0 * spin0 + spin1 * spin1);
235 Vec3f s = p - m_center, tmp;
236 float spin1 = m_normal.
dot(s);
237 float spin0 = (s - (tmp = spin1 * m_normal)).length();
241 float minorAngle = std::atan2(spin1, spin0);
242 if (abs(minorAngle) > m_cutOffAngle)
249 spin0 += 2 * m_rmajor - m_rminor;
252 spin1 += m_appleHeight;
256 spin1 -= m_appleHeight;
258 return -std::sqrt(spin0 * spin0 + spin1 * spin1);
261 Vec3f pln = s.cross(m_normal);
264 *n = spin0 * plx + tmp;
265 float d = std::sqrt(spin0 * spin0 + spin1 * spin1);
273 Vec3f s = p - m_center, tmp;
274 float spin1 = m_normal.
dot(s);
275 float spin0 = (s - (tmp = spin1 * m_normal)).length();
279 float minorAngle = std::atan2(spin1, spin0);
280 if (abs(minorAngle) > m_cutOffAngle)
286 Vec3f pln = s.cross(m_normal);
289 float d = std::sqrt(spin0 * spin0 + spin1 * spin1);
290 *pp = m_center + (m_rminor / d) * (spin0 * plx + tmp) + m_rmajor * plx;
static ScalarT Sign(ScalarT s)
bool IsAppleShaped() const
const Vec3f & Center() const
float SignedDistance(const Vec3f &p) const
bool LeastSquaresFit(const PointCloud &pc, MiscLib::Vector< size_t >::const_iterator begin, MiscLib::Vector< size_t >::const_iterator end)
void Normal(const Vec3f &p, Vec3f *n) const
const float MajorRadius() const
void Project(const Vec3f &p, Vec3f *pp) const
const Vec3f & AxisDirection() const
float DistanceAndNormal(const Vec3f &p, Vec3f *n) const
float AppleCutOffAngle() const
bool Fit(const PointCloud &pc, MiscLib::Vector< size_t >::const_iterator begin, MiscLib::Vector< size_t >::const_iterator end)
float Distance(const Vec3f &p) const
const float MinorRadius() const
float SignedDistanceAndNormal(const Vec3f &p, Vec3f *n) const
Vec3f cross(const Vec3f &v) const
float dot(const Vec3f &v) const