67 a[0 + 0 * 3] = tetra[0 + 1 * 3] - tetra[0 + 0 * 3];
68 a[0 + 1 * 3] = tetra[1 + 1 * 3] - tetra[1 + 0 * 3];
69 a[0 + 2 * 3] = tetra[2 + 1 * 3] - tetra[2 + 0 * 3];
70 a[0 + 3 * 3] = std::pow(tetra[0 + 1 * 3] - tetra[0 + 0 * 3], 2) +
71 std::pow(tetra[1 + 1 * 3] - tetra[1 + 0 * 3], 2) +
72 std::pow(tetra[2 + 1 * 3] - tetra[2 + 0 * 3], 2);
74 a[1 + 0 * 3] = tetra[0 + 2 * 3] - tetra[0 + 0 * 3];
75 a[1 + 1 * 3] = tetra[1 + 2 * 3] - tetra[1 + 0 * 3];
76 a[1 + 2 * 3] = tetra[2 + 2 * 3] - tetra[2 + 0 * 3];
77 a[1 + 3 * 3] = std::pow(tetra[0 + 2 * 3] - tetra[0 + 0 * 3], 2) +
78 std::pow(tetra[1 + 2 * 3] - tetra[1 + 0 * 3], 2) +
79 std::pow(tetra[2 + 2 * 3] - tetra[2 + 0 * 3], 2);
81 a[2 + 0 * 3] = tetra[0 + 3 * 3] - tetra[0 + 0 * 3];
82 a[2 + 1 * 3] = tetra[1 + 3 * 3] - tetra[1 + 0 * 3];
83 a[2 + 2 * 3] = tetra[2 + 3 * 3] - tetra[2 + 0 * 3];
84 a[2 + 3 * 3] = std::pow(tetra[0 + 3 * 3] - tetra[0 + 0 * 3], 2) +
85 std::pow(tetra[1 + 3 * 3] - tetra[1 + 0 * 3], 2) +
86 std::pow(tetra[2 + 3 * 3] - tetra[2 + 0 * 3], 2);
97 for (
size_t i = 0; i <
DIM_NUM; ++i)
107 *r = 0.5 *
std::sqrt(
a[0 + 3 * 3] *
a[0 + 3 * 3] +
a[1 + 3 * 3] *
a[1 + 3 * 3] +
108 a[2 + 3 * 3] *
a[2 + 3 * 3]);
110 pc[0] = tetra[0 + 0 * 3] + 0.5 *
a[0 + 3 * 3];
111 pc[1] = tetra[1 + 0 * 3] + 0.5 *
a[1 + 3 * 3];
112 pc[2] = tetra[2 + 0 * 3] + 0.5 *
a[2 + 3 * 3];
122 float d1343, d4321, d1321, d4343, d2121;
123 float numer, denom, mua, mub;
128 d1343 = p13[0] * n2[0] + p13[1] * n2[1] + p13[2] * n2[2];
129 d4321 = n2[0] * n1[0] + n2[1] * n1[1] + n2[2] * n1[2];
130 d1321 = p13[0] * n1[0] + p13[1] * n1[1] + p13[2] * n1[2];
131 d4343 = n2[0] * n2[0] + n2[1] * n2[1] + n2[2] * n2[2];
132 d2121 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2];
134 denom = d2121 * d4343 - d4321 * d4321;
135 if (
abs(denom) < 1e-6)
139 numer = d1343 * d4321 - d1321 * d4343;
142 mub = (d1343 + d4321 * (mua)) / d4343;
147 *mid = 0.5f * (pa + pb);
165 if (!
Init(p1, p2, p3, p4))
174 if (samples.
size() < 4)
179 size_t c = samples.
size() / 2;
180 m_center =
Vec3f(0, 0, 0);
182 for (
size_t i = 0; i <
c - 1; ++i)
183 for (
size_t j = i + 1; j <
c; ++j)
186 if (!
Midpoint(samples[i], samples[i +
c], samples[j], samples[j +
c], &mid))
197 m_center /= midCount;
199 for (
size_t i = 0; i <
c; ++i)
201 float d = (samples[i] - m_center).length();
213 for (
size_t i = 0; i < 3; ++i)
215 tetra[0 * 3 + i] = p1[i];
217 for (
size_t i = 0; i < 3; ++i)
219 tetra[1 * 3 + i] = p2[i];
221 for (
size_t i = 0; i < 3; ++i)
223 tetra[2 * 3 + i] = p3[i];
225 for (
size_t i = 0; i < 3; ++i)
227 tetra[3 * 3 + i] = p4[i];
252 float d1343, d4321, d1321, d4343, d2121;
253 float numer, denom, mua, mub;
258 d1343 = p13[0] * n2[0] + p13[1] * n2[1] + p13[2] * n2[2];
259 d4321 = n2[0] * n1[0] + n2[1] * n1[1] + n2[2] * n1[2];
260 d1321 = p13[0] * n1[0] + p13[1] * n1[1] + p13[2] * n1[2];
261 d4343 = n2[0] * n2[0] + n2[1] * n2[1] + n2[2] * n2[2];
262 d2121 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2];
264 denom = d2121 * d4343 - d4321 * d4321;
265 if (
abs(denom) < 1e-6)
269 numer = d1343 * d4321 - d1321 * d4343;
272 mub = (d1343 + d4321 * (mua)) / d4343;
279 m_center = 0.5f * (pa + pb);
281 float da = (p1 - m_center).length();
282 float db = (p2 - m_center).length();
283 m_radius = 0.5f * (da + db);
286 float dev = da / m_radius;
287 if (dev < 0.9f || dev > 1.1f)
292 if (dev < 0.9f || dev > 1.1f)
297 dev = (pa - pb).length() / m_radius;
310 i->read((
char*)&m_center,
sizeof(m_center));
311 i->read((
char*)&m_radius,
sizeof(m_radius));
315 for (
size_t j = 0; j < 3; ++j)
327 fread(&m_center,
sizeof(m_center), 1, i);
328 fread(&m_radius,
sizeof(m_radius), 1, i);
334 for (
int i = 0; i < 3; i++)
336 m_center[i] = array[i];
365 float s =
x[0] - param[0];
367 for (
unsigned int i = 1; i < 3; ++i)
369 float ss =
x[i] - param[i];
379 s[0] =
x[0] - param[0];
380 float sl =
s[0] *
s[0];
381 for (
unsigned int i = 1; i < 3; ++i)
383 s[i] =
x[i] - param[i];
387 gradient[0] = -
s[0] / sl;
388 gradient[1] = -
s[1] / sl;
389 gradient[2] = -
s[2] / sl;
415 for (
size_t i = 0; i < spheres.
size(); ++i)
417 center += weights[i] * spheres[i].Center();
418 radius += weights[i] * spheres[i].Radius();
430 o->write((
const char*)&m_center,
sizeof(m_center));
431 o->write((
const char*)&m_radius,
sizeof(m_radius));
435 (*o) << m_center[0] <<
" " << m_center[1] <<
" " << m_center[2] <<
" " << m_radius <<
" ";
442 return sizeof(
Vec3f) +
sizeof(
float);
454 fwrite(&m_center,
sizeof(m_center), 1, o);
455 fwrite(&m_radius,
sizeof(m_radius), 1, o);
461 for (
int i = 0; i < 3; i++)
463 array[i] = m_center[i];
472 m_center += translate;
477 const Vec3f& planeNormal) :
478 m_sphere(sphere), m_planeNormal(planeNormal), m_hcs(
GfxTL::
Vector3Df(planeNormal))
486 m_planeNormal = planeNormal;
487 m_hcs.FromNormal(planeNormal[0], planeNormal[1], planeNormal[2]);
497 hs[0] =
s.dot(m_hcs[0].Data());
498 hs[1] =
s.dot(m_hcs[1].Data());
499 hs[2] =
s.dot(m_planeNormal);
502 std::pair<float, float> inDisk;
503 Hemisphere2Disk(hs, &inDisk);
504 Disk2Square(inDisk, param);
513 if (param.first < -0.1 || param.first > 1.1 || param.second < -0.1 || param.second > 1.1)
517 std::pair<float, float> clampedParam;
520 std::pair<float, float> inDisk;
521 Square2Disk(clampedParam, &inDisk);
523 Disk2Hemisphere(inDisk, &
s);
524 *p =
Vec3f((
s[0] * m_hcs[0] +
s[1] * m_hcs[1] +
538 if (param.first < -0.1 || param.first > 1.1 || param.second < -0.1 || param.second > 1.1)
542 std::pair<float, float> clampedParam;
545 std::pair<float, float> inDisk;
546 Square2Disk(clampedParam, &inDisk);
548 Disk2Hemisphere(inDisk, &
s);
554 *p = m_sphere.
Radius() * (*n);
566 m_hcs[0] = rot * m_hcs[0];
567 m_hcs[1] = rot * m_hcs[1];
581 SphereAsSquaresParametrization::Hemisphere2Disk(
const Vec3f& p,
582 std::pair<float, float>* inDisk)
const
585 inDisk->second = std::atan2(p[1], p[0]);
589 SphereAsSquaresParametrization::Disk2Square(
const std::pair<float, float>& inDisk,
590 std::pair<float, float>* inSquare)
const
592 float r = inDisk.first;
593 float phi = inDisk.second;
596 if (phi <
float(-
M_PI / 4.0))
601 if (phi <
float(
M_PI / 4.0))
606 else if (phi <
float(3 *
M_PI / 4.0))
611 else if (phi <
float(5 *
M_PI / 4.0))
622 inSquare->first = (
a +
float(1.0)) /
float(2.0);
623 inSquare->second = (b +
float(1.0)) /
float(2.0);
627 SphereAsSquaresParametrization::Square2Disk(
const std::pair<float, float>& inSquare,
628 std::pair<float, float>* inDisk)
const
631 float a = 2 * inSquare.first - 1;
632 float b = 2 * inSquare.second - 1;
669 inDisk->second = phi;
673 SphereAsSquaresParametrization::Disk2Hemisphere(
const std::pair<float, float>& inDisk,
676 (*p)[0] = inDisk.first *
std::sqrt(2 - inDisk.first * inDisk.first) * std::cos(inDisk.second);
677 (*p)[1] = inDisk.first *
std::sqrt(2 - inDisk.first * inDisk.first) * std::sin(inDisk.second);
678 (*p)[2] = 1 - inDisk.first * inDisk.first;