30 bool Init(
bool binary, std::istream* i);
32 void Init(
float* array);
33 inline float Distance(
const Vec3f& p)
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);
74 return LeastSquaresFit(
pc, begin, end);
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();
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);
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;